UNPKG

ngx-analog-wrist-watch

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.14.

563 lines 66.4 kB
/** * @fileoverview added by tsickle * Generated from: lib/analogwristwatch.directive.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, ElementRef, Renderer2, Output, EventEmitter } from '@angular/core'; import { NgxAnalogWristWatchService } from './ngx-analog-wrist-watch.service'; export class AnalogwristwatchDirective { /** * @param {?} el * @param {?} renderer * @param {?} clockService */ constructor(el, renderer, clockService) { this.el = el; this.renderer = renderer; this.clockService = clockService; this.timeVal = new EventEmitter(); this.elementInfo = { input: null, clockBox: null, spanToggle: null, watchIcon: null, label: null, labelText: null, hourHand: null, minuteHand: null, secondHand: null, clockCrown: null, clockSpindle: null, clockNum: null, }; } /** * @return {?} */ ngOnInit() { this.createInitElement(); this.stylesInInit(); this.checkIfInputContainValue(this.elementInfo, this.inlineStyleInfo); this.watchRunner(); } /** * @return {?} */ createInitElement() { /** @type {?} */ const label = this.renderer.createElement('label'); /** @type {?} */ const text = this.renderer.createText('Time'); /** @type {?} */ const input = this.renderer.createElement('input'); /** @type {?} */ const clockBox = this.renderer.createElement('div'); /** @type {?} */ const span = this.renderer.createElement('span'); /** @type {?} */ const unicodeClock = `\u{0231A}`; /** @type {?} */ const icon = this.renderer.createText(unicodeClock); this.elementInfo.input = input; this.elementInfo.clockBox = clockBox; this.elementInfo.spanToggle = span; this.elementInfo.watchIcon = icon; this.elementInfo.label = label; this.elementInfo.labelText = text; } /** * @return {?} */ stylesInInit() { this.internalStyle = this.clockService.fetchInternalStyle(); this.inlineStyleInfo = this.clockService.fetchInLineStyle(); this.appendTagInInit(this.elementInfo); this.applyStyleInInit(this.elementInfo); this.applyStyleInFocus(this.elementInfo, this.inlineStyleInfo); this.applyStyleInBlur(this.elementInfo, this.inlineStyleInfo); this.applyBoxStyle(this.elementInfo); } /** * @return {?} */ watchRunner() { this.addClockElement(this.elementInfo.clockBox); this.runClock = setInterval((/** * @return {?} */ () => { /** @type {?} */ const timeInfo = this.startClock(); this.timeInfo = timeInfo; }), 1000); this.onWatchBtnClick(); this.onChangeHourTimeClick(); } /** * @param {?} initElement * @return {?} */ appendTagInInit(initElement) { /** @type {?} */ const container = this.el.nativeElement; this.renderer.setAttribute(initElement.input, 'type', 'text'); this.renderer.appendChild(initElement.label, initElement.labelText); this.renderer.appendChild(initElement.spanToggle, initElement.watchIcon); this.renderer.appendChild(container, initElement.label); this.renderer.appendChild(container, initElement.input); this.renderer.appendChild(container, initElement.spanToggle); this.renderer.appendChild(container, initElement.clockBox); } /** * @param {?} initElement * @return {?} */ applyStyleInInit(initElement) { this.applyStyleInDivDirective(initElement); this.applyStyleInInputAndLabelTag(initElement); this.applyStyleInInputAndLabelTag(initElement); this.applyStyleInWatchIcon(initElement); this.applyStyleInClockBox(initElement); } /** * @param {?} initElement * @return {?} */ applyStyleInDivDirective(initElement) { this.el.nativeElement.style.display = this.inlineStyleInfo.display, this.el.nativeElement.style.marginBottom = this.inlineStyleInfo.marginbottom, this.el.nativeElement.style.marginTop = this.inlineStyleInfo.margintop, this.el.nativeElement.style.padding = this.inlineStyleInfo.padding, this.el.nativeElement.style.position = this.inlineStyleInfo.relative, this.el.nativeElement.style.float = this.inlineStyleInfo.float, initElement.input.style.border = this.inlineStyleInfo.border; } /** * @param {?} initElement * @return {?} */ applyStyleInInputAndLabelTag(initElement) { initElement.input.style.borderBottom = this.inlineStyleInfo.borderBottom; initElement.input.style.outline = this.inlineStyleInfo.outline; initElement.input.style.width = this.inlineStyleInfo.width; initElement.input.style.fontSize = this.inlineStyleInfo.fontSize; initElement.label.style.position = this.inlineStyleInfo.absolute; initElement.label.style.color = this.inlineStyleInfo.color; } /** * @param {?} initElement * @return {?} */ applyStyleInWatchIcon(initElement) { initElement.spanToggle.style.position = this.inlineStyleInfo.absolute; initElement.spanToggle.style.marginLeft = this.inlineStyleInfo.marginLeft; initElement.spanToggle.style.cursor = this.inlineStyleInfo.cursor; initElement.spanToggle.style.top = this.inlineStyleInfo.iconTop; initElement.spanToggle.style.fontSize = this.inlineStyleInfo.iconFontSize; } /** * @param {?} initElement * @return {?} */ applyStyleInClockBox(initElement) { initElement.clockBox.style.boxShadow = this.inlineStyleInfo.boxShadow; initElement.clockBox.style.width = this.inlineStyleInfo.boxWidth; initElement.clockBox.style.height = this.inlineStyleInfo.boxHeight; initElement.clockBox.style.justifyContent = this.inlineStyleInfo.justifyContent; initElement.clockBox.style.alignItems = this.inlineStyleInfo.alignItems; initElement.clockBox.style.display = this.inlineStyleInfo.boxDisplayNone; } /** * @param {?} initElement * @param {?} style * @return {?} */ applyStyleInFocus(initElement, style) { initElement.input.addEventListener('focus', (/** * @return {?} */ () => { this.floatLabelToTop(initElement, style); })); } /** * @param {?} initElement * @param {?} style * @return {?} */ applyStyleInBlur(initElement, style) { initElement.input.addEventListener('blur', (/** * @return {?} */ () => { this.checkIfInputContainValue(initElement, style); })); } /** * @param {?} initElement * @param {?} style * @return {?} */ checkIfInputContainValue(initElement, style) { initElement.input.value ? this.floatLabelToTop(initElement, style) : this.floatLabelToBottom(initElement, style); } /** * @param {?} elementInfo * @param {?} style * @return {?} */ floatLabelToTop(elementInfo, style) { elementInfo.label.style.top = style.top; elementInfo.label.style.fontSize = style.labelFontSize; elementInfo.input.style.borderBottom = style.inputBorderBottom; elementInfo.label.style.transition = style.transistionTop; } /** * @param {?} elementInfo * @param {?} style * @return {?} */ floatLabelToBottom(elementInfo, style) { elementInfo.label.style.top = style.inherit; elementInfo.input.style.borderBottom = style.borderBottom; elementInfo.label.style.fontSize = style.inherit; } /** * @param {?} initElement * @return {?} */ applyBoxStyle(initElement) { this.renderer.listen(initElement.spanToggle, 'click', (/** * @return {?} */ () => { initElement.clockBox.classList.toggle('toggle-time'); })); } /** * @param {?} clockBox * @return {?} */ addClockElement(clockBox) { /** @type {?} */ const primaryCircle = this.renderer.createElement('div'); /** @type {?} */ const secondaryCircle = this.renderer.createElement('div'); /** @type {?} */ const thirdCircle = this.renderer.createElement('div'); /** @type {?} */ const clockCrown = this.renderer.createElement('div'); /** @type {?} */ const clockSpindle = this.renderer.createElement('div'); this.renderer.addClass(clockCrown, 'clock-crown'); this.renderer.addClass(clockSpindle, 'spindle'); this.renderer.appendChild(clockBox, primaryCircle); this.renderer.appendChild(clockBox, secondaryCircle); this.renderer.appendChild(secondaryCircle, thirdCircle); this.renderer.appendChild(thirdCircle, clockCrown); this.renderer.appendChild(thirdCircle, clockSpindle); this.elementInfo.clockCrown = clockCrown; this.elementInfo.clockSpindle = clockSpindle; this.applyStyleInClockCircle(primaryCircle, secondaryCircle, thirdCircle); this.clockService.addClockNumbers(thirdCircle, this.applyStyleInClockNum, this.renderer); this.drawClockFace(clockBox); this.addClockHands(thirdCircle); } /** * @param {?} primaryCircle * @param {?} secondaryCircle * @param {?} thirdCircle * @return {?} */ applyStyleInClockCircle(primaryCircle, secondaryCircle, thirdCircle) { primaryCircle.style.width = this.inlineStyleInfo.primaryWidth; primaryCircle.style.height = this.inlineStyleInfo.primaryHeight; primaryCircle.style.borderRadius = this.inlineStyleInfo.primaryBorderRadius; primaryCircle.style.border = this.inlineStyleInfo.primaryBorder; primaryCircle.style.position = this.inlineStyleInfo.relative; primaryCircle.style.zIndex = '1'; secondaryCircle.style.width = this.inlineStyleInfo.secondaryWidth; secondaryCircle.style.height = this.inlineStyleInfo.secondaryHeight; secondaryCircle.style.borderRadius = this.inlineStyleInfo.secondaryBorderRadius; secondaryCircle.style.border = this.inlineStyleInfo.secondaryBorder; secondaryCircle.style.position = this.inlineStyleInfo.absolute; secondaryCircle.style.zIndex = '1'; thirdCircle.style.width = this.inlineStyleInfo.thirdWidth; thirdCircle.style.height = this.inlineStyleInfo.thirdHeight; thirdCircle.style.borderRadius = this.inlineStyleInfo.thirdBorderRadius; thirdCircle.style.border = this.inlineStyleInfo.thirdBorder; thirdCircle.style.position = this.inlineStyleInfo.absolute; thirdCircle.style.top = this.inlineStyleInfo.thirdTop; } /** * @param {?} clockNum * @param {?} num * @param {?} style * @return {?} */ applyStyleInClockNum(clockNum, num, style) { clockNum.style.position = style.absolute; clockNum.style.left = style.clockNum[num].left; clockNum.style.top = style.clockNum[num].top; } /** * @param {?} clockBox * @return {?} */ drawClockFace(clockBox) { /** @type {?} */ const wrapper = this.renderer.createElement('div'); this.renderer.appendChild(clockBox, wrapper); /** @type {?} */ const dugHole = this.clockService.createDugHoles(wrapper, this.renderer); /** @type {?} */ const strap = this.clockService.createWatchStraps(wrapper, this.renderer); this.applyStyleInDugHoles(dugHole); this.applyStyleInWatchStraps(strap); } /** * @param {?} dugHole * @return {?} */ applyStyleInDugHoles(dugHole) { dugHole.topLeftDugHole.style.position = this.inlineStyleInfo.absolute; dugHole.topLeftDugHole.style.width = this.inlineStyleInfo.wrapWidth; dugHole.topLeftDugHole.style.borderBottom = this.inlineStyleInfo.wrapBorderBottom; dugHole.topLeftDugHole.style.borderLeft = this.inlineStyleInfo.wrapBorderLeft; dugHole.topLeftDugHole.style.top = this.inlineStyleInfo.wrapTop; dugHole.topLeftDugHole.style.left = this.inlineStyleInfo.wrapLeft; dugHole.topLeftDugHole.style.borderBottomRightRadius = this.inlineStyleInfo.rightBorderRightRadius; this.renderer.addClass(dugHole.topLeftDugHole, 'top-left-dughole'); this.renderer.addClass(dugHole.topRightDugHole, 'top-right-dughole'); this.renderer.addClass(dugHole.bottomLeftDugHole, 'bottom-left-dughole'); this.renderer.addClass(dugHole.bottomRightDugHole, 'bottom-right-dughole'); dugHole.topRightDugHole.style.position = this.inlineStyleInfo.absolute; dugHole.topRightDugHole.style.width = this.inlineStyleInfo.rightWrapWidth; dugHole.topRightDugHole.style.borderBottom = this.inlineStyleInfo.rightWrapBorderBottom; dugHole.topRightDugHole.style.borderRight = this.inlineStyleInfo.rightWrapBorderright; dugHole.topRightDugHole.style.top = this.inlineStyleInfo.rightWrapTop; dugHole.topRightDugHole.style.left = this.inlineStyleInfo.rightWrapLeft; dugHole.topRightDugHole.style.margin = this.inlineStyleInfo.rightWrapMargin; dugHole.topRightDugHole.style.borderBottomLeftRadius = this.inlineStyleInfo.rightBorderLeftRadius; /** @type {?} */ const styleTag = this.renderer.createElement('style'); /** @type {?} */ const cssText = this.renderer.createText(this.internalStyle); this.renderer.appendChild(styleTag, cssText); this.renderer.appendChild(document.head, styleTag); } /** * @param {?} strap * @return {?} */ applyStyleInWatchStraps(strap) { /** @type {?} */ const pos = 0; for (let index = 0; pos < strap['className' + index].length; index++) { /** @type {?} */ const size = strap['className' + index].length; if (size === 2) { this.renderer.addClass(strap['elementName' + index], strap['className' + index][index - index]); this.renderer.addClass(strap['elementName' + index], strap['className' + index][index - (index - 1)]); continue; } else { this.renderer.addClass(strap['elementName' + index], strap['className' + index][index - index]); if (index === 17) { break; } } } } /** * @param {?} thirdCircle * @return {?} */ addClockHands(thirdCircle) { /** @type {?} */ const axisCircle = this.renderer.createElement('span'); /** @type {?} */ const dotPuncture = this.renderer.createElement('i'); this.renderer.addClass(axisCircle, 'axis-circle'); this.renderer.addClass(dotPuncture, 'dot-puncture'); this.renderer.appendChild(axisCircle, dotPuncture); /** @type {?} */ const hourHand = this.renderer.createElement('div'); this.renderer.addClass(hourHand, 'hour-hand'); this.renderer.addClass(hourHand, 'hour'); /** @type {?} */ const hourHandRound = this.renderer.createElement('span'); /** @type {?} */ const hourHandArrow = this.renderer.createElement('span'); this.renderer.addClass(hourHandRound, 'hour-hand-round'); this.renderer.addClass(hourHandArrow, 'hour-hand-arrow'); this.renderer.appendChild(hourHand, hourHandRound); this.renderer.appendChild(hourHand, hourHandArrow); /** @type {?} */ const secondHand = this.renderer.createElement('div'); this.renderer.addClass(secondHand, 'second-hand'); this.renderer.addClass(secondHand, 'hand'); /** @type {?} */ const minuteHand = this.renderer.createElement('div'); this.renderer.addClass(minuteHand, 'minute-hand'); this.renderer.addClass(minuteHand, 'hour'); this.renderer.appendChild(thirdCircle, axisCircle); this.renderer.appendChild(thirdCircle, hourHand); this.renderer.appendChild(thirdCircle, secondHand); this.renderer.appendChild(thirdCircle, minuteHand); this.elementInfo.hourHand = hourHand; this.elementInfo.secondHand = secondHand; this.elementInfo.minuteHand = minuteHand; } /** * @return {?} */ startClock() { /** @type {?} */ const date = new Date(); /** @type {?} */ const seconds = date.getSeconds(); /** @type {?} */ const secondDegrees = ((seconds / 60) * 360) + 90; this.elementInfo.secondHand.style.transform = `rotate(${secondDegrees}deg)`; /** @type {?} */ const minutes = date.getMinutes(); /** @type {?} */ const minuteDegrees = ((minutes / 60) * 360) + 360; this.elementInfo.minuteHand.style.transform = `rotate(${minuteDegrees}deg)`; /** @type {?} */ const hours = date.getHours(); /** @type {?} */ const hourDegrees = hours * 360 / 12 + ((minutes * 360 / 60) / 12); this.elementInfo.hourHand.style.transform = `rotate(${hourDegrees}deg)`; return { hour: hours, minute: minutes, hourDegree: hourDegrees, minuteDegree: minuteDegrees, }; } /** * @return {?} */ onWatchBtnClick() { this.renderer.listen(this.elementInfo.clockCrown, 'click', (/** * @return {?} */ () => { /** @type {?} */ const merdian = this.timeInfo.hour <= 12 || this.timeInfo.hour === 24 ? 'am' : ' pm '; this.renderer.setProperty(this.elementInfo.input, 'value', `${this.timeInfo.hour}:${this.timeInfo.minute}${merdian}`); this.checkIfInputContainValue(this.elementInfo, this.inlineStyleInfo); this.renderer.removeClass(this.elementInfo.clockBox, 'toggle-time'); this.clockValue = this.elementInfo.input.value; this.getClockValue(); })); } /** * @return {?} */ onChangeHourTimeClick() { /** @type {?} */ let nextMove = 0; this.renderer.listen(this.elementInfo.hourHand, 'click', (/** * @return {?} */ () => { /** @type {?} */ const date = new Date(); clearInterval(this.runClock); nextMove++; date.setHours(this.timeInfo.hour, this.timeInfo.minute + nextMove); /** @type {?} */ const minutes = date.getMinutes(); /** @type {?} */ const minuteDegrees = ((minutes / 60) * 360) + 360; this.elementInfo.minuteHand.style.transform = `rotate(${minuteDegrees}deg)`; /** @type {?} */ const hourDegrees = date.getHours() * 360 / 12 + ((date.getMinutes() * 360 / 60) / 12); this.elementInfo.hourHand.style.transform = `rotate(${hourDegrees}deg)`; /** @type {?} */ const merdian = date.getHours() <= 12 || date.getHours() === 24 ? 'am' : ' pm '; this.renderer.setProperty(this.elementInfo.input, 'value', `${date.getHours()}:${minutes}${merdian}`); this.checkIfInputContainValue(this.elementInfo, this.inlineStyleInfo); /** @type {?} */ const changeTimeInfo = { hour: date.getHours(), minute: date.getMinutes(), hourDegree: hourDegrees, minuteDegree: minuteDegrees, }; this.timeInfo = changeTimeInfo; this.refreshClock(); })); } /** * @return {?} */ refreshClock() { setTimeout((/** * @return {?} */ () => { setInterval((/** * @return {?} */ () => { this.timeInfo = this.startClock(); }), 1000); }), 40000); } /** * @return {?} */ getClockValue() { this.timeVal.emit(this.clockValue); } } AnalogwristwatchDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxWristAnalogwristwatch]' },] } ]; /** @nocollapse */ AnalogwristwatchDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: NgxAnalogWristWatchService } ]; AnalogwristwatchDirective.propDecorators = { timeVal: [{ type: Output }] }; if (false) { /** @type {?} */ AnalogwristwatchDirective.prototype.timeVal; /** @type {?} */ AnalogwristwatchDirective.prototype.internalStyle; /** @type {?} */ AnalogwristwatchDirective.prototype.inlineStyleInfo; /** @type {?} */ AnalogwristwatchDirective.prototype.elementInfo; /** @type {?} */ AnalogwristwatchDirective.prototype.timeInfo; /** @type {?} */ AnalogwristwatchDirective.prototype.runClock; /** @type {?} */ AnalogwristwatchDirective.prototype.clockValue; /** * @type {?} * @private */ AnalogwristwatchDirective.prototype.el; /** * @type {?} * @private */ AnalogwristwatchDirective.prototype.renderer; /** * @type {?} * @private */ AnalogwristwatchDirective.prototype.clockService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbG9nd3Jpc3R3YXRjaC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYW5hbG9nLXdyaXN0LXdhdGNoLyIsInNvdXJjZXMiOlsibGliL2FuYWxvZ3dyaXN0d2F0Y2guZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFJOUUsTUFBTSxPQUFPLHlCQUF5Qjs7Ozs7O0lBcUJwQyxZQUFvQixFQUFjLEVBQVUsUUFBbUIsRUFBVSxZQUF3QztRQUE3RixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUE0QjtRQXBCdkcsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFHL0MsZ0JBQVcsR0FBUTtZQUNqQixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsVUFBVSxFQUFFLElBQUk7WUFDaEIsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLElBQUk7WUFDZCxVQUFVLEVBQUUsSUFBSTtZQUNoQixVQUFVLEVBQUUsSUFBSTtZQUNoQixVQUFVLEVBQUUsSUFBSTtZQUNoQixZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7SUFLRCxDQUFDOzs7O0lBR0QsUUFBUTtRQUNQLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsZUFB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QixZQUFZLEVBQUUsYUFBYTthQUM1QjtZQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDO1lBQy9CLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFRCxZQUFZO1FBQ1YsVUFBVTs7O1FBQUUsR0FBRyxFQUFFO1lBQ2YsV0FBVzs7O1lBQUMsR0FBRyxFQUFFO2dCQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BDLENBQUMsR0FBRSxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUMsR0FBRSxLQUFLLENBQUMsQ0FBQztJQUNYLENBQUM7Ozs7SUFFRixhQUFhO1FBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7OztZQXhYRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDRCQUE0QjthQUN2Qzs7OztZQUptQixVQUFVO1lBQUUsU0FBUztZQUNoQywwQkFBMEI7OztzQkFLaEMsTUFBTTs7OztJQUFQLDRDQUErQzs7SUFDL0Msa0RBQWM7O0lBQ2Qsb0RBQWdCOztJQUNoQixnREFhRTs7SUFDRiw2Q0FBUzs7SUFDVCw2Q0FBUzs7SUFDVCwrQ0FBVzs7Ozs7SUFDQyx1Q0FBc0I7Ozs7O0lBQUUsNkNBQTJCOzs7OztJQUFFLGlEQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5neEFuYWxvZ1dyaXN0V2F0Y2hTZXJ2aWNlIH0gZnJvbSAnLi9uZ3gtYW5hbG9nLXdyaXN0LXdhdGNoLnNlcnZpY2UnO1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neFdyaXN0QW5hbG9nd3Jpc3R3YXRjaF0nXG59KVxuZXhwb3J0IGNsYXNzIEFuYWxvZ3dyaXN0d2F0Y2hEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBAT3V0cHV0KCkgdGltZVZhbCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBpbnRlcm5hbFN0eWxlO1xuICBpbmxpbmVTdHlsZUluZm87XG4gIGVsZW1lbnRJbmZvOiBhbnkgPSB7XG4gICAgaW5wdXQ6IG51bGwsXG4gICAgY2xvY2tCb3g6IG51bGwsXG4gICAgc3BhblRvZ2dsZTogbnVsbCxcbiAgICB3YXRjaEljb246IG51bGwsXG4gICAgbGFiZWw6IG51bGwsXG4gICAgbGFiZWxUZXh0OiBudWxsLFxuICAgIGhvdXJIYW5kOiBudWxsLFxuICAgIG1pbnV0ZUhhbmQ6IG51bGwsXG4gICAgc2Vjb25kSGFuZDogbnVsbCxcbiAgICBjbG9ja0Nyb3duOiBudWxsLFxuICAgIGNsb2NrU3BpbmRsZTogbnVsbCxcbiAgICBjbG9ja051bTogbnVsbCxcbiAgfTtcbiAgdGltZUluZm87XG4gIHJ1bkNsb2NrO1xuICBjbG9ja1ZhbHVlO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgY2xvY2tTZXJ2aWNlOiBOZ3hBbmFsb2dXcmlzdFdhdGNoU2VydmljZSkge1xuICAgfVxuXG5cbiAgIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY3JlYXRlSW5pdEVsZW1lbnQoKTtcbiAgICB0aGlzLnN0eWxlc0luSW5pdCgpO1xuICAgIHRoaXMuY2hlY2tJZklucHV0Q29udGFpblZhbHVlKHRoaXMuZWxlbWVudEluZm8sIHRoaXMuaW5saW5lU3R5bGVJbmZvKTtcbiAgICB0aGlzLndhdGNoUnVubmVyKCk7XG4gIH1cblxuXG4gIGNyZWF0ZUluaXRFbGVtZW50KCkge1xuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoJ1RpbWUnKTtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBjb25zdCBjbG9ja0JveCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3Qgc3BhbiA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGNvbnN0IHVuaWNvZGVDbG9jayA9IGBcXHV7MDIzMUF9YDtcbiAgICBjb25zdCBpY29uID0gdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KHVuaWNvZGVDbG9jayk7XG4gICAgdGhpcy5lbGVtZW50SW5mby5pbnB1dCA9IGlucHV0O1xuICAgIHRoaXMuZWxlbWVudEluZm8uY2xvY2tCb3ggPSBjbG9ja0JveDtcbiAgICB0aGlzLmVsZW1lbnRJbmZvLnNwYW5Ub2dnbGUgPSBzcGFuO1xuICAgIHRoaXMuZWxlbWVudEluZm8ud2F0Y2hJY29uID0gaWNvbjtcbiAgICB0aGlzLmVsZW1lbnRJbmZvLmxhYmVsID0gbGFiZWw7XG4gICAgdGhpcy5lbGVtZW50SW5mby5sYWJlbFRleHQgPSB0ZXh0O1xuICB9XG5cbiAgc3R5bGVzSW5Jbml0KCkge1xuICAgIHRoaXMuaW50ZXJuYWxTdHlsZSA9IHRoaXMuY2xvY2tTZXJ2aWNlLmZldGNoSW50ZXJuYWxTdHlsZSgpO1xuICAgIHRoaXMuaW5saW5lU3R5bGVJbmZvID0gdGhpcy5jbG9ja1NlcnZpY2UuZmV0Y2hJbkxpbmVTdHlsZSgpO1xuICAgIHRoaXMuYXBwZW5kVGFnSW5Jbml0KHRoaXMuZWxlbWVudEluZm8pO1xuICAgIHRoaXMuYXBwbHlTdHlsZUluSW5pdCh0aGlzLmVsZW1lbnRJbmZvKTtcbiAgICB0aGlzLmFwcGx5U3R5bGVJbkZvY3VzKHRoaXMuZWxlbWVudEluZm8sIHRoaXMuaW5saW5lU3R5bGVJbmZvKTtcbiAgICB0aGlzLmFwcGx5U3R5bGVJbkJsdXIodGhpcy5lbGVtZW50SW5mbywgdGhpcy5pbmxpbmVTdHlsZUluZm8pO1xuICAgIHRoaXMuYXBwbHlCb3hTdHlsZSh0aGlzLmVsZW1lbnRJbmZvKTtcbiAgfVxuXG4gIHdhdGNoUnVubmVyKCkge1xuICAgIHRoaXMuYWRkQ2xvY2tFbGVtZW50KHRoaXMuZWxlbWVudEluZm8uY2xvY2tCb3gpO1xuICAgIHRoaXMucnVuQ2xvY2sgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lSW5mbyA9IHRoaXMuc3RhcnRDbG9jaygpO1xuICAgICAgdGhpcy50aW1lSW5mbyA9IHRpbWVJbmZvO1xuICAgIH0sIDEwMDApO1xuICAgIHRoaXMub25XYXRjaEJ0bkNsaWNrKCk7XG4gICAgdGhpcy5vbkNoYW5nZUhvdXJUaW1lQ2xpY2soKTtcbiAgfVxuXG4gIGFwcGVuZFRhZ0luSW5pdChpbml0RWxlbWVudCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShpbml0RWxlbWVudC5pbnB1dCwgJ3R5cGUnLCAndGV4dCcpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoaW5pdEVsZW1lbnQubGFiZWwsIGluaXRFbGVtZW50LmxhYmVsVGV4dCk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChpbml0RWxlbWVudC5zcGFuVG9nZ2xlLCBpbml0RWxlbWVudC53YXRjaEljb24pO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBpbml0RWxlbWVudC5sYWJlbCk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChjb250YWluZXIsIGluaXRFbGVtZW50LmlucHV0KTtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgaW5pdEVsZW1lbnQuc3BhblRvZ2dsZSk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChjb250YWluZXIsIGluaXRFbGVtZW50LmNsb2NrQm94KTtcbiAgfVxuXG4gIGFwcGx5U3R5bGVJbkluaXQoaW5pdEVsZW1lbnQpIHtcbiAgICB0aGlzLmFwcGx5U3R5bGVJbkRpdkRpcmVjdGl2ZShpbml0RWxlbWVudCk7XG4gICAgdGhpcy5hcHBseVN0eWxlSW5JbnB1dEFuZExhYmVsVGFnKGluaXRFbGVtZW50KTtcbiAgICB0aGlzLmFwcGx5U3R5bGVJbklucHV0QW5kTGFiZWxUYWcoaW5pdEVsZW1lbnQpO1xuICAgIHRoaXMuYXBwbHlTdHlsZUluV2F0Y2hJY29uKGluaXRFbGVtZW50KTtcbiAgICB0aGlzLmFwcGx5U3R5bGVJbkNsb2NrQm94KGluaXRFbGVtZW50KTtcbiAgfVxuXG5cbiAgYXBwbHlTdHlsZUluRGl2RGlyZWN0aXZlKGluaXRFbGVtZW50KSB7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmlubGluZVN0eWxlSW5mby5kaXNwbGF5LFxuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5tYXJnaW5Cb3R0b20gPSB0aGlzLmlubGluZVN0eWxlSW5mby5tYXJnaW5ib3R0b20sXG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLm1hcmdpblRvcCA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLm1hcmdpbnRvcCxcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUucGFkZGluZyA9IHRoaXMuaW5saW5lU3R5bGVJbmZvLnBhZGRpbmcsXG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gdGhpcy5pbmxpbmVTdHlsZUluZm8ucmVsYXRpdmUsXG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmZsb2F0ID0gdGhpcy5pbmxpbmVTdHlsZUluZm8uZmxvYXQsXG4gICAgaW5pdEVsZW1lbnQuaW5wdXQuc3R5bGUuYm9yZGVyID0gdGhpcy5pbmxpbmVTdHlsZUluZm8uYm9yZGVyO1xuICB9XG5cbiAgYXBwbHlTdHlsZUluSW5wdXRBbmRMYWJlbFRhZyhpbml0RWxlbWV