ngx-nested-ellipsis
Advanced tools
Comparing version
@@ -423,3 +423,5 @@ (function (global, factory) { | ||
width: this.elem.clientWidth, | ||
height: this.elem.clientHeight | ||
height: this.elem.clientHeight, | ||
scrollWidth: this.elem.scrollWidth, | ||
scrollHeight: this.elem.scrollHeight | ||
}; | ||
@@ -551,3 +553,6 @@ this.applyEllipsis(); | ||
window.requestAnimationFrame(function () { | ||
if (_this.previousDimensions.width !== _this.elem.clientWidth || _this.previousDimensions.height !== _this.elem.clientHeight) { | ||
if (_this.previousDimensions.width !== _this.elem.clientWidth | ||
|| _this.previousDimensions.height !== _this.elem.clientHeight | ||
|| _this.previousDimensions.scrollWidth !== _this.elem.scrollWidth | ||
|| _this.previousDimensions.scrollHeight !== _this.elem.scrollHeight) { | ||
_this.ngZone.run(function () { | ||
@@ -558,2 +563,4 @@ _this.applyEllipsis(); | ||
_this.previousDimensions.height = _this.elem.clientHeight; | ||
_this.previousDimensions.scrollWidth = _this.elem.scrollWidth; | ||
_this.previousDimensions.scrollHeight = _this.elem.scrollHeight; | ||
} | ||
@@ -560,0 +567,0 @@ }); |
@@ -15,3 +15,3 @@ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("resize-observer-polyfill"),require("@angular/common"),require("rxjs"),require("rxjs/operators")):"function"==typeof define&&define.amd?define("ngx-nested-ellipsis",["exports","@angular/core","resize-observer-polyfill","@angular/common","rxjs","rxjs/operators"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["ngx-nested-ellipsis"]={},e.ng.core,e.ResizeObserver,e.ng.common,e.rxjs,e.rxjs.operators)}(this,(function(e,t,i,n,r,s){"use strict";function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=o(i); | ||
PERFORMANCE OF THIS SOFTWARE. | ||
***************************************************************************** */Object.create;function l(e){var t="function"==typeof Symbol&&Symbol.iterator,i=t&&e[t],n=0;if(i)return i.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function c(e,t){var i="function"==typeof Symbol&&e[Symbol.iterator];if(!i)return e;var n,r,s=i.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=s.next()).done;)o.push(n.value)}catch(e){r={error:e}}finally{try{n&&!n.done&&(i=s.return)&&i.call(s)}finally{if(r)throw r.error}}return o}function h(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(c(arguments[t]));return e}Object.create;var d=function(e){this.elementRef=e};d.decorators=[{type:t.Component,args:[{selector:"nested-ellipsis-content",template:"\n <ng-content></ng-content>\n ",styles:["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n "]}]}],d.ctorParameters=function(){return[{type:t.ElementRef}]};var p=function(){function e(e,i,n,s,o,a){this.templateRef=e,this.viewContainer=i,this.resolver=n,this.renderer=s,this.ngZone=o,this.platformId=a,this.removeResizeListeners$=new r.Subject,this.change=new t.EventEmitter}return e.numericBinarySearch=function(e,t){for(var i,n=0,r=e,s=-1;n<=r;){t(i=Math.floor((n+r)/2))?(s=i,n=i+1):r=i-1}return s},e.prototype.flattenTextAndElementNodes=function(e){for(var t=[],i=0;i<e.childNodes.length;i++){var n=e.childNodes.item(i);(n instanceof HTMLElement||n instanceof CharacterData)&&(t.push(n),n instanceof HTMLElement&&t.push.apply(t,h(this.flattenTextAndElementNodes(n))))}return t},e.prototype.ngOnInit=function(){n.isPlatformBrowser(this.platformId)&&("boolean"!=typeof this.active&&(this.active=!0),void 0===this.indicator&&(this.indicator="..."),void 0===this.resizeDetection&&(this.resizeDetection="resize-observer"),this.wordBoundaries||(this.wordBoundaries=""),this.wordBoundaries="["+this.wordBoundaries.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")+"]",this.compFactory=this.resolver.resolveComponentFactory(d),this.restoreView(),this.previousDimensions={width:this.elem.clientWidth,height:this.elem.clientHeight},this.applyEllipsis())},e.prototype.ngOnDestroy=function(){this.removeResizeListeners$.next(),this.removeResizeListeners$.complete()},e.prototype.ngAfterViewChecked=function(){"manual"!==this.resizeDetection&&this.templatesHaveChanged&&this.applyEllipsis()},e.prototype.nodesToHtml=function(e){var t=this.renderer.createElement("div");return t.append.apply(t,h(e.map((function(e){return e.cloneNode(!0)})))),t.innerHTML},e.prototype.templatesToHtml=function(e,t){var i=this.nodesToHtml(e.rootNodes);return i+=t?this.nodesToHtml(t.rootNodes):this.indicator},Object.defineProperty(e.prototype,"templatesHaveChanged",{get:function(){if(!this.templateView||!this.previousTemplateHtml)return!1;var e=this.templateRef.createEmbeddedView({});e.detectChanges();var t="string"!=typeof this.indicator?this.indicator.createEmbeddedView({}):null;t&&t.detectChanges();var i=this.templatesToHtml(e,t);return this.previousTemplateHtml!==i},enumerable:!1,configurable:!0}),e.prototype.restoreView=function(){this.viewContainer.clear(),this.templateView=this.templateRef.createEmbeddedView({}),this.templateView.detectChanges();var e=this.viewContainer.createComponent(this.compFactory,null,this.viewContainer.injector,[this.templateView.rootNodes]);this.elem=e.instance.elementRef.nativeElement,this.initialTextLength=this.currentLength,this.indicatorView="string"!=typeof this.indicator?this.indicator.createEmbeddedView({}):null,this.indicatorView&&this.indicatorView.detectChanges()},e.prototype.addResizeListener=function(){switch(this.resizeDetection){case"manual":break;case"window":this.addWindowResizeListener();break;default:"undefined"!=typeof console&&console.warn("\n No such ellipsisResizeDetection strategy: '"+this.resizeDetection+"'.\n Using 'resize-observer' instead.\n "),this.resizeDetection="resize-observer";case"resize-observer":this.addResizeObserver()}},e.prototype.addWindowResizeListener=function(){var e=this,t=this.renderer.listen("window","resize",(function(){e.ngZone.run((function(){e.applyEllipsis()}))}));this.removeResizeListeners$.pipe(s.take(1)).subscribe((function(){return t()}))},e.prototype.addResizeObserver=function(){var e=this,t=new a.default((function(){window.requestAnimationFrame((function(){e.previousDimensions.width===e.elem.clientWidth&&e.previousDimensions.height===e.elem.clientHeight||(e.ngZone.run((function(){e.applyEllipsis()})),e.previousDimensions.width=e.elem.clientWidth,e.previousDimensions.height=e.elem.clientHeight)}))}));t.observe(this.elem),this.removeResizeListeners$.pipe(s.take(1)).subscribe((function(){return t.disconnect()}))},e.prototype.truncateContents=function(e){this.restoreView();for(var t,i=this.flattenTextAndElementNodes(this.elem).filter((function(e){return[Node.TEXT_NODE,Node.ELEMENT_NODE].includes(e.nodeType)})),n=-1,r=this.initialTextLength,s=i.length-1;s>=0;s--){if((a=i[s])instanceof CharacterData?r-=a.data.length:r--,r<=e){if(a instanceof CharacterData)if("[]"!==this.wordBoundaries||this.mayTruncateAtFn){if(e-r!==a.data.length){for(var o=e-r-1;o>0&&("[]"!==this.wordBoundaries&&!a.data.charAt(o).match(this.wordBoundaries)||this.mayTruncateAtFn&&!this.mayTruncateAtFn(a,o));)o--;if(r>0&&0===o)continue;a.data=a.data.substr(0,o)}}else a.data=a.data.substr(0,e-r);n=s,t=a;break}}for(s=n+1;s<i.length;s++){var a;""!==(a=i[s]).textContent&&a.parentElement!==this.elem&&1===a.parentElement.childNodes.length?a.parentElement.remove():a.remove()}return this.currentLength!==this.initialTextLength?t:null},Object.defineProperty(e.prototype,"currentLength",{get:function(){return this.flattenTextAndElementNodes(this.elem).filter((function(e){return[Node.TEXT_NODE,Node.ELEMENT_NODE].includes(e.nodeType)})).map((function(e){return e instanceof CharacterData?e.data.length:1})).reduce((function(e,t){return e+t}),0)},enumerable:!1,configurable:!0}),e.prototype.truncateText=function(e){var t,i,n=this.truncateContents(e);if(n)if(this.indicatorView)try{for(var r=l(this.indicatorView.rootNodes),s=r.next();!s.done;s=r.next()){var o=s.value;this.renderer.appendChild(this.elem,o)}}catch(e){t={error:e}}finally{try{s&&!s.done&&(i=r.return)&&i.call(r)}finally{if(t)throw t.error}}else n instanceof CharacterData?n.data+=this.indicator:this.renderer.appendChild(this.elem,this.renderer.createText(this.indicator))},e.prototype.applyEllipsis=function(){var t=this;if(this.removeResizeListeners$.next(),this.restoreView(),this.previousTemplateHtml=this.templatesToHtml(this.templateView,this.indicatorView),this.active){var i=e.numericBinarySearch(this.initialTextLength,(function(e){return t.truncateText(e),!t.isOverflowing}));if(this.truncateText(i),this.addResizeListener(),this.change.observers.length>0){var n=this.currentLength;this.change.emit(n===this.initialTextLength?null:n)}}},Object.defineProperty(e.prototype,"isOverflowing",{get:function(){var e=this.elem.style.overflow;e&&"visible"!==e||(this.elem.style.overflow="hidden");var t=this.elem.clientWidth<this.elem.scrollWidth-1||this.elem.clientHeight<this.elem.scrollHeight-1;return this.elem.style.overflow=e,t},enumerable:!1,configurable:!0}),e}();p.decorators=[{type:t.Directive,args:[{selector:"[nestedEllipsis]",exportAs:"ngxNestedEllipsis"}]}],p.ctorParameters=function(){return[{type:t.TemplateRef},{type:t.ViewContainerRef},{type:t.ComponentFactoryResolver},{type:t.Renderer2},{type:t.NgZone},{type:Object,decorators:[{type:t.Inject,args:[t.PLATFORM_ID]}]}]},p.propDecorators={active:[{type:t.Input,args:["nestedEllipsis"]}],indicator:[{type:t.Input,args:["nestedEllipsisIndicator"]}],wordBoundaries:[{type:t.Input,args:["nestedEllipsisWordBoundaries"]}],mayTruncateAtFn:[{type:t.Input,args:["nestedEllipsisMayTruncateAtFn"]}],resizeDetection:[{type:t.Input,args:["nestedEllipsisResizeDetection"]}],change:[{type:t.Output,args:["nestedEllipsisChange"]}]};var u=function(){};u.decorators=[{type:t.NgModule,args:[{imports:[],declarations:[p,d],entryComponents:[d],exports:[p]}]}],e.NestedEllipsisContentComponent=d,e.NestedEllipsisDirective=p,e.NestedEllipsisModule=u,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
***************************************************************************** */Object.create;function l(e){var t="function"==typeof Symbol&&Symbol.iterator,i=t&&e[t],n=0;if(i)return i.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function c(e,t){var i="function"==typeof Symbol&&e[Symbol.iterator];if(!i)return e;var n,r,s=i.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=s.next()).done;)o.push(n.value)}catch(e){r={error:e}}finally{try{n&&!n.done&&(i=s.return)&&i.call(s)}finally{if(r)throw r.error}}return o}function h(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(c(arguments[t]));return e}Object.create;var d=function(e){this.elementRef=e};d.decorators=[{type:t.Component,args:[{selector:"nested-ellipsis-content",template:"\n <ng-content></ng-content>\n ",styles:["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n "]}]}],d.ctorParameters=function(){return[{type:t.ElementRef}]};var p=function(){function e(e,i,n,s,o,a){this.templateRef=e,this.viewContainer=i,this.resolver=n,this.renderer=s,this.ngZone=o,this.platformId=a,this.removeResizeListeners$=new r.Subject,this.change=new t.EventEmitter}return e.numericBinarySearch=function(e,t){for(var i,n=0,r=e,s=-1;n<=r;){t(i=Math.floor((n+r)/2))?(s=i,n=i+1):r=i-1}return s},e.prototype.flattenTextAndElementNodes=function(e){for(var t=[],i=0;i<e.childNodes.length;i++){var n=e.childNodes.item(i);(n instanceof HTMLElement||n instanceof CharacterData)&&(t.push(n),n instanceof HTMLElement&&t.push.apply(t,h(this.flattenTextAndElementNodes(n))))}return t},e.prototype.ngOnInit=function(){n.isPlatformBrowser(this.platformId)&&("boolean"!=typeof this.active&&(this.active=!0),void 0===this.indicator&&(this.indicator="..."),void 0===this.resizeDetection&&(this.resizeDetection="resize-observer"),this.wordBoundaries||(this.wordBoundaries=""),this.wordBoundaries="["+this.wordBoundaries.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")+"]",this.compFactory=this.resolver.resolveComponentFactory(d),this.restoreView(),this.previousDimensions={width:this.elem.clientWidth,height:this.elem.clientHeight,scrollWidth:this.elem.scrollWidth,scrollHeight:this.elem.scrollHeight},this.applyEllipsis())},e.prototype.ngOnDestroy=function(){this.removeResizeListeners$.next(),this.removeResizeListeners$.complete()},e.prototype.ngAfterViewChecked=function(){"manual"!==this.resizeDetection&&this.templatesHaveChanged&&this.applyEllipsis()},e.prototype.nodesToHtml=function(e){var t=this.renderer.createElement("div");return t.append.apply(t,h(e.map((function(e){return e.cloneNode(!0)})))),t.innerHTML},e.prototype.templatesToHtml=function(e,t){var i=this.nodesToHtml(e.rootNodes);return i+=t?this.nodesToHtml(t.rootNodes):this.indicator},Object.defineProperty(e.prototype,"templatesHaveChanged",{get:function(){if(!this.templateView||!this.previousTemplateHtml)return!1;var e=this.templateRef.createEmbeddedView({});e.detectChanges();var t="string"!=typeof this.indicator?this.indicator.createEmbeddedView({}):null;t&&t.detectChanges();var i=this.templatesToHtml(e,t);return this.previousTemplateHtml!==i},enumerable:!1,configurable:!0}),e.prototype.restoreView=function(){this.viewContainer.clear(),this.templateView=this.templateRef.createEmbeddedView({}),this.templateView.detectChanges();var e=this.viewContainer.createComponent(this.compFactory,null,this.viewContainer.injector,[this.templateView.rootNodes]);this.elem=e.instance.elementRef.nativeElement,this.initialTextLength=this.currentLength,this.indicatorView="string"!=typeof this.indicator?this.indicator.createEmbeddedView({}):null,this.indicatorView&&this.indicatorView.detectChanges()},e.prototype.addResizeListener=function(){switch(this.resizeDetection){case"manual":break;case"window":this.addWindowResizeListener();break;default:"undefined"!=typeof console&&console.warn("\n No such ellipsisResizeDetection strategy: '"+this.resizeDetection+"'.\n Using 'resize-observer' instead.\n "),this.resizeDetection="resize-observer";case"resize-observer":this.addResizeObserver()}},e.prototype.addWindowResizeListener=function(){var e=this,t=this.renderer.listen("window","resize",(function(){e.ngZone.run((function(){e.applyEllipsis()}))}));this.removeResizeListeners$.pipe(s.take(1)).subscribe((function(){return t()}))},e.prototype.addResizeObserver=function(){var e=this,t=new a.default((function(){window.requestAnimationFrame((function(){e.previousDimensions.width===e.elem.clientWidth&&e.previousDimensions.height===e.elem.clientHeight&&e.previousDimensions.scrollWidth===e.elem.scrollWidth&&e.previousDimensions.scrollHeight===e.elem.scrollHeight||(e.ngZone.run((function(){e.applyEllipsis()})),e.previousDimensions.width=e.elem.clientWidth,e.previousDimensions.height=e.elem.clientHeight,e.previousDimensions.scrollWidth=e.elem.scrollWidth,e.previousDimensions.scrollHeight=e.elem.scrollHeight)}))}));t.observe(this.elem),this.removeResizeListeners$.pipe(s.take(1)).subscribe((function(){return t.disconnect()}))},e.prototype.truncateContents=function(e){this.restoreView();for(var t,i=this.flattenTextAndElementNodes(this.elem).filter((function(e){return[Node.TEXT_NODE,Node.ELEMENT_NODE].includes(e.nodeType)})),n=-1,r=this.initialTextLength,s=i.length-1;s>=0;s--){if((a=i[s])instanceof CharacterData?r-=a.data.length:r--,r<=e){if(a instanceof CharacterData)if("[]"!==this.wordBoundaries||this.mayTruncateAtFn){if(e-r!==a.data.length){for(var o=e-r-1;o>0&&("[]"!==this.wordBoundaries&&!a.data.charAt(o).match(this.wordBoundaries)||this.mayTruncateAtFn&&!this.mayTruncateAtFn(a,o));)o--;if(r>0&&0===o)continue;a.data=a.data.substr(0,o)}}else a.data=a.data.substr(0,e-r);n=s,t=a;break}}for(s=n+1;s<i.length;s++){var a;""!==(a=i[s]).textContent&&a.parentElement!==this.elem&&1===a.parentElement.childNodes.length?a.parentElement.remove():a.remove()}return this.currentLength!==this.initialTextLength?t:null},Object.defineProperty(e.prototype,"currentLength",{get:function(){return this.flattenTextAndElementNodes(this.elem).filter((function(e){return[Node.TEXT_NODE,Node.ELEMENT_NODE].includes(e.nodeType)})).map((function(e){return e instanceof CharacterData?e.data.length:1})).reduce((function(e,t){return e+t}),0)},enumerable:!1,configurable:!0}),e.prototype.truncateText=function(e){var t,i,n=this.truncateContents(e);if(n)if(this.indicatorView)try{for(var r=l(this.indicatorView.rootNodes),s=r.next();!s.done;s=r.next()){var o=s.value;this.renderer.appendChild(this.elem,o)}}catch(e){t={error:e}}finally{try{s&&!s.done&&(i=r.return)&&i.call(r)}finally{if(t)throw t.error}}else n instanceof CharacterData?n.data+=this.indicator:this.renderer.appendChild(this.elem,this.renderer.createText(this.indicator))},e.prototype.applyEllipsis=function(){var t=this;if(this.removeResizeListeners$.next(),this.restoreView(),this.previousTemplateHtml=this.templatesToHtml(this.templateView,this.indicatorView),this.active){var i=e.numericBinarySearch(this.initialTextLength,(function(e){return t.truncateText(e),!t.isOverflowing}));if(this.truncateText(i),this.addResizeListener(),this.change.observers.length>0){var n=this.currentLength;this.change.emit(n===this.initialTextLength?null:n)}}},Object.defineProperty(e.prototype,"isOverflowing",{get:function(){var e=this.elem.style.overflow;e&&"visible"!==e||(this.elem.style.overflow="hidden");var t=this.elem.clientWidth<this.elem.scrollWidth-1||this.elem.clientHeight<this.elem.scrollHeight-1;return this.elem.style.overflow=e,t},enumerable:!1,configurable:!0}),e}();p.decorators=[{type:t.Directive,args:[{selector:"[nestedEllipsis]",exportAs:"ngxNestedEllipsis"}]}],p.ctorParameters=function(){return[{type:t.TemplateRef},{type:t.ViewContainerRef},{type:t.ComponentFactoryResolver},{type:t.Renderer2},{type:t.NgZone},{type:Object,decorators:[{type:t.Inject,args:[t.PLATFORM_ID]}]}]},p.propDecorators={active:[{type:t.Input,args:["nestedEllipsis"]}],indicator:[{type:t.Input,args:["nestedEllipsisIndicator"]}],wordBoundaries:[{type:t.Input,args:["nestedEllipsisWordBoundaries"]}],mayTruncateAtFn:[{type:t.Input,args:["nestedEllipsisMayTruncateAtFn"]}],resizeDetection:[{type:t.Input,args:["nestedEllipsisResizeDetection"]}],change:[{type:t.Output,args:["nestedEllipsisChange"]}]};var u=function(){};u.decorators=[{type:t.NgModule,args:[{imports:[],declarations:[p,d],entryComponents:[d],exports:[p]}]}],e.NestedEllipsisContentComponent=d,e.NestedEllipsisDirective=p,e.NestedEllipsisModule=u,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
//# sourceMappingURL=ngx-nested-ellipsis.umd.min.js.map |
@@ -101,3 +101,5 @@ import { Directive, Renderer2, Input, Output, EventEmitter, NgZone, Inject, PLATFORM_ID, TemplateRef, ViewContainerRef, ComponentFactoryResolver } from '@angular/core'; | ||
width: this.elem.clientWidth, | ||
height: this.elem.clientHeight | ||
height: this.elem.clientHeight, | ||
scrollWidth: this.elem.scrollWidth, | ||
scrollHeight: this.elem.scrollHeight | ||
}; | ||
@@ -226,3 +228,6 @@ this.applyEllipsis(); | ||
window.requestAnimationFrame(() => { | ||
if (this.previousDimensions.width !== this.elem.clientWidth || this.previousDimensions.height !== this.elem.clientHeight) { | ||
if (this.previousDimensions.width !== this.elem.clientWidth | ||
|| this.previousDimensions.height !== this.elem.clientHeight | ||
|| this.previousDimensions.scrollWidth !== this.elem.scrollWidth | ||
|| this.previousDimensions.scrollHeight !== this.elem.scrollHeight) { | ||
this.ngZone.run(() => { | ||
@@ -233,2 +238,4 @@ this.applyEllipsis(); | ||
this.previousDimensions.height = this.elem.clientHeight; | ||
this.previousDimensions.scrollWidth = this.elem.scrollWidth; | ||
this.previousDimensions.scrollHeight = this.elem.scrollHeight; | ||
} | ||
@@ -389,2 +396,2 @@ }); | ||
}; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLWVsbGlwc2lzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbmVzdGVkLWVsbGlwc2lzL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL25lc3RlZC1lbGxpcHNpcy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osTUFBTSxFQUVOLE1BQU0sRUFDTixXQUFXLEVBQ1gsV0FBVyxFQUNYLGdCQUFnQixFQUNoQix3QkFBd0IsRUFLekIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFFakcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEM7OztHQUdHO0FBS0gsTUFBTSxPQUFPLHVCQUF1QjtJQW1JbEM7O09BRUc7SUFDSCxZQUNtQixXQUFpQyxFQUNqQyxhQUErQixFQUMvQixRQUFrQyxFQUNsQyxRQUFtQixFQUNuQixNQUFjLEVBQ0YsVUFBa0I7UUFMOUIsZ0JBQVcsR0FBWCxXQUFXLENBQXNCO1FBQ2pDLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUNsQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDRixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBN0dqRDs7V0FFRztRQUNLLDJCQUFzQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUE4Q3JEOzs7O1dBSUc7UUFDc0MsV0FB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dGl2ZSxcbiAgUmVuZGVyZXIyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBJbmplY3QsXG4gIFBMQVRGT1JNX0lELFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBDb21wb25lbnRGYWN0b3J5LFxuICBFbWJlZGRlZFZpZXdSZWYsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIE9uSW5pdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tICdyZXNpemUtb2JzZXJ2ZXItcG9seWZpbGwnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmVzdGVkRWxsaXBzaXNDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9uZXN0ZWQtZWxsaXBzaXMtY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRWxsaXBzaXNSZXNpemVEZXRlY3Rpb25FbnVtIH0gZnJvbSAnLi4vZW51bXMvZWxsaXBzaXMtcmVzaXplLWRldGVjdGlvbi5lbnVtJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8qKlxuICogRGlyZWN0aXZlIHRvIHRydW5jYXRlIHRoZSBjb250YWluZWQgdGV4dCwgaWYgaXQgZXhjZWVkcyB0aGUgZWxlbWVudCdzIGJvdW5kYXJpZXNcbiAqIGFuZCBhcHBlbmQgY2hhcmFjdGVycyAoY29uZmlndXJhYmxlLCBkZWZhdWx0ICcuLi4nKSBpZiBzby5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25lc3RlZEVsbGlwc2lzXScsXG4gIGV4cG9ydEFzOiAnbmd4TmVzdGVkRWxsaXBzaXMnXG59KVxuZXhwb3J0IGNsYXNzIE5lc3RlZEVsbGlwc2lzRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWQge1xuICAvKipcbiAgICogVGhlIHJlZmVyZW5jZWQgZWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBlbGVtOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogQ29tcG9uZW50IGZhY3RvcnkgcmVxdWlyZWQgZm9yIHJlbmRlcmluZyBFbGxpcHNpc0NvbnRlbnQgY29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGNvbXBGYWN0b3J5OiBDb21wb25lbnRGYWN0b3J5PE5lc3RlZEVsbGlwc2lzQ29udGVudENvbXBvbmVudD47XG5cbiAgLyoqXG4gICAqIFZpZXdSZWYgb2YgdGhlIG1haW4gdGVtcGxhdGUgKHRoZSBvbmUgdG8gYmUgdHJ1bmNhdGVkKVxuICAgKi9cbiAgcHJpdmF0ZSB0ZW1wbGF0ZVZpZXc6IEVtYmVkZGVkVmlld1JlZjx1bmtub3duPjtcblxuICAvKipcbiAgICogVmlld1JlZiBvZiB0aGUgaW5kaWNhdG9yIHRlbXBsYXRlXG4gICAqL1xuICBwcml2YXRlIGluZGljYXRvclZpZXc6IEVtYmVkZGVkVmlld1JlZjx1bmtub3duPjtcblxuICAvKipcbiAgICogQ29uY2F0ZW5hdGVkIHRlbXBsYXRlIGh0bWwgYXQgdGhlIHRpbWUgb2YgdGhlIGxhc3QgdGltZSB0aGUgZWxsaXBzaXMgaGFzIGJlZW4gYXBwbGllZFxuICAgKi9cbiAgcHJpdmF0ZSBwcmV2aW91c1RlbXBsYXRlSHRtbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUZXh0IGxlbmd0aCBiZWZvcmUgdHJ1bmNhdGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsVGV4dExlbmd0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTdWJqZWN0IHRyaWdnZXJlZCB3aGVuIHJlc2l6ZSBsaXN0ZW5lcnMgc2hvdWxkIGJlIHJlbW92ZWRcbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlUmVzaXplTGlzdGVuZXJzJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBwcmV2aW91c0RpbWVuc2lvbnM6IHtcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBuZ3hOZXN0ZWRFbGxpcHNpcyBodG1sIGF0dHJpYnV0ZVxuICAgKiBQYXNzaW5nIHRydWUgKGRlZmF1bHQpIHdpbGwgcGVyZm9ybSB0aGUgZGlyZWN0aXZlJ3MgdGFzayxcbiAgICogb3RoZXJ3aXNlIHRoZSB0ZW1wbGF0ZSB3aWxsIGJlIHJlbmRlcmVkIHdpdGhvdXQgdHJ1bmNhdGluZyBpdHMgY29udGVudHMuXG4gICAqL1xuICBASW5wdXQoJ25lc3RlZEVsbGlwc2lzJykgYWN0aXZlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZWxsaXBzaXNJbmRpY2F0b3IgaHRtbCBhdHRyaWJ1dGVcbiAgICogUGFzc2luZyBhIHN0cmluZyAoZGVmYXVsdDogJy4uLicpIHdpbGwgYXBwZW5kIGl0IHdoZW4gdGhlIHBhc3NlZCB0ZW1wbGF0ZSBoYXMgYmVlbiB0cnVuY2F0ZWRcbiAgICogUGFzc2luZyBhIHRlbXBsYXRlIHdpbGwgYXBwZW5kIHRoYXQgdGVtcGxhdGUgaW5zdGVhZFxuICAgKi9cbiAgQElucHV0KCduZXN0ZWRFbGxpcHNpc0luZGljYXRvcicpIGluZGljYXRvcjogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFRoZSBlbGxpcHNpc1dvcmRCb3VuZGFyaWVzIGh0bWwgYXR0cmlidXRlXG4gICAqIEVhY2ggY2hhcmFjdGVyIHBhc3NlZCB0byB0aGlzIGlucHV0IHdpbGwgYmUgaW50ZXJwcmV0ZWRcbiAgICogYXMgYSB3b3JkIGJvdW5kYXJ5IGF0IHdoaWNoIHRoZSB0ZXh0IG1heSBiZSB0cnVuY2F0ZWQuXG4gICAqIEVsc2UgdGhlIHRleHQgbWF5IGJlIHRydW5jYXRlZCBhdCBhbnkgY2hhcmFjdGVyLlxuICAgKi9cbiAgQElucHV0KCduZXN0ZWRFbGxpcHNpc1dvcmRCb3VuZGFyaWVzJykgd29yZEJvdW5kYXJpZXM6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVsbGlwc2lzTWF5VHJ1bmNhdGVBdEZuIGh0bWwgYXR0cmlidXRlXG4gICAqIEZ1bmN0aW9uIHRoYXQgbGV0cyB5b3Ugc3BlY2lmeSB3aGV0aGVyIHRoZSBjb250ZW50cyBtYXkgYmUgdHJ1bmNhdGVkIGF0IGEgc3BlY2lmaWMgcG9pbnQgb3Igbm90OlxuICAgKiBgKG5vZGU6IENoYXJhY3RlckRhdGEsIHBvc2l0aW9uOiBudW1iZXIpID0+IGJvb2xlYW5gXG4gICAqIGBub2RlYCBUZXh0IG5vZGUgdGhhdCBpcyBiZWluZyB0cnVuY2F0ZWRcbiAgICogYHBvc2l0aW9uYCBTdHJpbmcgcG9zaXRpb24gdGhlIHRleHQgd291bGQgYmUgdHJ1bmNhdGVkIGF0XG4gICAqIFNob3VsZCByZXR1cm4gdHJ1ZSwgaWYgdGhlIHRleHQgbWF5IGJlIHRydW5jYXRlZCBoZXJlLCBlbHNlIGZhbHNlXG4gICAqL1xuICBASW5wdXQoJ25lc3RlZEVsbGlwc2lzTWF5VHJ1bmNhdGVBdEZuJykgbWF5VHJ1bmNhdGVBdEZuOiAobm9kZTogQ2hhcmFjdGVyRGF0YSwgcG9zaXRpb246IG51bWJlcikgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGVsbGlwc2lzUmVzaXplRGV0ZWN0aW9uIGh0bWwgYXR0cmlidXRlXG4gICAqIEFsZ29yaXRobSB0byB1c2UgdG8gZGV0ZWN0IGVsZW1lbnQvd2luZG93IHJlc2l6ZSAtIGFueSB2YWx1ZSBvZiBgRWxsaXBzaXNSZXNpemVEZXRlY3Rpb25FbnVtYFxuICAgKi9cbiAgQElucHV0KCduZXN0ZWRFbGxpcHNpc1Jlc2l6ZURldGVjdGlvbicpIHJlc2l6ZURldGVjdGlvbjogRWxsaXBzaXNSZXNpemVEZXRlY3Rpb25FbnVtO1xuXG5cbiAgLyoqXG4gICAqIFRoZSBlbGxpcHNpc0NoYW5nZSBodG1sIGF0dHJpYnV0ZVxuICAgKiBUaGlzIGVtaXRzIGFmdGVyIHdoaWNoIGluZGV4IHRoZSB0ZXh0IGhhcyBiZWVuIHRydW5jYXRlZC5cbiAgICogSWYgaXQgaGFzbid0IGJlZW4gdHJ1bmNhdGVkLCBudWxsIGlzIGVtaXR0ZWQuXG4gICAqL1xuICBAT3V0cHV0KCduZXN0ZWRFbGxpcHNpc0NoYW5nZScpIHJlYWRvbmx5IGNoYW5nZTogRXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIFV0aWxpdHkgbWV0aG9kIHRvIHF1aWNrbHkgZmluZCB0aGUgbGFyZ2VzdCBudW1iZXIgZm9yXG4gICAqIHdoaWNoIGBjYWxsYmFjayhudW1iZXIpYCBzdGlsbCByZXR1cm5zIHRydWUuXG4gICAqIEBwYXJhbSAgbWF4ICAgICAgSGlnaGVzdCBwb3NzaWJsZSBudW1iZXJcbiAgICogQHBhcmFtICBjYWxsYmFjayBTaG91bGQgcmV0dXJuIHRydWUgYXMgbG9uZyBhcyB0aGUgcGFzc2VkIG51bWJlciBpcyB2YWxpZFxuICAgKiBAcmV0dXJucyAgICAgICAgIExhcmdlc3QgcG9zc2libGUgbnVtYmVyXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBudW1lcmljQmluYXJ5U2VhcmNoKG1heDogbnVtYmVyLCBjYWxsYmFjazogKG46IG51bWJlcikgPT4gYm9vbGVhbik6IG51bWJlciB7XG4gICAgbGV0IGxvdyA9IDA7XG4gICAgbGV0IGhpZ2ggPSBtYXg7XG4gICAgbGV0IGJlc3QgPSAtMTtcbiAgICBsZXQgbWlkOiBudW1iZXI7XG5cbiAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHtcbiAgICAgIG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7XG4gICAgICBjb25zdCByZXN1bHQgPSBjYWxsYmFjayhtaWQpO1xuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgaGlnaCA9IG1pZCAtIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiZXN0ID0gbWlkO1xuICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiZXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBmbGF0dGVuVGV4dEFuZEVsZW1lbnROb2RlcyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IChDaGFyYWN0ZXJEYXRhIHwgSFRNTEVsZW1lbnQpW10ge1xuICAgIGNvbnN0IG5vZGVzOiAoQ2hhcmFjdGVyRGF0YSB8IEhUTUxFbGVtZW50KVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gZWxlbWVudC5jaGlsZE5vZGVzLml0ZW0oaSk7XG4gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBjaGlsZCBpbnN0YW5jZW9mIENoYXJhY3RlckRhdGEpIHtcbiAgICAgICAgbm9kZXMucHVzaChjaGlsZCk7XG5cbiAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICBub2Rlcy5wdXNoKC4uLnRoaXMuZmxhdHRlblRleHRBbmRFbGVtZW50Tm9kZXMoY2hpbGQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub2RlcztcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RpdmUncyBjb25zdHJ1Y3RvclxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPHVua25vd24+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmUsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBPYmplY3RcbiAgKSB7IH1cblxuICAvKipcbiAgICogQW5ndWxhcidzIG9uSW5pdCBsaWZlIGN5Y2xlIGhvb2suXG4gICAqIEluaXRpYWxpemVzIHRoZSBlbGVtZW50IGZvciBkaXNwbGF5aW5nIHRoZSBlbGxpcHNpcy5cbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgLy8gaW4gYW5ndWxhciB1bml2ZXJzYWwgd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHVnbHlcbiAgICAgIC8vIERPTSBtYW5pcHVsYXRpb24gcHJvcGVydGllcyB3ZSBzYWRseSBuZWVkIHRvIGFjY2VzcyBoZXJlLFxuICAgICAgLy8gc28gd2FpdCB1bnRpbCB3ZSdyZSBpbiB0aGUgYnJvd3NlcjpcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mKHRoaXMuYWN0aXZlKSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZih0aGlzLmluZGljYXRvcikgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmluZGljYXRvciA9ICcuLi4nO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgKHRoaXMucmVzaXplRGV0ZWN0aW9uKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMucmVzaXplRGV0ZWN0aW9uID0gRWxsaXBzaXNSZXNpemVEZXRlY3Rpb25FbnVtLlJlc2l6ZU9ic2VydmVyO1xuICAgIH1cblxuICAgIC8vIHBlcmZvcm0gcmVnZXggcmVwbGFjZSBvbiB3b3JkIGJvdW5kYXJpZXM6XG4gICAgaWYgKCF0aGlzLndvcmRCb3VuZGFyaWVzKSB7XG4gICAgICB0aGlzLndvcmRCb3VuZGFyaWVzID0gJyc7XG4gICAgfVxuICAgIHRoaXMud29yZEJvdW5kYXJpZXMgPSAnWycgKyB0aGlzLndvcmRCb3VuZGFyaWVzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpICsgJ10nO1xuXG4gICAgLy8gaW5pdGlhbGl6ZSB2aWV3OlxuICAgIHRoaXMuY29tcEZhY3RvcnkgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KE5lc3RlZEVsbGlwc2lzQ29udGVudENvbXBvbmVudCk7XG4gICAgdGhpcy5yZXN0b3JlVmlldygpO1xuICAgIHRoaXMucHJldmlvdXNEaW1lbnNpb25zID0ge1xuICAgICAgd2lkdGg6IHRoaXMuZWxlbS5jbGllbnRXaWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5lbGVtLmNsaWVudEhlaWdodFxuICAgIH07XG5cbiAgICB0aGlzLmFwcGx5RWxsaXBzaXMoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIncyBkZXN0cm95IGxpZmUgY3ljbGUgaG9vay5cbiAgICogUmVtb3ZlIGV2ZW50IGxpc3RlbmVyc1xuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZW1vdmVSZXNpemVMaXN0ZW5lcnMkLm5leHQoKTtcbiAgICB0aGlzLnJlbW92ZVJlc2l6ZUxpc3RlbmVycyQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmd1bGFyJ3MgYWZ0ZXJWaWV3Q2hlY2tlZCBsaWZlIGN5Y2xlIGhvb2suXG4gICAqIFJlYXBwbHkgZWxsaXBzaXMsIGlmIGFueSBvZiB0aGUgdGVtcGxhdGVzIGhhdmUgY2hhbmdlZFxuICAgKi9cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIGlmICh0aGlzLnJlc2l6ZURldGVjdGlvbiAhPT0gJ21hbnVhbCcpIHtcbiAgICAgIGlmICh0aGlzLnRlbXBsYXRlc0hhdmVDaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMuYXBwbHlFbGxpcHNpcygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgbGlzdCBvZiBOb2RlcyB0byBodG1sXG4gICAqIEBwYXJhbSBub2RlcyBOb2RlcyB0byBjb252ZXJ0XG4gICAqIEByZXR1cm5zIGh0bWwgY29kZVxuICAgKi9cbiAgcHJpdmF0ZSBub2Rlc1RvSHRtbChub2RlczogTm9kZVtdKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXYgPSA8SFRNTEVsZW1lbnQ+IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmFwcGVuZCguLi5ub2Rlcy5tYXAobm9kZSA9PiBub2RlLmNsb25lTm9kZSh0cnVlKSkpO1xuICAgIHJldHVybiBkaXYuaW5uZXJIVE1MO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIHBhc3NlZCB0ZW1wbGF0ZXMgdG8gaHRtbFxuICAgKiBAcGFyYW0gdGVtcGxhdGVWaWV3IHRoZSBtYWluIHRlbXBsYXRlIHZpZXcgcmVmXG4gICAqIEBwYXJhbSBpbmRpY2F0b3JWaWV3IHRoZSBpbmRpY2F0b3IgdGVtcGxhdGUgdmlldyByZWZcbiAgICogQHJldHVybnMgY29uY2F0ZW5hdGVkIHRlbXBsYXRlIGh0bWxcbiAgICovXG4gIHByaXZhdGUgdGVtcGxhdGVzVG9IdG1sKHRlbXBsYXRlVmlldzogRW1iZWRkZWRWaWV3UmVmPHVua25vd24+LCBpbmRpY2F0b3JWaWV3PzogRW1iZWRkZWRWaWV3UmVmPHVua25vd24+KTogc3RyaW5nIHtcbiAgICBsZXQgaHRtbCA9IHRoaXMubm9kZXNUb0h0bWwodGVtcGxhdGVWaWV3LnJvb3ROb2Rlcyk7XG4gICAgaWYgKGluZGljYXRvclZpZXcpIHtcbiAgICAgIGh0bWwgKz0gdGhpcy5ub2Rlc1RvSHRtbChpbmRpY2F0b3JWaWV3LnJvb3ROb2Rlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh0bWwgKz0gPHN0cmluZz4gdGhpcy5pbmRpY2F0b3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhbnkgb2YgdGhlIHBhc3NlZCB0ZW1wbGF0ZXMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWVcbiAgICogdGhlIGVsbGlwc2lzIGhhcyBiZWVuIGFwcGxpZWRcbiAgICovXG4gIHByaXZhdGUgZ2V0IHRlbXBsYXRlc0hhdmVDaGFuZ2VkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy50ZW1wbGF0ZVZpZXcgfHwgIXRoaXMucHJldmlvdXNUZW1wbGF0ZUh0bWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wbGF0ZVZpZXcgPSB0aGlzLnRlbXBsYXRlUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh7fSk7XG4gICAgdGVtcGxhdGVWaWV3LmRldGVjdENoYW5nZXMoKTtcblxuICAgIGNvbnN0IGluZGljYXRvclZpZXcgPSAodHlwZW9mIHRoaXMuaW5kaWNhdG9yICE9PSAnc3RyaW5nJykgPyB0aGlzLmluZGljYXRvci5jcmVhdGVFbWJlZGRlZFZpZXcoe30pIDogbnVsbDtcbiAgICBpZiAoaW5kaWNhdG9yVmlldykge1xuICAgICAgaW5kaWNhdG9yVmlldy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcGxhdGVIdG1sID0gdGhpcy50ZW1wbGF0ZXNUb0h0bWwodGVtcGxhdGVWaWV3LCBpbmRpY2F0b3JWaWV3KTtcblxuICAgIHJldHVybiB0aGlzLnByZXZpb3VzVGVtcGxhdGVIdG1sICE9PSB0ZW1wbGF0ZUh0bWw7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSB0aGUgdmlldyBmcm9tIHRoZSB0ZW1wbGF0ZXMgKG5vbi10cnVuY2F0ZWQpXG4gICAqL1xuICBwcml2YXRlIHJlc3RvcmVWaWV3KCkge1xuICAgIHRoaXMudmlld0NvbnRhaW5lci5jbGVhcigpO1xuICAgIHRoaXMudGVtcGxhdGVWaWV3ID0gdGhpcy50ZW1wbGF0ZVJlZi5jcmVhdGVFbWJlZGRlZFZpZXcoe30pO1xuICAgIHRoaXMudGVtcGxhdGVWaWV3LmRldGVjdENoYW5nZXMoKTtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlQ29tcG9uZW50KFxuICAgICAgdGhpcy5jb21wRmFjdG9yeSwgbnVsbCwgdGhpcy52aWV3Q29udGFpbmVyLmluamVjdG9yLCBbdGhpcy50ZW1wbGF0ZVZpZXcucm9vdE5vZGVzXVxuICAgICk7XG4gICAgdGhpcy5lbGVtID0gY29tcG9uZW50UmVmLmluc3RhbmNlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLmluaXRpYWxUZXh0TGVuZ3RoID0gdGhpcy5jdXJyZW50TGVuZ3RoO1xuXG4gICAgdGhpcy5pbmRpY2F0b3JWaWV3ID0gKHR5cGVvZiB0aGlzLmluZGljYXRvciAhPT0gJ3N0cmluZycpID8gdGhpcy5pbmRpY2F0b3IuY3JlYXRlRW1iZWRkZWRWaWV3KHt9KSA6IG51bGw7XG4gICAgaWYgKHRoaXMuaW5kaWNhdG9yVmlldykge1xuICAgICAgdGhpcy5pbmRpY2F0b3JWaWV3LmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBTZXQgdXAgYW4gZXZlbnQgbGlzdGVuZXIgdG8gY2FsbCBhcHBseUVsbGlwc2lzKCkgd2hlbmV2ZXIgYSByZXNpemUgaGFzIGJlZW4gcmVnaXN0ZXJlZC5cbiAgICogVGhlIHR5cGUgb2YgdGhlIGxpc3RlbmVyICh3aW5kb3cvZWxlbWVudCkgZGVwZW5kcyBvbiB0aGUgYGVsbGlwc2lzUmVzaXplRGV0ZWN0aW9uYC5cbiAgICovXG4gIHByaXZhdGUgYWRkUmVzaXplTGlzdGVuZXIoKSB7XG4gICAgc3dpdGNoICh0aGlzLnJlc2l6ZURldGVjdGlvbikge1xuICAgICAgY2FzZSBFbGxpcHNpc1Jlc2l6ZURldGVjdGlvbkVudW0uTWFudWFsOlxuICAgICAgICAvLyBVc2VycyB3aWxsIHRyaWdnZXIgYXBwbHlFbGxpcHNpcyB2aWEgdGhlIHB1YmxpYyBBUElcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVsbGlwc2lzUmVzaXplRGV0ZWN0aW9uRW51bS5XaW5kb3c6XG4gICAgICAgIHRoaXMuYWRkV2luZG93UmVzaXplTGlzdGVuZXIoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAodHlwZW9mIChjb25zb2xlKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFxuICAgICAgICAgICAgTm8gc3VjaCBlbGxpcHNpc1Jlc2l6ZURldGVjdGlvbiBzdHJhdGVneTogJyR7dGhpcy5yZXNpemVEZXRlY3Rpb259Jy5cbiAgICAgICAgICAgIFVzaW5nICcke0VsbGlwc2lzUmVzaXplRGV0ZWN0aW9uRW51bS5SZXNpemVPYnNlcnZlcn0nIGluc3RlYWQuXG4gICAgICAgICAgYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNpemVEZXRlY3Rpb24gPSBFbGxpcHNpc1Jlc2l6ZURldGVjdGlvbkVudW0uUmVzaXplT2JzZXJ2ZXI7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICAgIGNhc2UgRWxsaXBzaXNSZXNpemVEZXRlY3Rpb25FbnVtLlJlc2l6ZU9ic2VydmVyOlxuICAgICAgICB0aGlzLmFkZFJlc2l6ZU9ic2VydmVyKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdXAgYW4gZXZlbnQgbGlzdGVuZXIgdG8gY2FsbCBhcHBseUVsbGlwc2lzKCkgd2hlbmV2ZXIgdGhlIHdpbmRvdyBnZXRzIHJlc2l6ZWQuXG4gICAqL1xuICBwcml2YXRlIGFkZFdpbmRvd1Jlc2l6ZUxpc3RlbmVyKCkge1xuICAgIGNvbnN0IHJlbW92ZVdpbmRvd1Jlc2l6ZUxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdyZXNpemUnLCAoKSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmFwcGx5RWxsaXBzaXMoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZW1vdmVSZXNpemVMaXN0ZW5lcnMkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHJlbW92ZVdpbmRvd1Jlc2l6ZUxpc3RlbmVyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBhbiBldmVudCBsaXN0ZW5lciB0byBjYWxsIGFwcGx5RWxsaXBzaXMoKSB3aGVuZXZlciBSZXNpemVPYnNlcnZlciBpcyB0cmlnZ2VyZWQgZm9yIHRoZSBlbGVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRSZXNpemVPYnNlcnZlcigpIHtcbiAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXNEaW1lbnNpb25zLndpZHRoICE9PSB0aGlzLmVsZW0uY2xpZW50V2lkdGggfHwgdGhpcy5wcmV2aW91c0RpbWVuc2lvbnMuaGVpZ2h0ICE9PSB0aGlzLmVsZW0uY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlFbGxpcHNpcygpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5wcmV2aW91c0RpbWVuc2lvbnMud2lkdGggPSB0aGlzLmVsZW0uY2xpZW50V2lkdGg7XG4gICAgICAgICAgdGhpcy5wcmV2aW91c0RpbWVuc2lvbnMuaGVpZ2h0ID0gdGhpcy5lbGVtLmNsaWVudEhlaWdodDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW0pO1xuICAgIHRoaXMucmVtb3ZlUmVzaXplTGlzdGVuZXJzJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCkpO1xuICB9XG5cblxuICAvKipcbiAgICogR2V0IHRoZSBvcmlnaW5hbCB0ZXh0J3MgdHJ1bmNhdGVkIHZlcnNpb24uIElmIHRoZSB0ZXh0IHJlYWxseSBuZWVkZWQgdG9cbiAgICogYmUgdHJ1bmNhdGVkLCB0aGlzLmVsbGlwc2lzQ2hhcmFjdGVycyB3aWxsIGJlIGFwcGVuZGVkLlxuICAgKiBAcGFyYW0gbWF4IHRoZSBtYXhpbXVtIGxlbmd0aCB0aGUgdGV4dCBtYXkgaGF2ZVxuICAgKiBAcmV0dXJucyB0aGUgdGV4dCBub2RlIHRoYXQgaGFzIGJlZW4gdHJ1bmNhdGVkIG9yIG51bGwgaWYgdHJ1bmNhdGluZyB3YXNuJ3QgcmVxdWlyZWRcbiAgICovXG4gIHByaXZhdGUgdHJ1bmNhdGVDb250ZW50cyhtYXg6IG51bWJlcik6IE5vZGUge1xuICAgIHRoaXMucmVzdG9yZVZpZXcoKTtcbiAgICBjb25zdCBub2RlcyA9IDwoSFRNTEVsZW1lbnQgfCBDaGFyYWN0ZXJEYXRhKVtdPnRoaXMuZmxhdHRlblRleHRBbmRFbGVtZW50Tm9kZXModGhpcy5lbGVtKVxuICAgICAgLmZpbHRlcihub2RlID0+IFtOb2RlLlRFWFRfTk9ERSwgTm9kZS5FTEVNRU5UX05PREVdLmluY2x1ZGVzKG5vZGUubm9kZVR5cGUpKTtcblxuICAgIGxldCBmb3VuZEluZGV4ID0gLTE7XG4gICAgbGV0IGZvdW5kTm9kZTogTm9kZTtcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5pbml0aWFsVGV4dExlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gbm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTtcblxuICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKSB7XG4gICAgICAgIG9mZnNldCAtPSBub2RlLmRhdGEubGVuZ3RoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2Zmc2V0LS07XG4gICAgICB9XG5cbiAgICAgIGlmIChvZmZzZXQgPD0gbWF4KSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YSkge1xuICAgICAgICAgIGlmICh0aGlzLndvcmRCb3VuZGFyaWVzID09PSAnW10nICYmICF0aGlzLm1heVRydW5jYXRlQXRGbikge1xuICAgICAgICAgICAgbm9kZS5kYXRhID0gbm9kZS5kYXRhLnN1YnN0cigwLCBtYXggLSBvZmZzZXQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAobWF4IC0gb2Zmc2V0ICE9PSBub2RlLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgaiA9IG1heCAtIG9mZnNldCAtIDE7XG4gICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgIGogPiAwICYmIChcbiAgICAgICAgICAgICAgICAodGhpcy53b3JkQm91bmRhcmllcyAhPT0gJ1tdJyAmJiAhbm9kZS5kYXRhLmNoYXJBdChqKS5tYXRjaCh0aGlzLndvcmRCb3VuZGFyaWVzKSkgfHxcbiAgICAgICAgICAgICAgICAodGhpcy5tYXlUcnVuY2F0ZUF0Rm4gJiYgIXRoaXMubWF5VHJ1bmNhdGVBdEZuKG5vZGUsIGopKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9mZnNldCA+IDAgJiYgaiA9PT0gMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUuZGF0YSA9IG5vZGUuZGF0YS5zdWJzdHIoMCwgaik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvdW5kSW5kZXggPSBpO1xuICAgICAgICBmb3VuZE5vZGUgPSBub2RlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gZm91bmRJbmRleCArIDE7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgaWYgKG5vZGUudGV4dENvbnRlbnQgIT09ICcnICYmIG5vZGUucGFyZW50RWxlbWVudCAhPT0gdGhpcy5lbGVtICYmIG5vZGUucGFyZW50RWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBub2RlLnBhcmVudEVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAodGhpcy5jdXJyZW50TGVuZ3RoICE9PSB0aGlzLmluaXRpYWxUZXh0TGVuZ3RoKSA/IGZvdW5kTm9kZSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldCBjdXJyZW50TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZmxhdHRlblRleHRBbmRFbGVtZW50Tm9kZXModGhpcy5lbGVtKVxuICAgICAgLmZpbHRlcihub2RlID0+IFtOb2RlLlRFWFRfTk9ERSwgTm9kZS5FTEVNRU5UX05PREVdLmluY2x1ZGVzKG5vZGUubm9kZVR5cGUpKVxuICAgICAgLm1hcChub2RlID0+IChub2RlIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YSkgPyBub2RlLmRhdGEubGVuZ3RoIDogMSlcbiAgICAgIC5yZWR1Y2UoKHN1bSwgbGVuZ3RoKSA9PiBzdW0gKyBsZW5ndGgsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJ1bmNhdGVkIHRleHQgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBpbm5lciBkaXZcbiAgICogQHBhcmFtIG1heCB0aGUgbWF4aW11bSBsZW5ndGggdGhlIHRleHQgbWF5IGhhdmVcbiAgICogQHBhcmFtIGFkZE1vcmVMaXN0ZW5lcj1mYWxzZSBsaXN0ZW4gZm9yIGNsaWNrIG9uIHRoZSBlbGxpcHNpc0NoYXJhY3RlcnMgYW5jaG9yIHRhZyBpZiB0aGUgdGV4dCBoYXMgYmVlbiB0cnVuY2F0ZWRcbiAgICovXG4gIHByaXZhdGUgdHJ1bmNhdGVUZXh0KG1heDogbnVtYmVyKSB7XG4gICAgY29uc3QgdHJ1bmNhdGVkTm9kZSA9IHRoaXMudHJ1bmNhdGVDb250ZW50cyhtYXgpO1xuXG4gICAgaWYgKHRydW5jYXRlZE5vZGUpIHtcbiAgICAgIGlmICghdGhpcy5pbmRpY2F0b3JWaWV3KSB7XG4gICAgICAgIGlmICh0cnVuY2F0ZWROb2RlIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YSkge1xuICAgICAgICAgIHRydW5jYXRlZE5vZGUuZGF0YSArPSA8c3RyaW5nPiB0aGlzLmluZGljYXRvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZWxlbSwgdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KDxzdHJpbmc+IHRoaXMuaW5kaWNhdG9yKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLmluZGljYXRvclZpZXcucm9vdE5vZGVzKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmVsZW0sIG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogRGlzcGxheSBlbGxpcHNpcyBpbiB0aGUgRWxsaXBzaXNDb250ZW50Q29tcG9uZW50IGlmIHRoZSB0ZXh0IHdvdWxkIGV4Y2VlZCB0aGUgYm91bmRhcmllc1xuICAgKi9cbiAgcHVibGljIGFwcGx5RWxsaXBzaXMoKSB7XG4gICAgLy8gUmVtb3ZlIHRoZSByZXNpemUgbGlzdGVuZXIgYXMgY2hhbmdpbmcgdGhlIGNvbnRhaW5lZCB0ZXh0IHdvdWxkIHRyaWdnZXIgZXZlbnRzOlxuICAgIHRoaXMucmVtb3ZlUmVzaXplTGlzdGVuZXJzJC5uZXh0KCk7XG5cbiAgICAvLyB1cGRhdGUgZnJvbSB0ZW1wbGF0ZXM6XG4gICAgdGhpcy5yZXN0b3JlVmlldygpO1xuXG4gICAgLy8gcmVtZW1iZXIgdGVtcGxhdGUgc3RhdGU6XG4gICAgdGhpcy5wcmV2aW91c1RlbXBsYXRlSHRtbCA9IHRoaXMudGVtcGxhdGVzVG9IdG1sKHRoaXMudGVtcGxhdGVWaWV3LCB0aGlzLmluZGljYXRvclZpZXcpO1xuXG4gICAgLy8gYWJvcnQgaWYgW25lc3RlZEVsbGlwc2lzXT1cImZhbHNlXCIgaGFzIGJlZW4gc2V0XG4gICAgaWYgKCF0aGlzLmFjdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIGJlc3QgbGVuZ3RoIGJ5IHRyaWFsIGFuZCBlcnJvcjpcbiAgICBjb25zdCBtYXhMZW5ndGggPSBOZXN0ZWRFbGxpcHNpc0RpcmVjdGl2ZS5udW1lcmljQmluYXJ5U2VhcmNoKHRoaXMuaW5pdGlhbFRleHRMZW5ndGgsIGN1ckxlbmd0aCA9PiB7XG4gICAgICB0aGlzLnRydW5jYXRlVGV4dChjdXJMZW5ndGgpO1xuICAgICAgcmV0dXJuICF0aGlzLmlzT3ZlcmZsb3dpbmc7XG4gICAgfSk7XG5cbiAgICAvLyBBcHBseSB0aGUgYmVzdCBsZW5ndGg6XG4gICAgdGhpcy50cnVuY2F0ZVRleHQobWF4TGVuZ3RoKTtcblxuICAgIC8vIFJlLWF0dGFjaCB0aGUgcmVzaXplIGxpc3RlbmVyOlxuICAgIHRoaXMuYWRkUmVzaXplTGlzdGVuZXIoKTtcblxuICAgIC8vIEVtaXQgY2hhbmdlIGV2ZW50OlxuICAgIGlmICh0aGlzLmNoYW5nZS5vYnNlcnZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY3VycmVudExlbmd0aCA9IHRoaXMuY3VycmVudExlbmd0aDtcbiAgICAgIHRoaXMuY2hhbmdlLmVtaXQoXG4gICAgICAgIChjdXJyZW50TGVuZ3RoID09PSB0aGlzLmluaXRpYWxUZXh0TGVuZ3RoKSA/IG51bGwgOiBjdXJyZW50TGVuZ3RoXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHRleHQgaXMgZXhjZWVkaW5nIHRoZSBlbGVtZW50J3MgYm91bmRhcmllcyBvciBub3RcbiAgICovXG4gIHByaXZhdGUgZ2V0IGlzT3ZlcmZsb3dpbmcoKTogYm9vbGVhbiB7XG4gICAgLy8gRW5mb3JjZSBoaWRkZW4gb3ZlcmZsb3cgKHJlcXVpcmVkIHRvIGNvbXBhcmUgY2xpZW50IHdpZHRoL2hlaWdodCB3aXRoIHNjcm9sbCB3aWR0aC9oZWlnaHQpXG4gICAgY29uc3QgY3VycmVudE92ZXJmbG93ID0gdGhpcy5lbGVtLnN0eWxlLm92ZXJmbG93O1xuICAgIGlmICghY3VycmVudE92ZXJmbG93IHx8IGN1cnJlbnRPdmVyZmxvdyA9PT0gJ3Zpc2libGUnKSB7XG4gICAgICB0aGlzLmVsZW0uc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICBjb25zdCBpc092ZXJmbG93aW5nID0gdGhpcy5lbGVtLmNsaWVudFdpZHRoIDwgdGhpcy5lbGVtLnNjcm9sbFdpZHRoIC0gMSB8fCB0aGlzLmVsZW0uY2xpZW50SGVpZ2h0IDwgdGhpcy5lbGVtLnNjcm9sbEhlaWdodCAtIDE7XG5cbiAgICAvLyBSZXNldCBvdmVyZmxvdyB0byB0aGUgb3JpZ2luYWwgY29uZmlndXJhdGlvbjpcbiAgICB0aGlzLmVsZW0uc3R5bGUub3ZlcmZsb3cgPSBjdXJyZW50T3ZlcmZsb3c7XG5cbiAgICByZXR1cm4gaXNPdmVyZmxvd2luZztcbiAgfVxuXG59XG4iXX0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLWVsbGlwc2lzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbmVzdGVkLWVsbGlwc2lzL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL25lc3RlZC1lbGxpcHNpcy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osTUFBTSxFQUVOLE1BQU0sRUFDTixXQUFXLEVBQ1gsV0FBVyxFQUNYLGdCQUFnQixFQUNoQix3QkFBd0IsRUFLekIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFFakcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEM7OztHQUdHO0FBS0gsTUFBTSxPQUFPLHVCQUF1QjtJQXFJbEM7O09BRUc7SUFDSCxZQUNtQixXQUFpQyxFQUNqQyxhQUErQixFQUMvQixRQUFrQyxFQUNsQyxRQUFtQixFQUNuQixNQUFjLEVBQ0YsVUFBa0I7UUFMOUIsZ0JBQVcsR0FBWCxXQUFXLENBQXNCO1FBQ2pDLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUNsQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDRixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBL0dqRDs7V0FFRztRQUNLLDJCQUFzQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFnRHJEOzs7O1dBSUc7UUFDc0MsV0FB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Qzs7O1lBcGZGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixRQUFRLEVBQUUsbUJBQW1CO2FBQzlCOzs7WUF0QkMsV0FBVztZQUNYLGdCQUFnQjtZQUNoQix3QkFBd0I7WUFWeEIsU0FBUztZQUlULE1BQU07WUF5S3FDLE1BQU0sdUJBQTlDLE1BQU0sU0FBQyxXQUFXOzs7cUJBOUZwQixLQUFLLFNBQUMsZ0JBQWdCO3dCQU90QixLQUFLLFNBQUMseUJBQXlCOzZCQVEvQixLQUFLLFNBQUMsOEJBQThCOzhCQVVwQyxLQUFLLFNBQUMsK0JBQStCOzhCQU1yQyxLQUFLLFNBQUMsK0JBQStCO3FCQVFyQyxNQUFNLFNBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBSZW5kZXJlcjIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIEluamVjdCxcbiAgUExBVEZPUk1fSUQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIENvbXBvbmVudEZhY3RvcnksXG4gIEVtYmVkZGVkVmlld1JlZixcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgT25Jbml0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3Jlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbCc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZXN0ZWRFbGxpcHNpc0NvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL25lc3RlZC1lbGxpcHNpcy1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbGxpcHNpc1Jlc2l6ZURldGVjdGlvbkVudW0gfSBmcm9tICcuLi9lbnVtcy9lbGxpcHNpcy1yZXNpemUtZGV0ZWN0aW9uLmVudW0nO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBEaXJlY3RpdmUgdG8gdHJ1bmNhdGUgdGhlIGNvbnRhaW5lZCB0ZXh0LCBpZiBpdCBleGNlZWRzIHRoZSBlbGVtZW50J3MgYm91bmRhcmllc1xuICogYW5kIGFwcGVuZCBjaGFyYWN0ZXJzIChjb25maWd1cmFibGUsIGRlZmF1bHQgJy4uLicpIGlmIHNvLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmVzdGVkRWxsaXBzaXNdJyxcbiAgZXhwb3J0QXM6ICduZ3hOZXN0ZWRFbGxpcHNpcydcbn0pXG5leHBvcnQgY2xhc3MgTmVzdGVkRWxsaXBzaXNEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG4gIC8qKlxuICAgKiBUaGUgcmVmZXJlbmNlZCBlbGVtZW50XG4gICAqL1xuICBwcml2YXRlIGVsZW06IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBDb21wb25lbnQgZmFjdG9yeSByZXF1aXJlZCBmb3IgcmVuZGVyaW5nIEVsbGlwc2lzQ29udGVudCBjb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgY29tcEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8TmVzdGVkRWxsaXBzaXNDb250ZW50Q29tcG9uZW50PjtcblxuICAvKipcbiAgICogVmlld1JlZiBvZiB0aGUgbWFpbiB0ZW1wbGF0ZSAodGhlIG9uZSB0byBiZSB0cnVuY2F0ZWQpXG4gICAqL1xuICBwcml2YXRlIHRlbXBsYXRlVmlldzogRW1iZWRkZWRWaWV3UmVmPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBWaWV3UmVmIG9mIHRoZSBpbmRpY2F0b3IgdGVtcGxhdGVcbiAgICovXG4gIHByaXZhdGUgaW5kaWNhdG9yVmlldzogRW1iZWRkZWRWaWV3UmVmPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDb25jYXRlbmF0ZWQgdGVtcGxhdGUgaHRtbCBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBlbGxpcHNpcyBoYXMgYmVlbiBhcHBsaWVkXG4gICAqL1xuICBwcml2YXRlIHByZXZpb3VzVGVtcGxhdGVIdG1sOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRleHQgbGVuZ3RoIGJlZm9yZSB0cnVuY2F0aW5nXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxUZXh0TGVuZ3RoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFN1YmplY3QgdHJpZ2dlcmVkIHdoZW4gcmVzaXplIGxpc3RlbmVycyBzaG91bGQgYmUgcmVtb3ZlZFxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVSZXNpemVMaXN0ZW5lcnMkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIHByZXZpb3VzRGltZW5zaW9uczoge1xuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgc2Nyb2xsV2lkdGg6IG51bWJlcixcbiAgICBzY3JvbGxIZWlnaHQ6IG51bWJlclxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgbmd4TmVzdGVkRWxsaXBzaXMgaHRtbCBhdHRyaWJ1dGVcbiAgICogUGFzc2luZyB0cnVlIChkZWZhdWx0KSB3aWxsIHBlcmZvcm0gdGhlIGRpcmVjdGl2ZSdzIHRhc2ssXG4gICAqIG90aGVyd2lzZSB0aGUgdGVtcGxhdGUgd2lsbCBiZSByZW5kZXJlZCB3aXRob3V0IHRydW5jYXRpbmcgaXRzIGNvbnRlbnRzLlxuICAgKi9cbiAgQElucHV0KCduZXN0ZWRFbGxpcHNpcycpIGFjdGl2ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGVsbGlwc2lzSW5kaWNhdG9yIGh0bWwgYXR0cmlidXRlXG4gICAqIFBhc3NpbmcgYSBzdHJpbmcgKGRlZmF1bHQ6ICcuLi4nKSB3aWxsIGFwcGVuZCBpdCB3aGVuIHRoZSBwYXNzZWQgdGVtcGxhdGUgaGFzIGJlZW4gdHJ1bmNhdGVkXG4gICAqIFBhc3NpbmcgYSB0ZW1wbGF0ZSB3aWxsIGFwcGVuZCB0aGF0IHRlbXBsYXRlIGluc3RlYWRcbiAgICovXG4gIEBJbnB1dCgnbmVzdGVkRWxsaXBzaXNJbmRpY2F0b3InKSBpbmRpY2F0b3I6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBUaGUgZWxsaXBzaXNXb3JkQm91bmRhcmllcyBodG1sIGF0dHJpYnV0ZVxuICAgKiBFYWNoIGNoYXJhY3RlciBwYXNzZWQgdG8gdGhpcyBpbnB1dCB3aWxsIGJlIGludGVycHJldGVkXG4gICAqIGFzIGEgd29yZCBib3VuZGFyeSBhdCB3aGljaCB0aGUgdGV4dCBtYXkgYmUgdHJ1bmNhdGVkLlxuICAgKiBFbHNlIHRoZSB0ZXh0IG1heSBiZSB0cnVuY2F0ZWQgYXQgYW55IGNoYXJhY3Rlci5cbiAgICovXG4gIEBJbnB1dCgnbmVzdGVkRWxsaXBzaXNXb3JkQm91bmRhcmllcycpIHdvcmRCb3VuZGFyaWVzOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGxpcHNpc01heVRydW5jYXRlQXRGbiBodG1sIGF0dHJpYnV0ZVxuICAgKiBGdW5jdGlvbiB0aGF0IGxldHMgeW91IHNwZWNpZnkgd2hldGhlciB0aGUgY29udGVudHMgbWF5IGJlIHRydW5jYXRlZCBhdCBhIHNwZWNpZmljIHBvaW50IG9yIG5vdDpcbiAgICogYChub2RlOiBDaGFyYWN0ZXJEYXRhLCBwb3NpdGlvbjogbnVtYmVyKSA9PiBib29sZWFuYFxuICAgKiBgbm9kZWAgVGV4dCBub2RlIHRoYXQgaXMgYmVpbmcgdHJ1bmNhdGVkXG4gICAqIGBwb3NpdGlvbmAgU3RyaW5nIHBvc2l0aW9uIHRoZSB0ZXh0IHdvdWxkIGJlIHRydW5jYXRlZCBhdFxuICAgKiBTaG91bGQgcmV0dXJuIHRydWUsIGlmIHRoZSB0ZXh0IG1heSBiZSB0cnVuY2F0ZWQgaGVyZSwgZWxzZSBmYWxzZVxuICAgKi9cbiAgQElucHV0KCduZXN0ZWRFbGxpcHNpc01heVRydW5jYXRlQXRGbicpIG1heVRydW5jYXRlQXRGbjogKG5vZGU6IENoYXJhY3RlckRhdGEsIHBvc2l0aW9uOiBudW1iZXIpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBlbGxpcHNpc1Jlc2l6ZURldGVjdGlvbiBodG1sIGF0dHJpYnV0ZVxuICAgKiBBbGdvcml0aG0gdG8gdXNlIHRvIGRldGVjdCBlbGVtZW50L3dpbmRvdyByZXNpemUgLSBhbnkgdmFsdWUgb2YgYEVsbGlwc2lzUmVzaXplRGV0ZWN0aW9uRW51bWBcbiAgICovXG4gIEBJbnB1dCgnbmVzdGVkRWxsaXBzaXNSZXNpemVEZXRlY3Rpb24nKSByZXNpemVEZXRlY3Rpb246IEVsbGlwc2lzUmVzaXplRGV0ZWN0aW9uRW51bTtcblxuXG4gIC8qKlxuICAgKiBUaGUgZWxsaXBzaXNDaGFuZ2UgaHRtbCBhdHRyaWJ1dGVcbiAgICogVGhpcyBlbWl0cyBhZnRlciB3aGljaCBpbmRleCB0aGUgdGV4dCBoYXMgYmVlbiB0cnVuY2F0ZWQuXG4gICAqIElmIGl0IGhhc24ndCBiZWVuIHRydW5jYXRlZCwgbnVsbCBpcyBlbWl0dGVkLlxuICAgKi9cbiAgQE91dHB1dCgnbmVzdGVkRWxsaXBzaXNDaGFuZ2UnKSByZWFkb25seSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBVdGlsaXR5IG1ldGhvZCB0byBxdWlja2x5IGZpbmQgdGhlIGxhcmdlc3QgbnVtYmVyIGZvclxuICAgKiB3aGljaCBgY2FsbGJhY2sobnVtYmVyKWAgc3RpbGwgcmV0dXJucyB0cnVlLlxuICAgKiBAcGFyYW0gIG1heCAgICAgIEhpZ2hlc3QgcG9zc2libGUgbnVtYmVyXG4gICAqIEBwYXJhbSAgY2FsbGJhY2sgU2hvdWxkIHJldHVybiB0cnVlIGFzIGxvbmcgYXMgdGhlIHBhc3NlZCBudW1iZXIgaXMgdmFsaWRcbiAgICogQHJldHVybnMgICAgICAgICBMYXJnZXN0IHBvc3NpYmxlIG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgbnVtZXJpY0JpbmFyeVNlYXJjaChtYXg6IG51bWJlciwgY2FsbGJhY2s6IChuOiBudW1iZXIpID0+IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIGxldCBsb3cgPSAwO1xuICAgIGxldCBoaWdoID0gbWF4O1xuICAgIGxldCBiZXN0ID0gLTE7XG4gICAgbGV0IG1pZDogbnVtYmVyO1xuXG4gICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7XG4gICAgICBtaWQgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY2FsbGJhY2sobWlkKTtcbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIGhpZ2ggPSBtaWQgLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmVzdCA9IG1pZDtcbiAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYmVzdDtcbiAgfVxuXG4gIHByaXZhdGUgZmxhdHRlblRleHRBbmRFbGVtZW50Tm9kZXMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiAoQ2hhcmFjdGVyRGF0YSB8IEhUTUxFbGVtZW50KVtdIHtcbiAgICBjb25zdCBub2RlczogKENoYXJhY3RlckRhdGEgfCBIVE1MRWxlbWVudClbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGVsZW1lbnQuY2hpbGROb2Rlcy5pdGVtKGkpO1xuICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgY2hpbGQgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKSB7XG4gICAgICAgIG5vZGVzLnB1c2goY2hpbGQpO1xuXG4gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgbm9kZXMucHVzaCguLi50aGlzLmZsYXR0ZW5UZXh0QW5kRWxlbWVudE5vZGVzKGNoaWxkKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZXM7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aXZlJ3MgY29uc3RydWN0b3JcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx1bmtub3duPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0XG4gICkgeyB9XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIncyBvbkluaXQgbGlmZSBjeWNsZSBob29rLlxuICAgKiBJbml0aWFsaXplcyB0aGUgZWxlbWVudCBmb3IgZGlzcGxheWluZyB0aGUgZWxsaXBzaXMuXG4gICAqL1xuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIC8vIGluIGFuZ3VsYXIgdW5pdmVyc2FsIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSB1Z2x5XG4gICAgICAvLyBET00gbWFuaXB1bGF0aW9uIHByb3BlcnRpZXMgd2Ugc2FkbHkgbmVlZCB0byBhY2Nlc3MgaGVyZSxcbiAgICAgIC8vIHNvIHdhaXQgdW50aWwgd2UncmUgaW4gdGhlIGJyb3dzZXI6XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZih0aGlzLmFjdGl2ZSkgIT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YodGhpcy5pbmRpY2F0b3IpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5pbmRpY2F0b3IgPSAnLi4uJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mICh0aGlzLnJlc2l6ZURldGVjdGlvbikgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnJlc2l6ZURldGVjdGlvbiA9IEVsbGlwc2lzUmVzaXplRGV0ZWN0aW9uRW51bS5SZXNpemVPYnNlcnZlcjtcbiAgICB9XG5cbiAgICAvLyBwZXJmb3JtIHJlZ2V4IHJlcGxhY2Ugb24gd29yZCBib3VuZGFyaWVzOlxuICAgIGlmICghdGhpcy53b3JkQm91bmRhcmllcykge1xuICAgICAgdGhpcy53b3JkQm91bmRhcmllcyA9ICcnO1xuICAgIH1cbiAgICB0aGlzLndvcmRCb3VuZGFyaWVzID0gJ1snICsgdGhpcy53b3JkQm91bmRhcmllcy5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKSArICddJztcblxuICAgIC8vIGluaXRpYWxpemUgdmlldzpcbiAgICB0aGlzLmNvbXBGYWN0b3J5ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShOZXN0ZWRFbGxpcHNpc0NvbnRlbnRDb21wb25lbnQpO1xuICAgIHRoaXMucmVzdG9yZVZpZXcoKTtcbiAgICB0aGlzLnByZXZpb3VzRGltZW5zaW9ucyA9IHtcbiAgICAgIHdpZHRoOiB0aGlzLmVsZW0uY2xpZW50V2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuZWxlbS5jbGllbnRIZWlnaHQsXG4gICAgICBzY3JvbGxXaWR0aDogdGhpcy5lbGVtLnNjcm9sbFdpZHRoLFxuICAgICAgc2Nyb2xsSGVpZ2h0OiB0aGlzLmVsZW0uc2Nyb2xsSGVpZ2h0XG4gICAgfTtcblxuICAgIHRoaXMuYXBwbHlFbGxpcHNpcygpO1xuICB9XG5cblxuICAvKipcbiAgICogQW5ndWxhcidzIGRlc3Ryb3kgbGlmZSBjeWNsZSBob29rLlxuICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAqL1xuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnJlbW92ZVJlc2l6ZUxpc3RlbmVycyQubmV4dCgpO1xuICAgIHRoaXMucmVtb3ZlUmVzaXplTGlzdGVuZXJzJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIncyBhZnRlclZpZXdDaGVja2VkIGxpZmUgY3ljbGUgaG9vay5cbiAgICogUmVhcHBseSBlbGxpcHNpcywgaWYgYW55IG9mIHRoZSB0ZW1wbGF0ZXMgaGF2ZSBjaGFuZ2VkXG4gICAqL1xuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMucmVzaXplRGV0ZWN0aW9uICE9PSAnbWFudWFsJykge1xuICAgICAgaWYgKHRoaXMudGVtcGxhdGVzSGF2ZUNoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5hcHBseUVsbGlwc2lzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBsaXN0IG9mIE5vZGVzIHRvIGh0bWxcbiAgICogQHBhcmFtIG5vZGVzIE5vZGVzIHRvIGNvbnZlcnRcbiAgICogQHJldHVybnMgaHRtbCBjb2RlXG4gICAqL1xuICBwcml2YXRlIG5vZGVzVG9IdG1sKG5vZGVzOiBOb2RlW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpdiA9IDxIVE1MRWxlbWVudD4gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuYXBwZW5kKC4uLm5vZGVzLm1hcChub2RlID0+IG5vZGUuY2xvbmVOb2RlKHRydWUpKSk7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGUgcGFzc2VkIHRlbXBsYXRlcyB0byBodG1sXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZVZpZXcgdGhlIG1haW4gdGVtcGxhdGUgdmlldyByZWZcbiAgICogQHBhcmFtIGluZGljYXRvclZpZXcgdGhlIGluZGljYXRvciB0ZW1wbGF0ZSB2aWV3IHJlZlxuICAgKiBAcmV0dXJucyBjb25jYXRlbmF0ZWQgdGVtcGxhdGUgaHRtbFxuICAgKi9cbiAgcHJpdmF0ZSB0ZW1wbGF0ZXNUb0h0bWwodGVtcGxhdGVWaWV3OiBFbWJlZGRlZFZpZXdSZWY8dW5rbm93bj4sIGluZGljYXRvclZpZXc/OiBFbWJlZGRlZFZpZXdSZWY8dW5rbm93bj4pOiBzdHJpbmcge1xuICAgIGxldCBodG1sID0gdGhpcy5ub2Rlc1RvSHRtbCh0ZW1wbGF0ZVZpZXcucm9vdE5vZGVzKTtcbiAgICBpZiAoaW5kaWNhdG9yVmlldykge1xuICAgICAgaHRtbCArPSB0aGlzLm5vZGVzVG9IdG1sKGluZGljYXRvclZpZXcucm9vdE5vZGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaHRtbCArPSA8c3RyaW5nPiB0aGlzLmluZGljYXRvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFueSBvZiB0aGUgcGFzc2VkIHRlbXBsYXRlcyBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZVxuICAgKiB0aGUgZWxsaXBzaXMgaGFzIGJlZW4gYXBwbGllZFxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgdGVtcGxhdGVzSGF2ZUNoYW5nZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlVmlldyB8fCAhdGhpcy5wcmV2aW91c1RlbXBsYXRlSHRtbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlVmlldyA9IHRoaXMudGVtcGxhdGVSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHt9KTtcbiAgICB0ZW1wbGF0ZVZpZXcuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgY29uc3QgaW5kaWNhdG9yVmlldyA9ICh0eXBlb2YgdGhpcy5pbmRpY2F0b3IgIT09ICdzdHJpbmcnKSA/IHRoaXMuaW5kaWNhdG9yLmNyZWF0ZUVtYmVkZGVkVmlldyh7fSkgOiBudWxsO1xuICAgIGlmIChpbmRpY2F0b3JWaWV3KSB7XG4gICAgICBpbmRpY2F0b3JWaWV3LmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wbGF0ZUh0bWwgPSB0aGlzLnRlbXBsYXRlc1RvSHRtbCh0ZW1wbGF0ZVZpZXcsIGluZGljYXRvclZpZXcpO1xuXG4gICAgcmV0dXJuIHRoaXMucHJldmlvdXNUZW1wbGF0ZUh0bWwgIT09IHRlbXBsYXRlSHRtbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIHRoZSB2aWV3IGZyb20gdGhlIHRlbXBsYXRlcyAobm9uLXRydW5jYXRlZClcbiAgICovXG4gIHByaXZhdGUgcmVzdG9yZVZpZXcoKSB7XG4gICAgdGhpcy52aWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgdGhpcy50ZW1wbGF0ZVZpZXcgPSB0aGlzLnRlbXBsYXRlUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh7fSk7XG4gICAgdGhpcy50ZW1wbGF0ZVZpZXcuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoXG4gICAgICB0aGlzLmNvbXBGYWN0b3J5LCBudWxsLCB0aGlzLnZpZXdDb250YWluZXIuaW5qZWN0b3IsIFt0aGlzLnRlbXBsYXRlVmlldy5yb290Tm9kZXNdXG4gICAgKTtcbiAgICB0aGlzLmVsZW0gPSBjb21wb25lbnRSZWYuaW5zdGFuY2UuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuaW5pdGlhbFRleHRMZW5ndGggPSB0aGlzLmN1cnJlbnRMZW5ndGg7XG5cbiAgICB0aGlzLmluZGljYXRvclZpZXcgPSAodHlwZW9mIHRoaXMuaW5kaWNhdG9yICE9PSAnc3RyaW5nJykgPyB0aGlzLmluZGljYXRvci5jcmVhdGVFbWJlZGRlZFZpZXcoe30pIDogbnVsbDtcbiAgICBpZiAodGhpcy5pbmRpY2F0b3JWaWV3KSB7XG4gICAgICB0aGlzLmluZGljYXRvclZpZXcuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIFNldCB1cCBhbiBldmVudCBsaXN0ZW5lciB0byBjYWxsIGFwcGx5RWxsaXBzaXMoKSB3aGVuZXZlciBhIHJlc2l6ZSBoYXMgYmVlbiByZWdpc3RlcmVkLlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgbGlzdGVuZXIgKHdpbmRvdy9lbGVtZW50KSBkZXBlbmRzIG9uIHRoZSBgZWxsaXBzaXNSZXNpemVEZXRlY3Rpb25gLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRSZXNpemVMaXN0ZW5lcigpIHtcbiAgICBzd2l0Y2ggKHRoaXMucmVzaXplRGV0ZWN0aW9uKSB7XG4gICAgICBjYXNlIEVsbGlwc2lzUmVzaXplRGV0ZWN0aW9uRW51bS5NYW51YWw6XG4gICAgICAgIC8vIFVzZXJzIHdpbGwgdHJpZ2dlciBhcHBseUVsbGlwc2lzIHZpYSB0aGUgcHVibGljIEFQSVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRWxsaXBzaXNSZXNpemVEZXRlY3Rpb25FbnVtLldpbmRvdzpcbiAgICAgICAgdGhpcy5hZGRXaW5kb3dSZXNpemVMaXN0ZW5lcigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICh0eXBlb2YgKGNvbnNvbGUpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgXG4gICAgICAgICAgICBObyBzdWNoIGVsbGlwc2lzUmVzaXplRGV0ZWN0aW9uIHN0cmF0ZWd5OiAnJHt0aGlzLnJlc2l6ZURldGVjdGlvbn0nLlxuICAgICAgICAgICAgVXNpbmcgJyR7RWxsaXBzaXNSZXNpemVEZXRlY3Rpb25FbnVtLlJlc2l6ZU9ic2VydmVyfScgaW5zdGVhZC5cbiAgICAgICAgICBgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2l6ZURldGVjdGlvbiA9IEVsbGlwc2lzUmVzaXplRGV0ZWN0aW9uRW51bS5SZXNpemVPYnNlcnZlcjtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgICAgY2FzZSBFbGxpcHNpc1Jlc2l6ZURldGVjdGlvbkVudW0uUmVzaXplT2JzZXJ2ZXI6XG4gICAgICAgIHRoaXMuYWRkUmVzaXplT2JzZXJ2ZXIoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBhbiBldmVudCBsaXN0ZW5lciB0byBjYWxsIGFwcGx5RWxsaXBzaXMoKSB3aGVuZXZlciB0aGUgd2luZG93IGdldHMgcmVzaXplZC5cbiAgICovXG4gIHByaXZhdGUgYWRkV2luZG93UmVzaXplTGlzdGVuZXIoKSB7XG4gICAgY29uc3QgcmVtb3ZlV2luZG93UmVzaXplTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ3Jlc2l6ZScsICgpID0+IHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwbHlFbGxpcHNpcygpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbW92ZVJlc2l6ZUxpc3RlbmVycyQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4gcmVtb3ZlV2luZG93UmVzaXplTGlzdGVuZXIoKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGNhbGwgYXBwbHlFbGxpcHNpcygpIHdoZW5ldmVyIFJlc2l6ZU9ic2VydmVyIGlzIHRyaWdnZXJlZCBmb3IgdGhlIGVsZW1lbnQuXG4gICAqL1xuICBwcml2YXRlIGFkZFJlc2l6ZU9ic2VydmVyKCkge1xuICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5wcmV2aW91c0RpbWVuc2lvbnMud2lkdGggIT09IHRoaXMuZWxlbS5jbGllbnRXaWR0aFxuICAgICAgICAgIHx8IHRoaXMucHJldmlvdXNEaW1lbnNpb25zLmhlaWdodCAhPT0gdGhpcy5lbGVtLmNsaWVudEhlaWdodFxuICAgICAgICAgIHx8IHRoaXMucHJldmlvdXNEaW1lbnNpb25zLnNjcm9sbFdpZHRoICE9PSB0aGlzLmVsZW0uc2Nyb2xsV2lkdGhcbiAgICAgICAgICB8fCB0aGlzLnByZXZpb3VzRGltZW5zaW9ucy5zY3JvbGxIZWlnaHQgIT09IHRoaXMuZWxlbS5zY3JvbGxIZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlFbGxpcHNpcygpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5wcmV2aW91c0RpbWVuc2lvbnMud2lkdGggPSB0aGlzLmVsZW0uY2xpZW50V2lkdGg7XG4gICAgICAgICAgdGhpcy5wcmV2aW91c0RpbWVuc2lvbnMuaGVpZ2h0ID0gdGhpcy5lbGVtLmNsaWVudEhlaWdodDtcbiAgICAgICAgICB0aGlzLnByZXZpb3VzRGltZW5zaW9ucy5zY3JvbGxXaWR0aCA9IHRoaXMuZWxlbS5zY3JvbGxXaWR0aDtcbiAgICAgICAgICB0aGlzLnByZXZpb3VzRGltZW5zaW9ucy5zY3JvbGxIZWlnaHQgPSB0aGlzLmVsZW0uc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuZWxlbSk7XG4gICAgdGhpcy5yZW1vdmVSZXNpemVMaXN0ZW5lcnMkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG9yaWdpbmFsIHRleHQncyB0cnVuY2F0ZWQgdmVyc2lvbi4gSWYgdGhlIHRleHQgcmVhbGx5IG5lZWRlZCB0b1xuICAgKiBiZSB0cnVuY2F0ZWQsIHRoaXMuZWxsaXBzaXNDaGFyYWN0ZXJzIHdpbGwgYmUgYXBwZW5kZWQuXG4gICAqIEBwYXJhbSBtYXggdGhlIG1heGltdW0gbGVuZ3RoIHRoZSB0ZXh0IG1heSBoYXZlXG4gICAqIEByZXR1cm5zIHRoZSB0ZXh0IG5vZGUgdGhhdCBoYXMgYmVlbiB0cnVuY2F0ZWQgb3IgbnVsbCBpZiB0cnVuY2F0aW5nIHdhc24ndCByZXF1aXJlZFxuICAgKi9cbiAgcHJpdmF0ZSB0cnVuY2F0ZUNvbnRlbnRzKG1heDogbnVtYmVyKTogTm9kZSB7XG4gICAgdGhpcy5yZXN0b3JlVmlldygpO1xuICAgIGNvbnN0IG5vZGVzID0gPChIVE1MRWxlbWVudCB8IENoYXJhY3RlckRhdGEpW10+dGhpcy5mbGF0dGVuVGV4dEFuZEVsZW1lbnROb2Rlcyh0aGlzLmVsZW0pXG4gICAgICAuZmlsdGVyKG5vZGUgPT4gW05vZGUuVEVYVF9OT0RFLCBOb2RlLkVMRU1FTlRfTk9ERV0uaW5jbHVkZXMobm9kZS5ub2RlVHlwZSkpO1xuXG4gICAgbGV0IGZvdW5kSW5kZXggPSAtMTtcbiAgICBsZXQgZm91bmROb2RlOiBOb2RlO1xuICAgIGxldCBvZmZzZXQgPSB0aGlzLmluaXRpYWxUZXh0TGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSBub2Rlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuXG4gICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENoYXJhY3RlckRhdGEpIHtcbiAgICAgICAgb2Zmc2V0IC09IG5vZGUuZGF0YS5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvZmZzZXQtLTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9mZnNldCA8PSBtYXgpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMud29yZEJvdW5kYXJpZXMgPT09ICdbXScgJiYgIXRoaXMubWF5VHJ1bmNhdGVBdEZuKSB7XG4gICAgICAgICAgICBub2RlLmRhdGEgPSBub2RlLmRhdGEuc3Vic3RyKDAsIG1heCAtIG9mZnNldCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChtYXggLSBvZmZzZXQgIT09IG5vZGUuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBqID0gbWF4IC0gb2Zmc2V0IC0gMTtcbiAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgaiA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICh0aGlzLndvcmRCb3VuZGFyaWVzICE9PSAnW10nICYmICFub2RlLmRhdGEuY2hhckF0KGopLm1hdGNoKHRoaXMud29yZEJvdW5kYXJpZXMpKSB8fFxuICAgICAgICAgICAgICAgICh0aGlzLm1heVRydW5jYXRlQXRGbiAmJiAhdGhpcy5tYXlUcnVuY2F0ZUF0Rm4obm9kZSwgaikpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCAmJiBqID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZS5kYXRhID0gbm9kZS5kYXRhLnN1YnN0cigwLCBqKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm91bmRJbmRleCA9IGk7XG4gICAgICAgIGZvdW5kTm9kZSA9IG5vZGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSBmb3VuZEluZGV4ICsgMTsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XG4gICAgICBpZiAobm9kZS50ZXh0Q29udGVudCAhPT0gJycgJiYgbm9kZS5wYXJlbnRFbGVtZW50ICE9PSB0aGlzLmVsZW0gJiYgbm9kZS5wYXJlbnRFbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIG5vZGUucGFyZW50RWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnRMZW5ndGggIT09IHRoaXMuaW5pdGlhbFRleHRMZW5ndGgpID8gZm91bmROb2RlIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGN1cnJlbnRMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5mbGF0dGVuVGV4dEFuZEVsZW1lbnROb2Rlcyh0aGlzLmVsZW0pXG4gICAgICAuZmlsdGVyKG5vZGUgPT4gW05vZGUuVEVYVF9OT0RFLCBOb2RlLkVMRU1FTlRfTk9ERV0uaW5jbHVkZXMobm9kZS5ub2RlVHlwZSkpXG4gICAgICAubWFwKG5vZGUgPT4gKG5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKSA/IG5vZGUuZGF0YS5sZW5ndGggOiAxKVxuICAgICAgLnJlZHVjZSgoc3VtLCBsZW5ndGgpID0+IHN1bSArIGxlbmd0aCwgMCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cnVuY2F0ZWQgdGV4dCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGlubmVyIGRpdlxuICAgKiBAcGFyYW0gbWF4IHRoZSBtYXhpbXVtIGxlbmd0aCB0aGUgdGV4dCBtYXkgaGF2ZVxuICAgKiBAcGFyYW0gYWRkTW9yZUxpc3RlbmVyPWZhbHNlIGxpc3RlbiBmb3IgY2xpY2sgb24gdGhlIGVsbGlwc2lzQ2hhcmFjdGVycyBhbmNob3IgdGFnIGlmIHRoZSB0ZXh0IGhhcyBiZWVuIHRydW5jYXRlZFxuICAgKi9cbiAgcHJpdmF0ZSB0cnVuY2F0ZVRleHQobWF4OiBudW1iZXIpIHtcbiAgICBjb25zdCB0cnVuY2F0ZWROb2RlID0gdGhpcy50cnVuY2F0ZUNvbnRlbnRzKG1heCk7XG5cbiAgICBpZiAodHJ1bmNhdGVkTm9kZSkge1xuICAgICAgaWYgKCF0aGlzLmluZGljYXRvclZpZXcpIHtcbiAgICAgICAgaWYgKHRydW5jYXRlZE5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKSB7XG4gICAgICAgICAgdHJ1bmNhdGVkTm9kZS5kYXRhICs9IDxzdHJpbmc+IHRoaXMuaW5kaWNhdG9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbGVtLCB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoPHN0cmluZz4gdGhpcy5pbmRpY2F0b3IpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMuaW5kaWNhdG9yVmlldy5yb290Tm9kZXMpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZWxlbSwgbm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IGVsbGlwc2lzIGluIHRoZSBFbGxpcHNpc0NvbnRlbnRDb21wb25lbnQgaWYgdGhlIHRleHQgd291bGQgZXhjZWVkIHRoZSBib3VuZGFyaWVzXG4gICAqL1xuICBwdWJsaWMgYXBwbHlFbGxpcHNpcygpIHtcbiAgICAvLyBSZW1vdmUgdGhlIHJlc2l6ZSBsaXN0ZW5lciBhcyBjaGFuZ2luZyB0aGUgY29udGFpbmVkIHRleHQgd291bGQgdHJpZ2dlciBldmVudHM6XG4gICAgdGhpcy5yZW1vdmVSZXNpemVMaXN0ZW5lcnMkLm5leHQoKTtcblxuICAgIC8vIHVwZGF0ZSBmcm9tIHRlbXBsYXRlczpcbiAgICB0aGlzLnJlc3RvcmVWaWV3KCk7XG5cbiAgICAvLyByZW1lbWJlciB0ZW1wbGF0ZSBzdGF0ZTpcbiAgICB0aGlzLnByZXZpb3VzVGVtcGxhdGVIdG1sID0gdGhpcy50ZW1wbGF0ZXNUb0h0bWwodGhpcy50ZW1wbGF0ZVZpZXcsIHRoaXMuaW5kaWNhdG9yVmlldyk7XG5cbiAgICAvLyBhYm9ydCBpZiBbbmVzdGVkRWxsaXBzaXNdPVwiZmFsc2VcIiBoYXMgYmVlbiBzZXRcbiAgICBpZiAoIXRoaXMuYWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgYmVzdCBsZW5ndGggYnkgdHJpYWwgYW5kIGVycm9yOlxuICAgIGNvbnN0IG1heExlbmd0aCA9IE5lc3RlZEVsbGlwc2lzRGlyZWN0aXZlLm51bWVyaWNCaW5hcnlTZWFyY2godGhpcy5pbml0aWFsVGV4dExlbmd0aCwgY3VyTGVuZ3RoID0+IHtcbiAgICAgIHRoaXMudHJ1bmNhdGVUZXh0KGN1ckxlbmd0aCk7XG4gICAgICByZXR1cm4gIXRoaXMuaXNPdmVyZmxvd2luZztcbiAgICB9KTtcblxuICAgIC8vIEFwcGx5IHRoZSBiZXN0IGxlbmd0aDpcbiAgICB0aGlzLnRydW5jYXRlVGV4dChtYXhMZW5ndGgpO1xuXG4gICAgLy8gUmUtYXR0YWNoIHRoZSByZXNpemUgbGlzdGVuZXI6XG4gICAgdGhpcy5hZGRSZXNpemVMaXN0ZW5lcigpO1xuXG4gICAgLy8gRW1pdCBjaGFuZ2UgZXZlbnQ6XG4gICAgaWYgKHRoaXMuY2hhbmdlLm9ic2VydmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjdXJyZW50TGVuZ3RoID0gdGhpcy5jdXJyZW50TGVuZ3RoO1xuICAgICAgdGhpcy5jaGFuZ2UuZW1pdChcbiAgICAgICAgKGN1cnJlbnRMZW5ndGggPT09IHRoaXMuaW5pdGlhbFRleHRMZW5ndGgpID8gbnVsbCA6IGN1cnJlbnRMZW5ndGhcbiAgICAgICk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgdGV4dCBpcyBleGNlZWRpbmcgdGhlIGVsZW1lbnQncyBib3VuZGFyaWVzIG9yIG5vdFxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgaXNPdmVyZmxvd2luZygpOiBib29sZWFuIHtcbiAgICAvLyBFbmZvcmNlIGhpZGRlbiBvdmVyZmxvdyAocmVxdWlyZWQgdG8gY29tcGFyZSBjbGllbnQgd2lkdGgvaGVpZ2h0IHdpdGggc2Nyb2xsIHdpZHRoL2hlaWdodClcbiAgICBjb25zdCBjdXJyZW50T3ZlcmZsb3cgPSB0aGlzLmVsZW0uc3R5bGUub3ZlcmZsb3c7XG4gICAgaWYgKCFjdXJyZW50T3ZlcmZsb3cgfHwgY3VycmVudE92ZXJmbG93ID09PSAndmlzaWJsZScpIHtcbiAgICAgIHRoaXMuZWxlbS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgIH1cblxuICAgIGNvbnN0IGlzT3ZlcmZsb3dpbmcgPSB0aGlzLmVsZW0uY2xpZW50V2lkdGggPCB0aGlzLmVsZW0uc2Nyb2xsV2lkdGggLSAxIHx8IHRoaXMuZWxlbS5jbGllbnRIZWlnaHQgPCB0aGlzLmVsZW0uc2Nyb2xsSGVpZ2h0IC0gMTtcblxuICAgIC8vIFJlc2V0IG92ZXJmbG93IHRvIHRoZSBvcmlnaW5hbCBjb25maWd1cmF0aW9uOlxuICAgIHRoaXMuZWxlbS5zdHlsZS5vdmVyZmxvdyA9IGN1cnJlbnRPdmVyZmxvdztcblxuICAgIHJldHVybiBpc092ZXJmbG93aW5nO1xuICB9XG5cbn1cbiJdfQ== |
@@ -126,3 +126,5 @@ import { Component, ElementRef, EventEmitter, Directive, TemplateRef, ViewContainerRef, ComponentFactoryResolver, Renderer2, NgZone, Inject, PLATFORM_ID, Input, Output, NgModule } from '@angular/core'; | ||
width: this.elem.clientWidth, | ||
height: this.elem.clientHeight | ||
height: this.elem.clientHeight, | ||
scrollWidth: this.elem.scrollWidth, | ||
scrollHeight: this.elem.scrollHeight | ||
}; | ||
@@ -251,3 +253,6 @@ this.applyEllipsis(); | ||
window.requestAnimationFrame(() => { | ||
if (this.previousDimensions.width !== this.elem.clientWidth || this.previousDimensions.height !== this.elem.clientHeight) { | ||
if (this.previousDimensions.width !== this.elem.clientWidth | ||
|| this.previousDimensions.height !== this.elem.clientHeight | ||
|| this.previousDimensions.scrollWidth !== this.elem.scrollWidth | ||
|| this.previousDimensions.scrollHeight !== this.elem.scrollHeight) { | ||
this.ngZone.run(() => { | ||
@@ -258,2 +263,4 @@ this.applyEllipsis(); | ||
this.previousDimensions.height = this.elem.clientHeight; | ||
this.previousDimensions.scrollWidth = this.elem.scrollWidth; | ||
this.previousDimensions.scrollHeight = this.elem.scrollHeight; | ||
} | ||
@@ -260,0 +267,0 @@ }); |
@@ -1,1 +0,1 @@ | ||
{"__symbolic":"module","version":4,"metadata":{"NestedEllipsisDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":29,"character":1},"arguments":[{"selector":"[nestedEllipsis]","exportAs":"ngxNestedEllipsis"}]}],"members":{"active":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":79,"character":3},"arguments":["nestedEllipsis"]}]}],"indicator":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":86,"character":3},"arguments":["nestedEllipsisIndicator"]}]}],"wordBoundaries":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":94,"character":3},"arguments":["nestedEllipsisWordBoundaries"]}]}],"mayTruncateAtFn":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":104,"character":3},"arguments":["nestedEllipsisMayTruncateAtFn"]}]}],"resizeDetection":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":110,"character":3},"arguments":["nestedEllipsisResizeDetection"]}]}],"change":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":118,"character":3},"arguments":["nestedEllipsisChange"]}]}],"flattenTextAndElementNodes":[{"__symbolic":"method"}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,null,null,null,null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":173,"character":5},"arguments":[{"__symbolic":"reference","module":"@angular/core","name":"PLATFORM_ID","line":173,"character":12}]}]],"parameters":[{"__symbolic":"reference","name":"TemplateRef","module":"@angular/core","arguments":[{"__symbolic":"error","message":"Expression form not supported","line":168,"character":46,"module":"./lib/directives/nested-ellipsis.directive"}]},{"__symbolic":"reference","module":"@angular/core","name":"ViewContainerRef","line":169,"character":36},{"__symbolic":"reference","module":"@angular/core","name":"ComponentFactoryResolver","line":170,"character":31},{"__symbolic":"reference","module":"@angular/core","name":"Renderer2","line":171,"character":31},{"__symbolic":"reference","module":"@angular/core","name":"NgZone","line":172,"character":29},{"__symbolic":"reference","name":"Object"}]}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"ngAfterViewChecked":[{"__symbolic":"method"}],"nodesToHtml":[{"__symbolic":"method"}],"templatesToHtml":[{"__symbolic":"method"}],"restoreView":[{"__symbolic":"method"}],"addResizeListener":[{"__symbolic":"method"}],"addWindowResizeListener":[{"__symbolic":"method"}],"addResizeObserver":[{"__symbolic":"method"}],"truncateContents":[{"__symbolic":"method"}],"truncateText":[{"__symbolic":"method"}],"applyEllipsis":[{"__symbolic":"method"}]}},"NestedEllipsisContentComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":2,"character":1},"arguments":[{"selector":"nested-ellipsis-content","template":"\n <ng-content></ng-content>\n ","styles":["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n "]}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":17,"character":33}]}]}},"EllipsisResizeDetectionEnum":{"ResizeObserver":"resize-observer","Window":"window","Manual":"manual"},"NestedEllipsisModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":4,"character":1},"arguments":[{"imports":[],"declarations":[{"__symbolic":"reference","name":"NestedEllipsisDirective"},{"__symbolic":"reference","name":"NestedEllipsisContentComponent"}],"entryComponents":[{"__symbolic":"reference","name":"NestedEllipsisContentComponent"}],"exports":[{"__symbolic":"reference","name":"NestedEllipsisDirective"}]}]}],"members":{}}},"origins":{"NestedEllipsisDirective":"./lib/directives/nested-ellipsis.directive","NestedEllipsisContentComponent":"./lib/components/nested-ellipsis-content.component","EllipsisResizeDetectionEnum":"./lib/enums/ellipsis-resize-detection.enum","NestedEllipsisModule":"./lib/nested-ellipsis.module"},"importAs":"ngx-nested-ellipsis"} | ||
{"__symbolic":"module","version":4,"metadata":{"NestedEllipsisDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":29,"character":1},"arguments":[{"selector":"[nestedEllipsis]","exportAs":"ngxNestedEllipsis"}]}],"members":{"active":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":81,"character":3},"arguments":["nestedEllipsis"]}]}],"indicator":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":88,"character":3},"arguments":["nestedEllipsisIndicator"]}]}],"wordBoundaries":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":96,"character":3},"arguments":["nestedEllipsisWordBoundaries"]}]}],"mayTruncateAtFn":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":106,"character":3},"arguments":["nestedEllipsisMayTruncateAtFn"]}]}],"resizeDetection":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":112,"character":3},"arguments":["nestedEllipsisResizeDetection"]}]}],"change":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":120,"character":3},"arguments":["nestedEllipsisChange"]}]}],"flattenTextAndElementNodes":[{"__symbolic":"method"}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,null,null,null,null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":175,"character":5},"arguments":[{"__symbolic":"reference","module":"@angular/core","name":"PLATFORM_ID","line":175,"character":12}]}]],"parameters":[{"__symbolic":"reference","name":"TemplateRef","module":"@angular/core","arguments":[{"__symbolic":"error","message":"Expression form not supported","line":170,"character":46,"module":"./lib/directives/nested-ellipsis.directive"}]},{"__symbolic":"reference","module":"@angular/core","name":"ViewContainerRef","line":171,"character":36},{"__symbolic":"reference","module":"@angular/core","name":"ComponentFactoryResolver","line":172,"character":31},{"__symbolic":"reference","module":"@angular/core","name":"Renderer2","line":173,"character":31},{"__symbolic":"reference","module":"@angular/core","name":"NgZone","line":174,"character":29},{"__symbolic":"reference","name":"Object"}]}],"ngOnInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"ngAfterViewChecked":[{"__symbolic":"method"}],"nodesToHtml":[{"__symbolic":"method"}],"templatesToHtml":[{"__symbolic":"method"}],"restoreView":[{"__symbolic":"method"}],"addResizeListener":[{"__symbolic":"method"}],"addWindowResizeListener":[{"__symbolic":"method"}],"addResizeObserver":[{"__symbolic":"method"}],"truncateContents":[{"__symbolic":"method"}],"truncateText":[{"__symbolic":"method"}],"applyEllipsis":[{"__symbolic":"method"}]}},"NestedEllipsisContentComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":2,"character":1},"arguments":[{"selector":"nested-ellipsis-content","template":"\n <ng-content></ng-content>\n ","styles":["\n :host {\n display: block;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n "]}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":17,"character":33}]}]}},"EllipsisResizeDetectionEnum":{"ResizeObserver":"resize-observer","Window":"window","Manual":"manual"},"NestedEllipsisModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":4,"character":1},"arguments":[{"imports":[],"declarations":[{"__symbolic":"reference","name":"NestedEllipsisDirective"},{"__symbolic":"reference","name":"NestedEllipsisContentComponent"}],"entryComponents":[{"__symbolic":"reference","name":"NestedEllipsisContentComponent"}],"exports":[{"__symbolic":"reference","name":"NestedEllipsisDirective"}]}]}],"members":{}}},"origins":{"NestedEllipsisDirective":"./lib/directives/nested-ellipsis.directive","NestedEllipsisContentComponent":"./lib/components/nested-ellipsis-content.component","EllipsisResizeDetectionEnum":"./lib/enums/ellipsis-resize-detection.enum","NestedEllipsisModule":"./lib/nested-ellipsis.module"},"importAs":"ngx-nested-ellipsis"} |
{ | ||
"name": "ngx-nested-ellipsis", | ||
"version": "1.1.0", | ||
"version": "1.1.1", | ||
"description": "Nested multiline html with ellipsis for angular 9+", | ||
@@ -5,0 +5,0 @@ "author": "Florian Lentsch", |
@@ -1,91 +0,24 @@ | ||
# ngx-nested-ellipsis | ||
# NgxNestedEllipsis | ||
Library for angular (>= 9.0.0) providing a directive to display an ellipsis if the containing text would overflow. | ||
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.0.5. | ||
Supports dynamic html contents. (If you require text contents only, you might want to take a look at [ngx-ellipsis](https://github.com/lentschi/ngx-ellipsis), which offers better performance, but escapes any html contents to text.) | ||
## Code scaffolding | ||
## Demo | ||
Run `ng generate component component-name --project ngx-nested-ellipsis` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ngx-nested-ellipsis`. | ||
> Note: Don't forget to add `--project ngx-nested-ellipsis` or else it will be added to the default project in your `angular.json` file. | ||
For a demo either just checkout this project and run `npm install && npm run start` or visit [the StackBlitz demo page](https://stackblitz.com/github/lentschi/ngx-nested-ellipsis?file=src%2Fapp%2Fapp.component.html). | ||
## Build | ||
## Installation | ||
Run `ng build ngx-nested-ellipsis` to build the project. The build artifacts will be stored in the `dist/` directory. | ||
For use in an existing angular project run `npm install ngx-nested-ellipsis --save`. | ||
## Publishing | ||
Then add the installed module to your `app.module.ts`: | ||
After building your library with `ng build ngx-nested-ellipsis`, go to the dist folder `cd dist/ngx-nested-ellipsis` and run `npm publish`. | ||
```typescript | ||
import { NestedEllipsisModule } from 'ngx-nested-ellipsis'; | ||
// ... | ||
@NgModule({ | ||
// ... | ||
imports: [ | ||
// ... | ||
NestedEllipsisModule | ||
] | ||
// ... | ||
}) | ||
export class AppModule {} | ||
``` | ||
## Usage | ||
Anywhere in your template: | ||
```html | ||
<div style="width: 130px; height: 18px;"> | ||
<ng-template [nestedEllipsis]>Your very long <em>rich</em> text</ng-template> | ||
</div> | ||
``` | ||
As you can see, you need to define the dimensions of your element yourself. (ngx-nested-ellipsis doesn't automatically add any element styles.) But of course you don't need to use fixed widths/heights like in these examples. Flex layout shold work just fine for example. | ||
### Extra options | ||
You may add the following attributes to change the directive's behavior: | ||
| attribute | meaning | | ||
| ---- | ---- | | ||
| __nestedEllipsis__ | _required_ Passing true (default) will perform the directive's task otherwise the template will be rendered without truncating its contents.| | ||
| __nestedEllipsisIndicator__ | Passing a string (default: '...') will append it when the passed template has been truncated. Passing a template will append that template instead. | | ||
| __nestedEllipsisWordBoundaries__ | If you pass this attribute, the text won't be truncated at just any character but only at those in the attribute's value. For example `nestedEllipsisWordBoundaries=" "` will allow the text to break at spaces only | | ||
| __nestedEllipsisMayTruncateAtFn__ | Function that lets you specify whether the contents may be truncated at a certain point or not. (see [callback API](#nestedellipsismaytruncateatfn-api)) | | ||
| __nestedEllipsisResizeDetection__ | How resize events should be detected - these are the possible values: <ul><li>__resize-observer__: _default_ Use native ResizeObserver or a ponyfill if not implemented by the browser (See [Web/API/ResizeObserver](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver) and [que-etc/resize-observer-polyfill](https://github.com/que-etc/resize-observer-polyfill))</li><li>__window__: Only listen if the whole window has been resized/changed orientation (Possibly better performance, but obviously won't trigger on resize caused directly or indirectly by javascript.)</li><li>__manual__: Ellipsis is never applied automatically. Instead the consuming app may use `#ell="ngxNestedEllipsis"` in the template and `this.ell.applyEllipsis()` in the component code.</li></ul> | | ||
| __nestedEllipsisChange__ | Event emitter - Will be emitted whenever the ellipsis has been recalculated (depending on `nestedEllipsisResizeDetection`). If the text had to be truncated the position of the last visible character will be emitted, else `null`.| | ||
### nestedEllipsisMayTruncateAtFn API | ||
Callback function parameters: | ||
| name | type | description | | ||
| ---- | ---- | ---- | | ||
| __node__ | CharacterData | Text node that is checked for truncation | | ||
| __position__ | number | Position within that text node where the text might be truncated | | ||
Return `true` if truncating at this point in this node should be allowed. | ||
## Build & publish on npm | ||
In case you want to contribute/fork: | ||
1. Run `npm install` | ||
1. Adept version and author in `./projects/ngx-nested-ellipsis/package.json` and commit the changes to your fork. | ||
1. Run `npm run build-lib` which outputs the build to `./dist/ngx-nested-ellipsis`. | ||
1. Copy README.md to `./dist/ngx-nested-ellipsis` and modify it accordingly. | ||
1. Run `cd ./dist/ngx-nested-ellipsis && npm publish`. | ||
## Running unit tests | ||
Run `npm run test ngx-nested-ellipsis` to execute the unit tests via [Karma](https://karma-runner.github.io). | ||
Run `ng test ngx-nested-ellipsis` to execute the unit tests via [Karma](https://karma-runner.github.io). | ||
## Thank you... | ||
## Further help | ||
- ... __Denis Rul__ for writing the [resize-observer-polyfill](https://github.com/que-etc/resize-observer-polyfill) package which is internally used by this module. | ||
## License | ||
MIT | ||
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
260369
0.66%1881
1.24%0
-100%25
-72.83%