ng-cw-v12
Version:
Angular UI component library
333 lines • 53.1 kB
JavaScript
import { Component, Input } from '@angular/core';
import { trigger, style, animate, transition, state } from '@angular/animations';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class AnimateTextComponent {
constructor(elementRef) {
this.elementRef = elementRef;
/** 展示的文本内容 */
this._text = '';
/** 延迟 */
this.ncDelay = 0;
/** 动画类型 */
this.ncAnimation = 'fadeIn';
/** 动画分割方式 */
this.ncBy = 'word';
/** 每个分割块动画持续时间 */
this.ncDuration = 300;
/** 每个分割块之间的延迟(按text分割) */
this.ncDelayMultipleByText = 60;
/** 每个分割块之间的延迟(按word分割) */
this.ncDelayMultipleByWord = 50;
/** 每个分割块之间的延迟(按character分割) */
this.ncDelayMultipleByCharacter = 30;
/** 每个分割块之间的延迟(按line分割) */
this.ncDelayMultipleByLine = 60;
/** 是否在视图可见时才开始动画 */
this._startOnView = false;
/** 是否只执行一次动画 */
this._once = false;
this.segments = [];
this.segmentStates = [];
this.observer = null;
this.timeout = null;
// 交错时间
this.staggerTimings = {};
}
set ncText(value) {
this._text = value;
setTimeout(() => {
this.start();
});
}
get ncText() {
return this._text;
}
set ncStartOnView(val) {
this._startOnView = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncStartOnView() {
return this._startOnView;
}
set ncOnce(val) {
this._once = val !== null && val !== undefined && val !== false && val !== 'false';
}
get ncOnce() {
return this._once;
}
ngOnInit() {
this.staggerTimings = {
text: this.ncDelayMultipleByText,
word: this.ncDelayMultipleByWord,
character: this.ncDelayMultipleByCharacter,
line: this.ncDelayMultipleByLine
};
}
ngOnDestroy() {
this.clear();
}
start() {
this.clear();
this.splitText();
// 初始所有段落都隐藏
this.segmentStates = this.segments.map(() => 'hidden');
if (this.ncStartOnView) {
this.setupIntersectionObserver();
}
else {
this.timeout = setTimeout(() => {
this.animateIn();
}, this.ncDelay);
}
}
clear() {
if (this.observer) {
this.observer.disconnect();
}
if (this.timeout) {
clearTimeout(this.timeout);
}
}
splitText() {
switch (this.ncBy) {
case 'word':
this.segments = this.ncText.split(/(\s+)/);
break;
case 'character':
this.segments = this.ncText.split('');
break;
case 'line':
this.segments = this.ncText.split('\n');
break;
case 'text':
default:
this.segments = [this.ncText];
break;
}
}
setupIntersectionObserver() {
const options = {
root: null,
rootMargin: '0px',
threshold: 0.1
};
this.observer = new IntersectionObserver((entries) => {
var _a;
if (entries[0].isIntersecting) {
this.timeout = setTimeout(() => {
this.animateIn();
}, this.ncDelay);
if (this.ncOnce) {
(_a = this.observer) === null || _a === void 0 ? void 0 : _a.disconnect();
}
}
else if (!this.ncOnce) {
this.animateOut();
}
}, options);
this.observer.observe(this.elementRef.nativeElement);
}
// 计算每个段落的延迟时间
getSegmentDelay(index) {
const staggerDelay = this.staggerTimings[this.ncBy] || 50;
return index * staggerDelay;
}
// 根据索引获取段落的动画状态
getSegmentState(index) {
return this.segmentStates[index] || 'hidden';
}
// 获取段落类名
getSegmentClass(index) {
let classes = 'animate-text-segment';
if (this.ncBy === 'line') {
classes += ' block';
}
else {
classes += ' inline-block whitespace-pre';
}
if (this.ncBy === 'character') {
classes += ' character';
}
return classes;
}
// 获取动画参数
getAnimationParams(index) {
return {
duration: this.ncDuration,
delay: this.getSegmentDelay(index)
};
}
// 执行进入动画
animateIn() {
this.segmentStates.forEach((state, index) => {
this.segmentStates[index] = 'visible';
});
}
// 执行退出动画
animateOut() {
//若存在ncDelay,离开视图后,进入动画(animateIn)可能还未执行,则需要清除timeout
if (this.timeout) {
clearTimeout(this.timeout);
}
//隐藏显示的文本
this.segmentStates.forEach((state, index) => {
this.segmentStates[index] = 'hidden';
});
}
}
AnimateTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AnimateTextComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
AnimateTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: AnimateTextComponent, selector: "nc-animate-text", inputs: { ncText: "ncText", ncDelay: "ncDelay", ncAnimation: "ncAnimation", ncBy: "ncBy", ncDuration: "ncDuration", ncDelayMultipleByText: "ncDelayMultipleByText", ncDelayMultipleByWord: "ncDelayMultipleByWord", ncDelayMultipleByCharacter: "ncDelayMultipleByCharacter", ncDelayMultipleByLine: "ncDelayMultipleByLine", ncStartOnView: "ncStartOnView", ncOnce: "ncOnce" }, ngImport: i0, template: "<div class=\"animate-text-container whitespace-pre-wrap\">\r\n <ng-container *ngFor=\"let segment of segments; let i = index\">\r\n <!-- \u6839\u636E\u5F53\u524D\u52A8\u753B\u7C7B\u578B\u9009\u62E9\u6B63\u786E\u7684\u52A8\u753B\u89E6\u53D1\u5668 -->\r\n <span *ngIf=\"ncAnimation === 'fadeIn'\" [class]=\"getSegmentClass(i)\"\r\n [@fadeIn]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'blurIn'\" [class]=\"getSegmentClass(i)\"\r\n [@blurIn]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'blurInUp'\" [class]=\"getSegmentClass(i)\"\r\n [@blurInUp]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'blurInDown'\" [class]=\"getSegmentClass(i)\"\r\n [@blurInDown]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'slideUp'\" [class]=\"getSegmentClass(i)\"\r\n [@slideUp]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'slideDown'\" [class]=\"getSegmentClass(i)\"\r\n [@slideDown]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'slideLeft'\" [class]=\"getSegmentClass(i)\"\r\n [@slideLeft]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'slideRight'\" [class]=\"getSegmentClass(i)\"\r\n [@slideRight]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'scaleUp'\" [class]=\"getSegmentClass(i)\"\r\n [@scaleUp]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n <span *ngIf=\"ncAnimation === 'scaleDown'\" [class]=\"getSegmentClass(i)\"\r\n [@scaleDown]=\"{value: getSegmentState(i), params: getAnimationParams(i)}\">{{segment}}</span>\r\n </ng-container>\r\n</div>", styles: [":host{display:block}.animate-text-container{width:-moz-fit-content;width:fit-content}.whitespace-pre-wrap{white-space:pre-wrap}.inline-block{display:inline-block}.whitespace-pre{white-space:pre}.block{display:block}\n"], directives: [{ type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [
trigger('fadeIn', [
state('hidden', style({ opacity: 0, transform: 'translateY(20px)' })),
state('visible', style({ opacity: 1, transform: 'translateY(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateY(20px)' })))
]),
trigger('blurIn', [
state('hidden', style({ opacity: 0, filter: 'blur(10px)' })),
state('visible', style({ opacity: 1, filter: 'blur(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms'))
]),
trigger('blurInUp', [
state('hidden', style({ opacity: 0, filter: 'blur(10px)', transform: 'translateY(20px)' })),
state('visible', style({ opacity: 1, filter: 'blur(0px)', transform: 'translateY(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms'))
]),
trigger('blurInDown', [
state('hidden', style({ opacity: 0, filter: 'blur(10px)', transform: 'translateY(-20px)' })),
state('visible', style({ opacity: 1, filter: 'blur(0px)', transform: 'translateY(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms'))
]),
trigger('slideUp', [
state('hidden', style({ opacity: 0, transform: 'translateY(20px)' })),
state('visible', style({ opacity: 1, transform: 'translateY(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateY(-20px)' })))
]),
trigger('slideDown', [
state('hidden', style({ opacity: 0, transform: 'translateY(-20px)' })),
state('visible', style({ opacity: 1, transform: 'translateY(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateY(20px)' })))
]),
trigger('slideLeft', [
state('hidden', style({ opacity: 0, transform: 'translateX(20px)' })),
state('visible', style({ opacity: 1, transform: 'translateX(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateX(-20px)' })))
]),
trigger('slideRight', [
state('hidden', style({ opacity: 0, transform: 'translateX(-20px)' })),
state('visible', style({ opacity: 1, transform: 'translateX(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateX(20px)' })))
]),
trigger('scaleUp', [
state('hidden', style({ opacity: 0, transform: 'scale(0.5)' })),
state('visible', style({ opacity: 1, transform: 'scale(1)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms cubic-bezier(0.175, 0.885, 0.32, 1.275)')),
transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'scale(0.5)' })))
]),
trigger('scaleDown', [
state('hidden', style({ opacity: 0, transform: 'scale(1.5)' })),
state('visible', style({ opacity: 1, transform: 'scale(1)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms cubic-bezier(0.175, 0.885, 0.32, 1.275)')),
transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'scale(1.5)' })))
])
] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AnimateTextComponent, decorators: [{
type: Component,
args: [{
selector: 'nc-animate-text',
templateUrl: './animate-text.component.html',
styleUrls: ['./animate-text.component.less'],
animations: [
trigger('fadeIn', [
state('hidden', style({ opacity: 0, transform: 'translateY(20px)' })),
state('visible', style({ opacity: 1, transform: 'translateY(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateY(20px)' })))
]),
trigger('blurIn', [
state('hidden', style({ opacity: 0, filter: 'blur(10px)' })),
state('visible', style({ opacity: 1, filter: 'blur(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms'))
]),
trigger('blurInUp', [
state('hidden', style({ opacity: 0, filter: 'blur(10px)', transform: 'translateY(20px)' })),
state('visible', style({ opacity: 1, filter: 'blur(0px)', transform: 'translateY(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms'))
]),
trigger('blurInDown', [
state('hidden', style({ opacity: 0, filter: 'blur(10px)', transform: 'translateY(-20px)' })),
state('visible', style({ opacity: 1, filter: 'blur(0px)', transform: 'translateY(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms'))
]),
trigger('slideUp', [
state('hidden', style({ opacity: 0, transform: 'translateY(20px)' })),
state('visible', style({ opacity: 1, transform: 'translateY(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateY(-20px)' })))
]),
trigger('slideDown', [
state('hidden', style({ opacity: 0, transform: 'translateY(-20px)' })),
state('visible', style({ opacity: 1, transform: 'translateY(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateY(20px)' })))
]),
trigger('slideLeft', [
state('hidden', style({ opacity: 0, transform: 'translateX(20px)' })),
state('visible', style({ opacity: 1, transform: 'translateX(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateX(-20px)' })))
]),
trigger('slideRight', [
state('hidden', style({ opacity: 0, transform: 'translateX(-20px)' })),
state('visible', style({ opacity: 1, transform: 'translateX(0px)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms')),
transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'translateX(20px)' })))
]),
trigger('scaleUp', [
state('hidden', style({ opacity: 0, transform: 'scale(0.5)' })),
state('visible', style({ opacity: 1, transform: 'scale(1)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms cubic-bezier(0.175, 0.885, 0.32, 1.275)')),
transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'scale(0.5)' })))
]),
trigger('scaleDown', [
state('hidden', style({ opacity: 0, transform: 'scale(1.5)' })),
state('visible', style({ opacity: 1, transform: 'scale(1)' })),
transition('hidden => visible', animate('{{duration}}ms {{delay}}ms cubic-bezier(0.175, 0.885, 0.32, 1.275)')),
transition('visible => hidden', animate('{{duration}}ms', style({ opacity: 0, transform: 'scale(1.5)' })))
])
]
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { ncText: [{
type: Input
}], ncDelay: [{
type: Input
}], ncAnimation: [{
type: Input
}], ncBy: [{
type: Input
}], ncDuration: [{
type: Input
}], ncDelayMultipleByText: [{
type: Input
}], ncDelayMultipleByWord: [{
type: Input
}], ncDelayMultipleByCharacter: [{
type: Input
}], ncDelayMultipleByLine: [{
type: Input
}], ncStartOnView: [{
type: Input
}], ncOnce: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0ZS10ZXh0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvYW5pbWF0ZS10ZXh0L2FuaW1hdGUtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2FuaW1hdGUtdGV4dC9hbmltYXRlLXRleHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQXlCLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQXFFakYsTUFBTSxPQUFPLG9CQUFvQjtJQXdEL0IsWUFBb0IsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQXZEMUMsY0FBYztRQUNOLFVBQUssR0FBVyxFQUFFLENBQUM7UUFXM0IsU0FBUztRQUNBLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDN0IsV0FBVztRQUNGLGdCQUFXLEdBQXFJLFFBQVEsQ0FBQztRQUNsSyxhQUFhO1FBQ0osU0FBSSxHQUEyQyxNQUFNLENBQUM7UUFDL0Qsa0JBQWtCO1FBQ1QsZUFBVSxHQUFXLEdBQUcsQ0FBQztRQUNsQywwQkFBMEI7UUFDakIsMEJBQXFCLEdBQVcsRUFBRSxDQUFDO1FBQzVDLDBCQUEwQjtRQUNqQiwwQkFBcUIsR0FBVyxFQUFFLENBQUM7UUFDNUMsK0JBQStCO1FBQ3RCLCtCQUEwQixHQUFXLEVBQUUsQ0FBQztRQUNqRCwwQkFBMEI7UUFDakIsMEJBQXFCLEdBQVcsRUFBRSxDQUFDO1FBQzVDLG9CQUFvQjtRQUNaLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBUXRDLGdCQUFnQjtRQUNSLFVBQUssR0FBWSxLQUFLLENBQUM7UUFTL0IsYUFBUSxHQUFhLEVBQUUs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QW5CLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUVHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBRUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUlGLGFBQWE7c0JBRGhCLEtBQUs7Z0JBVUYsTUFBTTtzQkFEVCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBFbGVtZW50UmVmLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdHJpZ2dlciwgc3R5bGUsIGFuaW1hdGUsIHRyYW5zaXRpb24sIHN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25jLWFuaW1hdGUtdGV4dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FuaW1hdGUtdGV4dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYW5pbWF0ZS10ZXh0LmNvbXBvbmVudC5sZXNzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignZmFkZUluJywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDIwcHgpJyB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDBweCknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcycpKSxcclxuICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PiBoaWRkZW4nLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcycsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgyMHB4KScgfSkpKVxyXG4gICAgXSksXHJcbiAgICB0cmlnZ2VyKCdibHVySW4nLCBbXHJcbiAgICAgIHN0YXRlKCdoaWRkZW4nLCBzdHlsZSh7IG9wYWNpdHk6IDAsIGZpbHRlcjogJ2JsdXIoMTBweCknIH0pKSxcclxuICAgICAgc3RhdGUoJ3Zpc2libGUnLCBzdHlsZSh7IG9wYWNpdHk6IDEsIGZpbHRlcjogJ2JsdXIoMHB4KScgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdoaWRkZW4gPT4gdmlzaWJsZScsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zIHt7ZGVsYXl9fW1zJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlID0+IGhpZGRlbicsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zJykpXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ2JsdXJJblVwJywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCBmaWx0ZXI6ICdibHVyKDEwcHgpJywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgyMHB4KScgfSkpLFxyXG4gICAgICBzdGF0ZSgndmlzaWJsZScsIHN0eWxlKHsgb3BhY2l0eTogMSwgZmlsdGVyOiAnYmx1cigwcHgpJywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwcHgpJyB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbiA9PiB2aXNpYmxlJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMge3tkZWxheX19bXMnKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGUgPT4gaGlkZGVuJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMnKSlcclxuICAgIF0pLFxyXG4gICAgdHJpZ2dlcignYmx1ckluRG93bicsIFtcclxuICAgICAgc3RhdGUoJ2hpZGRlbicsIHN0eWxlKHsgb3BhY2l0eTogMCwgZmlsdGVyOiAnYmx1cigxMHB4KScsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTIwcHgpJyB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBvcGFjaXR5OiAxLCBmaWx0ZXI6ICdibHVyKDBweCknLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDBweCknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcycpKSxcclxuICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PiBoaWRkZW4nLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcycpKVxyXG4gICAgXSksXHJcbiAgICB0cmlnZ2VyKCdzbGlkZVVwJywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDIwcHgpJyB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDBweCknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcycpKSxcclxuICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PiBoaWRkZW4nLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcycsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMjBweCknIH0pKSlcclxuICAgIF0pLFxyXG4gICAgdHJpZ2dlcignc2xpZGVEb3duJywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0yMHB4KScgfSkpLFxyXG4gICAgICBzdGF0ZSgndmlzaWJsZScsIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwcHgpJyB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbiA9PiB2aXNpYmxlJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMge3tkZWxheX19bXMnKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGUgPT4gaGlkZGVuJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMjBweCknIH0pKSlcclxuICAgIF0pLFxyXG4gICAgdHJpZ2dlcignc2xpZGVMZWZ0JywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDIwcHgpJyB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDBweCknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcycpKSxcclxuICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PiBoaWRkZW4nLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcycsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtMjBweCknIH0pKSlcclxuICAgIF0pLFxyXG4gICAgdHJpZ2dlcignc2xpZGVSaWdodCcsIFtcclxuICAgICAgc3RhdGUoJ2hpZGRlbicsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtMjBweCknIH0pKSxcclxuICAgICAgc3RhdGUoJ3Zpc2libGUnLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMHB4KScgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdoaWRkZW4gPT4gdmlzaWJsZScsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zIHt7ZGVsYXl9fW1zJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlID0+IGhpZGRlbicsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDIwcHgpJyB9KSkpXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ3NjYWxlVXAnLCBbXHJcbiAgICAgIHN0YXRlKCdoaWRkZW4nLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDAuNSknIH0pKSxcclxuICAgICAgc3RhdGUoJ3Zpc2libGUnLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbiA9PiB2aXNpYmxlJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMge3tkZWxheX19bXMgY3ViaWMtYmV6aWVyKDAuMTc1LCAwLjg4NSwgMC4zMiwgMS4yNzUpJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlID0+IGhpZGRlbicsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fW1zJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdzY2FsZSgwLjUpJyB9KSkpXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ3NjYWxlRG93bicsIFtcclxuICAgICAgc3RhdGUoJ2hpZGRlbicsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGUoMS41KScgfSkpLFxyXG4gICAgICBzdGF0ZSgndmlzaWJsZScsIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAnc2NhbGUoMSknIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBhbmltYXRlKCd7e2R1cmF0aW9ufX1tcyB7e2RlbGF5fX1tcyBjdWJpYy1iZXppZXIoMC4xNzUsIDAuODg1LCAwLjMyLCAxLjI3NSknKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGUgPT4gaGlkZGVuJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19bXMnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDEuNSknIH0pKSlcclxuICAgIF0pXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5pbWF0ZVRleHRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLyoqIOWxleekuueahOaWh+acrOWGheWuuSAqL1xyXG4gIHByaXZhdGUgX3RleHQ6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jVGV4dCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl90ZXh0ID0gdmFsdWU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zdGFydCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGdldCBuY1RleHQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl90ZXh0O1xyXG4gIH1cclxuICAvKiog5bu26L+fICovXHJcbiAgQElucHV0KCkgbmNEZWxheTogbnVtYmVyID0gMDtcclxuICAvKiog5Yqo55S757G75Z6LICovXHJcbiAgQElucHV0KCkgbmNBbmltYXRpb246ICdmYWRlSW4nIHwgJ2JsdXJJbicgfCAnYmx1ckluVXAnIHwgJ2JsdXJJbkRvd24nIHwgJ3NsaWRlVXAnIHwgJ3NsaWRlRG93bicgfCAnc2xpZGVMZWZ0JyB8ICdzbGlkZVJpZ2h0JyB8ICdzY2FsZVVwJyB8ICdzY2FsZURvd24nID0gJ2ZhZGVJbic7XHJcbiAgLyoqIOWKqOeUu+WIhuWJsuaWueW8jyAqL1xyXG4gIEBJbnB1dCgpIG5jQnk6ICd0ZXh0JyB8ICd3b3JkJyB8ICdjaGFyYWN0ZXInIHwgJ2xpbmUnID0gJ3dvcmQnO1xyXG4gIC8qKiDmr4/kuKrliIblibLlnZfliqjnlLvmjIHnu63ml7bpl7QgKi9cclxuICBASW5wdXQoKSBuY0R1cmF0aW9uOiBudW1iZXIgPSAzMDA7XHJcbiAgLyoqIOavj+S4quWIhuWJsuWdl+S5i+mXtOeahOW7tui/nyjmjIl0ZXh05YiG5YmyKSAqL1xyXG4gIEBJbnB1dCgpIG5jRGVsYXlNdWx0aXBsZUJ5VGV4dDogbnVtYmVyID0gNjA7XHJcbiAgLyoqIOavj+S4quWIhuWJsuWdl+S5i+mXtOeahOW7tui/nyjmjIl3b3Jk5YiG5YmyKSAqL1xyXG4gIEBJbnB1dCgpIG5jRGVsYXlNdWx0aXBsZUJ5V29yZDogbnVtYmVyID0gNTA7XHJcbiAgLyoqIOavj+S4quWIhuWJsuWdl+S5i+mXtOeahOW7tui/nyjmjIljaGFyYWN0ZXLliIblibIpICovXHJcbiAgQElucHV0KCkgbmNEZWxheU11bHRpcGxlQnlDaGFyYWN0ZXI6IG51bWJlciA9IDMwO1xyXG4gIC8qKiDmr4/kuKrliIblibLlnZfkuYvpl7TnmoTlu7bov58o5oyJbGluZeWIhuWJsikgKi9cclxuICBASW5wdXQoKSBuY0RlbGF5TXVsdGlwbGVCeUxpbmU6IG51bWJlciA9IDYwO1xyXG4gIC8qKiDmmK/lkKblnKjop4blm77lj6/op4Hml7bmiY3lvIDlp4vliqjnlLsgKi9cclxuICBwcml2YXRlIF9zdGFydE9uVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jU3RhcnRPblZpZXcodmFsOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9zdGFydE9uVmlldyA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jU3RhcnRPblZpZXcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRPblZpZXc7XHJcbiAgfVxyXG4gIC8qKiDmmK/lkKblj6rmiafooYzkuIDmrKHliqjnlLsgKi9cclxuICBwcml2YXRlIF9vbmNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNPbmNlKHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fb25jZSA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jT25jZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9vbmNlO1xyXG4gIH1cclxuXHJcbiAgc2VnbWVudHM6IHN0cmluZ1tdID0gW107XHJcbiAgc2VnbWVudFN0YXRlczogc3RyaW5nW10gPSBbXTtcclxuICBwcml2YXRlIG9ic2VydmVyOiBJbnRlcnNlY3Rpb25PYnNlcnZlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgdGltZW91dDogYW55ID0gbnVsbDtcclxuXHJcbiAgLy8g5Lqk6ZSZ5pe26Ze0XHJcbiAgcHJpdmF0ZSBzdGFnZ2VyVGltaW5nczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhZ2dlclRpbWluZ3MgPSB7XHJcbiAgICAgIHRleHQ6IHRoaXMubmNEZWxheU11bHRpcGxlQnlUZXh0LFxyXG4gICAgICB3b3JkOiB0aGlzLm5jRGVsYXlNdWx0aXBsZUJ5V29yZCxcclxuICAgICAgY2hhcmFjdGVyOiB0aGlzLm5jRGVsYXlNdWx0aXBsZUJ5Q2hhcmFjdGVyLFxyXG4gICAgICBsaW5lOiB0aGlzLm5jRGVsYXlNdWx0aXBsZUJ5TGluZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhcigpO1xyXG4gICAgdGhpcy5zcGxpdFRleHQoKTtcclxuICAgIC8vIOWIneWni+aJgOacieauteiQvemDvemakOiXj1xyXG4gICAgdGhpcy5zZWdtZW50U3RhdGVzID0gdGhpcy5zZWdtZW50cy5tYXAoKCkgPT4gJ2hpZGRlbicpO1xyXG4gICAgaWYgKHRoaXMubmNTdGFydE9uVmlldykge1xyXG4gICAgICB0aGlzLnNldHVwSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYW5pbWF0ZUluKCk7XHJcbiAgICAgIH0sIHRoaXMubmNEZWxheSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzcGxpdFRleHQoKTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKHRoaXMubmNCeSkge1xyXG4gICAgICBjYXNlICd3b3JkJzpcclxuICAgICAgICB0aGlzLnNlZ21lbnRzID0gdGhpcy5uY1RleHQuc3BsaXQoLyhcXHMrKS8pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjaGFyYWN0ZXInOlxyXG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSB0aGlzLm5jVGV4dC5zcGxpdCgnJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2xpbmUnOlxyXG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSB0aGlzLm5jVGV4dC5zcGxpdCgnXFxuJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3RleHQnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBbdGhpcy5uY1RleHRdO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEludGVyc2VjdGlvbk9ic2VydmVyKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgcm9vdDogbnVsbCxcclxuICAgICAgcm9vdE1hcmdpbjogJzBweCcsXHJcbiAgICAgIHRocmVzaG9sZDogMC4xXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcclxuICAgICAgaWYgKGVudHJpZXNbMF0uaXNJbnRlcnNlY3RpbmcpIHtcclxuICAgICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuYW5pbWF0ZUluKCk7XHJcbiAgICAgICAgfSwgdGhpcy5uY0RlbGF5KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubmNPbmNlKSB7XHJcbiAgICAgICAgICB0aGlzLm9ic2VydmVyPy5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLm5jT25jZSkge1xyXG4gICAgICAgIHRoaXMuYW5pbWF0ZU91dCgpO1xyXG4gICAgICB9XHJcbiAgICB9LCBvcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X5q+P5Liq5q616JC955qE5bu26L+f5pe26Ze0XHJcbiAgcHJpdmF0ZSBnZXRTZWdtZW50RGVsYXkoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCBzdGFnZ2VyRGVsYXkgPSB0aGlzLnN0YWdnZXJUaW1pbmdzW3RoaXMubmNCeV0gfHwgNTA7XHJcbiAgICByZXR1cm4gaW5kZXggKiBzdGFnZ2VyRGVsYXk7XHJcbiAgfVxyXG5cclxuICAvLyDmoLnmja7ntKLlvJXojrflj5bmrrXokL3nmoTliqjnlLvnirbmgIFcclxuICBnZXRTZWdtZW50U3RhdGUoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWdtZW50U3RhdGVzW2luZGV4XSB8fCAnaGlkZGVuJztcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPluauteiQveexu+WQjVxyXG4gIGdldFNlZ21lbnRDbGFzcyhpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBjbGFzc2VzID0gJ2FuaW1hdGUtdGV4dC1zZWdtZW50JztcclxuXHJcbiAgICBpZiAodGhpcy5uY0J5ID09PSAnbGluZScpIHtcclxuICAgICAgY2xhc3NlcyArPSAnIGJsb2NrJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNsYXNzZXMgKz0gJyBpbmxpbmUtYmxvY2sgd2hpdGVzcGFjZS1wcmUnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm5jQnkgPT09ICdjaGFyYWN0ZXInKSB7XHJcbiAgICAgIGNsYXNzZXMgKz0gJyBjaGFyYWN0ZXInO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjbGFzc2VzO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W5Yqo55S75Y+C5pWwXHJcbiAgZ2V0QW5pbWF0aW9uUGFyYW1zKGluZGV4OiBudW1iZXIpOiBhbnkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZHVyYXRpb246IHRoaXMubmNEdXJhdGlvbixcclxuICAgICAgZGVsYXk6IHRoaXMuZ2V0U2VnbWVudERlbGF5KGluZGV4KVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIOaJp+ihjOi/m+WFpeWKqOeUu1xyXG4gIHByaXZhdGUgYW5pbWF0ZUluKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWdtZW50U3RhdGVzLmZvckVhY2goKHN0YXRlLCBpbmRleCkgPT4ge1xyXG4gICAgICB0aGlzLnNlZ21lbnRTdGF0ZXNbaW5kZXhdID0gJ3Zpc2libGUnO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8vIOaJp+ihjOmAgOWHuuWKqOeUu1xyXG4gIHByaXZhdGUgYW5pbWF0ZU91dCgpOiB2b2lkIHtcclxuICAgIC8v6Iul5a2Y5ZyobmNEZWxhee+8jOemu+W8gOinhuWbvuWQju+8jOi/m+WFpeWKqOeUu++8iGFuaW1hdGVJbu+8ieWPr+iDvei/mOacquaJp+ihjO+8jOWImemcgOimgea4hemZpHRpbWVvdXRcclxuICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XHJcbiAgICB9XHJcbiAgICAvL+makOiXj+aYvuekuueahOaWh+acrFxyXG4gICAgdGhpcy5zZWdtZW50U3RhdGVzLmZvckVhY2goKHN0YXRlLCBpbmRleCkgPT4ge1xyXG4gICAgICB0aGlzLnNlZ21lbnRTdGF0ZXNbaW5kZXhdID0gJ2hpZGRlbic7XHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYW5pbWF0ZS10ZXh0LWNvbnRhaW5lciB3aGl0ZXNwYWNlLXByZS13cmFwXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWdtZW50IG9mIHNlZ21lbnRzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgPCEtLSDmoLn