UNPKG

@covalent/core

Version:

Core Teradata UI Platform for layouts, icons, custom components and themes. This should be added as a dependency for any project that wants to use layouts, icons and themes for Angular Material.

1 lines 124 kB
{"version":3,"file":"covalent-core-loading.mjs","sources":["../tmp-esm2022/loading/loading.component.js","../tmp-esm2022/loading/services/loading.factory.js","../tmp-esm2022/loading/services/loading.service.js","../tmp-esm2022/loading/directives/loading.directive.js","../tmp-esm2022/loading/loading.module.js","../tmp-esm2022/loading/covalent-core-loading.js"],"sourcesContent":["import { Component, ChangeDetectorRef, ElementRef, inject, } from '@angular/core';\nimport { tdFadeInOutAnimation } from '@covalent/core/common';\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { CommonModule } from '@angular/common';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/common\";\nfunction TdLoadingComponent_mat_progress_spinner_2_Template(rf, ctx) { if (rf & 1) {\n i0.ɵɵelement(0, \"mat-progress-spinner\", 5);\n} if (rf & 2) {\n const ctx_r0 = i0.ɵɵnextContext();\n i0.ɵɵproperty(\"mode\", ctx_r0.mode)(\"value\", ctx_r0.value)(\"color\", ctx_r0.color)(\"diameter\", ctx_r0.getCircleDiameter())(\"strokeWidth\", ctx_r0.getCircleStrokeWidth());\n} }\nfunction TdLoadingComponent_mat_progress_bar_3_Template(rf, ctx) { if (rf & 1) {\n i0.ɵɵelement(0, \"mat-progress-bar\", 6);\n} if (rf & 2) {\n const ctx_r0 = i0.ɵɵnextContext();\n i0.ɵɵproperty(\"mode\", ctx_r0.mode)(\"value\", ctx_r0.value)(\"color\", ctx_r0.color);\n} }\nfunction TdLoadingComponent_ng_template_4_Template(rf, ctx) { }\nexport var LoadingType;\n(function (LoadingType) {\n LoadingType[\"Circular\"] = \"circular\";\n LoadingType[\"Linear\"] = \"linear\";\n})(LoadingType || (LoadingType = {}));\nexport var LoadingMode;\n(function (LoadingMode) {\n LoadingMode[\"Determinate\"] = \"determinate\";\n LoadingMode[\"Indeterminate\"] = \"indeterminate\";\n})(LoadingMode || (LoadingMode = {}));\nexport var LoadingStrategy;\n(function (LoadingStrategy) {\n LoadingStrategy[\"Overlay\"] = \"overlay\";\n LoadingStrategy[\"Replace\"] = \"replace\";\n})(LoadingStrategy || (LoadingStrategy = {}));\nexport var LoadingStyle;\n(function (LoadingStyle) {\n LoadingStyle[\"FullScreen\"] = \"fullscreen\";\n LoadingStyle[\"Overlay\"] = \"overlay\";\n LoadingStyle[\"None\"] = \"none\";\n})(LoadingStyle || (LoadingStyle = {}));\nexport const TD_CIRCLE_DIAMETER = 40;\nexport class TdLoadingComponent {\n _elementRef = inject(ElementRef);\n _changeDetectorRef = inject(ChangeDetectorRef);\n _mode = LoadingMode.Indeterminate;\n _defaultMode = LoadingMode.Indeterminate;\n _value = 0;\n _circleDiameter = TD_CIRCLE_DIAMETER;\n /**\n * Flag for animation\n */\n animation = false;\n /**\n * Content injected into loading component.\n */\n content;\n /**\n * Sets mode of [TdLoadingComponent] to LoadingMode.Determinate or LoadingMode.Indeterminate\n */\n set mode(mode) {\n this._defaultMode = mode;\n }\n get mode() {\n return this._mode;\n }\n /**\n * Sets value of [TdLoadingComponent] if mode is 'LoadingMode.Determinate'\n */\n set value(value) {\n this._value = value;\n // Check for changes for `OnPush` change detection\n this._changeDetectorRef.markForCheck();\n }\n get value() {\n return this._value;\n }\n style = LoadingStyle.None;\n /**\n * height: number\n * Sets height of [TdLoadingComponent].\n */\n height = 100;\n /**\n * type: LoadingType\n * Sets type of [TdLoadingComponent] rendered.\n */\n type = LoadingType.Circular;\n /**\n * color: primary' | 'accent' | 'warn'\n * Sets theme color of [TdLoadingComponent] rendered.\n */\n color = 'primary';\n ngDoCheck() {\n // When overlay is used and the host width has a value greater than 1px\n // set the circle diameter when possible incase the loading component was rendered in a hidden state\n if (this.isOverlay() && this._hostHeight() > 1 && this.animation) {\n this._setCircleDiameter();\n this._changeDetectorRef.markForCheck();\n }\n }\n getHeight() {\n // Ignore height if style is `overlay` or `fullscreen`.\n // Add height if child elements have a height and style is `none`, else return default height.\n if (this.isOverlay() || this.isFullScreen()) {\n return undefined;\n }\n else {\n return this.height ? `${this.height}px` : '150px';\n }\n }\n getCircleDiameter() {\n return this._circleDiameter;\n }\n getCircleStrokeWidth() {\n // we calculate the stroke width by setting it as 10% of its diameter\n const strokeWidth = this.getCircleDiameter() / 10;\n return Math.abs(strokeWidth);\n }\n isCircular() {\n return this.type === LoadingType.Circular;\n }\n isLinear() {\n return this.type === LoadingType.Linear;\n }\n isFullScreen() {\n return this.style === LoadingStyle.FullScreen;\n }\n isOverlay() {\n return this.style === LoadingStyle.Overlay;\n }\n /**\n * Starts in animation and returns an observable for completition event.\n */\n show() {\n /* need to switch back to the selected mode, so we have saved it in another variable\n * and then recover it. (issue with protractor)\n */\n this._mode = this._defaultMode;\n // Set values before the animations starts\n this._setCircleDiameter();\n // Check for changes for `OnPush` change detection\n this.animation = true;\n this._changeDetectorRef.markForCheck();\n }\n /**\n * Starts out animation and returns an observable for completition event.\n */\n hide() {\n this.animation = false;\n /* need to switch back and forth from determinate/indeterminate so the setInterval()\n * inside mat-progress-spinner stops and protractor doesnt timeout waiting to sync.\n */\n this._mode = LoadingMode.Determinate;\n // Check for changes for `OnPush` change detection\n /* little hack to reset the loader value and animation before removing it from DOM\n * else, the loader will appear with prev value when its registered again\n * and will do an animation going prev value to 0.\n */\n this.value = 0;\n // Check for changes for `OnPush` change detection\n this._changeDetectorRef.markForCheck();\n }\n /**\n * Calculate the proper diameter for the circle and set it\n */\n _setCircleDiameter() {\n // we set a default diameter of 100 since this is the default in material\n let diameter = TD_CIRCLE_DIAMETER;\n // if height is provided, then we take that as diameter\n if (this.height) {\n diameter = this.height;\n // else if its not provided, then we take the host height\n }\n else if (this.height === undefined) {\n diameter = this._hostHeight();\n }\n // if the diameter is over TD_CIRCLE_DIAMETER, we set TD_CIRCLE_DIAMETER\n if (diameter <= TD_CIRCLE_DIAMETER) {\n this._circleDiameter = Math.floor(diameter);\n }\n else {\n this._circleDiameter = TD_CIRCLE_DIAMETER;\n }\n }\n /**\n * Returns the host height of the loading component\n */\n _hostHeight() {\n if (this._elementRef.nativeElement) {\n return (this._elementRef.nativeElement).getBoundingClientRect().height;\n }\n return 0;\n }\n static ɵfac = function TdLoadingComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TdLoadingComponent)(); };\n static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TdLoadingComponent, selectors: [[\"td-loading\"]], decls: 5, vars: 14, consts: [[1, \"td-loading-wrapper\"], [1, \"td-loading\"], [3, \"mode\", \"value\", \"color\", \"diameter\", \"strokeWidth\", 4, \"ngIf\"], [3, \"mode\", \"value\", \"color\", 4, \"ngIf\"], [3, \"cdkPortalOutlet\"], [3, \"mode\", \"value\", \"color\", \"diameter\", \"strokeWidth\"], [3, \"mode\", \"value\", \"color\"]], template: function TdLoadingComponent_Template(rf, ctx) { if (rf & 1) {\n i0.ɵɵelementStart(0, \"div\", 0)(1, \"div\", 1);\n i0.ɵɵtemplate(2, TdLoadingComponent_mat_progress_spinner_2_Template, 1, 5, \"mat-progress-spinner\", 2)(3, TdLoadingComponent_mat_progress_bar_3_Template, 1, 3, \"mat-progress-bar\", 3);\n i0.ɵɵelementEnd();\n i0.ɵɵtemplate(4, TdLoadingComponent_ng_template_4_Template, 0, 0, \"ng-template\", 4);\n i0.ɵɵelementEnd();\n } if (rf & 2) {\n i0.ɵɵstyleProp(\"min-height\", ctx.getHeight());\n i0.ɵɵclassProp(\"td-overlay-circular\", (ctx.isOverlay() || ctx.isFullScreen()) && !ctx.isLinear())(\"td-overlay\", ctx.isOverlay() || ctx.isFullScreen())(\"td-fullscreen\", ctx.isFullScreen());\n i0.ɵɵadvance();\n i0.ɵɵstyleProp(\"min-height\", ctx.getHeight());\n i0.ɵɵproperty(\"@tdFadeInOut\", ctx.animation);\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"ngIf\", ctx.isCircular());\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"ngIf\", ctx.isLinear());\n i0.ɵɵadvance();\n i0.ɵɵproperty(\"cdkPortalOutlet\", ctx.content);\n } }, dependencies: [CommonModule, i1.NgIf, MatProgressBar, MatProgressSpinner, CdkPortalOutlet], styles: [\".td-loading-wrapper[_ngcontent-%COMP%]{position:relative;display:block}.td-loading-wrapper.td-fullscreen[_ngcontent-%COMP%]{position:inherit}.td-loading-wrapper[_ngcontent-%COMP%] .td-loading[_ngcontent-%COMP%]{box-sizing:border-box;display:flex;flex-direction:row;align-items:center;align-content:center;max-width:100%;justify-content:center;flex:1}.td-loading-wrapper.td-overlay[_ngcontent-%COMP%] .td-loading[_ngcontent-%COMP%]{position:absolute;margin:0;top:0;left:0;right:0;z-index:1000}.td-loading-wrapper.td-overlay[_ngcontent-%COMP%] .td-loading[_ngcontent-%COMP%] mat-progress-bar[_ngcontent-%COMP%]{position:absolute;top:0;left:0;right:0}.td-loading-wrapper.td-overlay-circular[_ngcontent-%COMP%] .td-loading[_ngcontent-%COMP%]{bottom:0}\"], data: { animation: [tdFadeInOutAnimation] } });\n}\n(() => { (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(TdLoadingComponent, [{\n type: Component,\n args: [{ selector: 'td-loading', animations: [tdFadeInOutAnimation], imports: [CommonModule, MatProgressBar, MatProgressSpinner, CdkPortalOutlet], template: \"<div\\n class=\\\"td-loading-wrapper\\\"\\n [style.min-height]=\\\"getHeight()\\\"\\n [class.td-overlay-circular]=\\\"(isOverlay() || isFullScreen()) && !isLinear()\\\"\\n [class.td-overlay]=\\\"isOverlay() || isFullScreen()\\\"\\n [class.td-fullscreen]=\\\"isFullScreen()\\\"\\n>\\n <div\\n [@tdFadeInOut]=\\\"animation\\\"\\n [style.min-height]=\\\"getHeight()\\\"\\n class=\\\"td-loading\\\"\\n >\\n <mat-progress-spinner\\n *ngIf=\\\"isCircular()\\\"\\n [mode]=\\\"mode\\\"\\n [value]=\\\"value\\\"\\n [color]=\\\"color\\\"\\n [diameter]=\\\"getCircleDiameter()\\\"\\n [strokeWidth]=\\\"getCircleStrokeWidth()\\\"\\n ></mat-progress-spinner>\\n <mat-progress-bar\\n *ngIf=\\\"isLinear()\\\"\\n [mode]=\\\"mode\\\"\\n [value]=\\\"value\\\"\\n [color]=\\\"color\\\"\\n ></mat-progress-bar>\\n </div>\\n <ng-template [cdkPortalOutlet]=\\\"content\\\"></ng-template>\\n</div>\\n\", styles: [\".td-loading-wrapper{position:relative;display:block}.td-loading-wrapper.td-fullscreen{position:inherit}.td-loading-wrapper .td-loading{box-sizing:border-box;display:flex;flex-direction:row;align-items:center;align-content:center;max-width:100%;justify-content:center;flex:1}.td-loading-wrapper.td-overlay .td-loading{position:absolute;margin:0;top:0;left:0;right:0;z-index:1000}.td-loading-wrapper.td-overlay .td-loading mat-progress-bar{position:absolute;top:0;left:0;right:0}.td-loading-wrapper.td-overlay-circular .td-loading{bottom:0}\\n\"] }]\n }], null, null); })();\n(() => { (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassDebugInfo(TdLoadingComponent, { className: \"TdLoadingComponent\", filePath: \"loading.component.ts\", lineNumber: 44 }); })();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGluZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvbG9hZGluZy9zcmMvbG9hZGluZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvbG9hZGluZy9zcmMvbG9hZGluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixVQUFVLEVBRVYsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQWtCLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztJQ0MzQywwQ0FPd0I7OztJQUR0QixBQURBLEFBREEsQUFEQSxBQURBLGtDQUFhLHVCQUNFLHVCQUNBLHdDQUNpQiw4Q0FDTTs7O0lBRXhDLHNDQUtvQjs7O0lBRGxCLEFBREEsQUFEQSxrQ0FBYSx1QkFDRSx1QkFDQTs7O0FEWHJCLE1BQU0sQ0FBTixJQUFZLFdBR1g7QUFIRCxXQUFZLFdBQVc7SUFDckIsb0NBQXFCLENBQUE7SUFDckIsZ0NBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUhXLFdBQVcsS0FBWCxXQUFXLFFBR3RCO0FBRUQsTUFBTSxDQUFOLElBQVksV0FHWDtBQUhELFdBQVksV0FBVztJQUNyQiwwQ0FBMkIsQ0FBQTtJQUMzQiw4Q0FBK0IsQ0FBQTtBQUNqQyxDQUFDLEVBSFcsV0FBVyxLQUFYLFdBQVcsUUFHdEI7QUFFRCxNQUFNLENBQU4sSUFBWSxlQUdYO0FBSEQs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InNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIERvQ2hlY2ssXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0ZEZhZGVJbk91dEFuaW1hdGlvbiB9IGZyb20gJ0Bjb3ZhbGVudC9jb3JlL2NvbW1vbic7XG5pbXBvcnQgeyBDZGtQb3J0YWxPdXRsZXQsIFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmV4cG9ydCBlbnVtIExvYWRpbmdUeXBlIHtcbiAgQ2lyY3VsYXIgPSAnY2lyY3VsYXInLFxuICBMaW5lYXIgPSAnbGluZWFyJyxcbn1cblxuZXhwb3J0IGVudW0gTG9hZGluZ01vZGUge1xuICBEZXRlcm1pbmF0ZSA9ICdkZXRlcm1pbmF0ZScsXG4gIEluZGV0ZXJtaW5hdGUgPSAnaW5kZXRlcm1pbmF0ZScsXG59XG5cbmV4cG9ydCBlbnVtIExvYWRpbmdTdHJhdGVneSB7XG4gIE92ZXJsYXkgPSAnb3ZlcmxheScsXG4gIFJlcGxhY2UgPSAncmVwbGFjZScsXG59XG5cbmV4cG9ydCBlbnVtIExvYWRpbmdTdHlsZSB7XG4gIEZ1bGxTY3JlZW4gPSAnZnVsbHNjcmVlbicsXG4gIE92ZXJsYXkgPSAnb3ZlcmxheScsXG4gIE5vbmUgPSAnbm9uZScsXG59XG5cbmV4cG9ydCBjb25zdCBURF9DSVJDTEVfRElBTUVURVIgPSA0MDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGQtbG9hZGluZycsXG4gIHN0eWxlVXJsczogWycuL2xvYWRpbmcuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2xvYWRpbmcuY29tcG9uZW50Lmh0bWwnLFxuICBhbmltYXRpb25zOiBbdGRGYWRlSW5PdXRBbmltYXRpb25dLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRQcm9ncmVzc0JhciwgTWF0UHJvZ3Jlc3NTcGlubmVyLCBDZGtQb3J0YWxPdXRsZXRdLFxufSlcbmV4cG9ydCBjbGFzcyBUZExvYWRpbmdDb21wb25lbnQgaW1wbGVtZW50cyBEb0NoZWNrIHtcbiAgcHJpdmF0ZSBfZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIHByaXZhdGUgX21vZGU6IExvYWRpbmdNb2RlID0gTG9hZGluZ01vZGUuSW5kZXRlcm1pbmF0ZTtcbiAgcHJpdmF0ZSBfZGVmYXVsdE1vZGU6IExvYWRpbmdNb2RlID0gTG9hZGluZ01vZGUuSW5kZXRlcm1pbmF0ZTtcbiAgcHJpdmF0ZSBfdmFsdWUgPSAwO1xuICBwcml2YXRlIF9jaXJjbGVEaWFtZXRlcjogbnVtYmVyID0gVERfQ0lSQ0xFX0RJQU1FVEVSO1xuXG4gIC8qKlxuICAgKiBGbGFnIGZvciBhbmltYXRpb25cbiAgICovXG4gIGFuaW1hdGlvbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBDb250ZW50IGluamVjdGVkIGludG8gbG9hZGluZyBjb21wb25lbnQuXG4gICAqL1xuICBjb250ZW50ITogVGVtcGxhdGVQb3J0YWw8YW55PjtcblxuICAvKipcbiAgICogU2V0cyBtb2RlIG9mIFtUZExvYWRpbmdDb21wb25lbnRdIHRvIExvYWRpbmdNb2RlLkRldGVybWluYXRlIG9yIExvYWRpbmdNb2RlLkluZGV0ZXJtaW5hdGVcbiAgICovXG4gIHNldCBtb2RlKG1vZGU6IExvYWRpbmdNb2RlKSB7XG4gICAgdGhpcy5fZGVmYXVsdE1vZGUgPSBtb2RlO1xuICB9XG4gIGdldCBtb2RlKCk6IExvYWRpbmdNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHZhbHVlIG9mIFtUZExvYWRpbmdDb21wb25lbnRdIGlmIG1vZGUgaXMgJ0xvYWRpbmdNb2RlLkRldGVybWluYXRlJ1xuICAgKi9cbiAgc2V0IHZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIC8vIENoZWNrIGZvciBjaGFuZ2VzIGZvciBgT25QdXNoYCBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgc3R5bGU6IExvYWRpbmdTdHlsZSA9IExvYWRpbmdTdHlsZS5Ob25lO1xuXG4gIC8qKlxuICAgKiBoZWlnaHQ6IG51bWJlclxuICAgKiBTZXRzIGhlaWdodCBvZiBbVGRMb2FkaW5nQ29tcG9uZW50XS5cbiAgICovXG4gIGhlaWdodCA9IDEwMDtcblxuICAvKipcbiAgICogdHlwZTogTG9hZGluZ1R5cGVcbiAgICogU2V0cyB0eXBlIG9mIFtUZExvYWRpbmdDb21wb25lbnRdIHJlbmRlcmVkLlxuICAgKi9cbiAgdHlwZTogTG9hZGluZ1R5cGUgPSBMb2FkaW5nVHlwZS5DaXJjdWxhcjtcblxuICAvKipcbiAgICogY29sb3I6IHByaW1hcnknIHwgJ2FjY2VudCcgfCAnd2FybidcbiAgICogU2V0cyB0aGVtZSBjb2xvciBvZiBbVGRMb2FkaW5nQ29tcG9uZW50XSByZW5kZXJlZC5cbiAgICovXG4gIGNvbG9yOiAncHJpbWFyeScgfCAnYWNjZW50JyB8ICd3YXJuJyA9ICdwcmltYXJ5JztcblxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgLy8gV2hlbiBvdmVybGF5IGlzIHVzZWQgYW5kIHRoZSBob3N0IHdpZHRoIGhhcyBhIHZhbHVlIGdyZWF0ZXIgdGhhbiAxcHhcbiAgICAvLyBzZXQgdGhlIGNpcmNsZSBkaWFtZXRlciB3aGVuIHBvc3NpYmxlIGluY2FzZSB0aGUgbG9hZGluZyBjb21wb25lbnQgd2FzIHJlbmRlcmVkIGluIGEgaGlkZGVuIHN0YXRlXG4gICAgaWYgKHRoaXMuaXNPdmVybGF5KCkgJiYgdGhpcy5faG9zdEhlaWdodCgpID4gMSAmJiB0aGlzLmFuaW1hdGlvbikge1xuICAgICAgdGhpcy5fc2V0Q2lyY2xlRGlhbWV0ZXIoKTtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGdldEhlaWdodCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIC8vIElnbm9yZSBoZWlnaHQgaWYgc3R5bGUgaXMgYG92ZXJsYXlgIG9yIGBmdWxsc2NyZWVuYC5cbiAgICAvLyBBZGQgaGVpZ2h0IGlmIGNoaWxkIGVsZW1lbnRzIGhhdmUgYSBoZWlnaHQgYW5kIHN0eWxlIGlzIGBub25lYCwgZWxzZSByZXR1cm4gZGVmYXVsdCBoZWlnaHQuXG4gICAgaWYgKHRoaXMuaXNPdmVybGF5KCkgfHwgdGhpcy5pc0Z1bGxTY3JlZW4oKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuaGVpZ2h0ID8gYCR7dGhpcy5oZWlnaHR9cHhgIDogJzE1MHB4JztcbiAgICB9XG4gIH1cblxuICBnZXRDaXJjbGVEaWFtZXRlcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jaXJjbGVEaWFtZXRlcjtcbiAgfVxuXG4gIGdldENpcmNsZVN0cm9rZVdpZHRoKCk6IG51bWJlciB7XG4gICAgLy8gd2UgY2FsY3VsYXRlIHRoZSBzdHJva2Ugd2lkdGggYnkgc2V0dGluZyBpdCBhcyAxMCUgb2YgaXRzIGRpYW1ldGVyXG4gICAgY29uc3Qgc3Ryb2tlV2lkdGg6IG51bWJlciA9IHRoaXMuZ2V0Q2lyY2xlRGlhbWV0ZXIoKSAvIDEwO1xuICAgIHJldHVybiBNYXRoLmFicyhzdHJva2VXaWR0aCk7XG4gIH1cblxuICBpc0NpcmN1bGFyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09IExvYWRpbmdUeXBlLkNpcmN1bGFyO1xuICB9XG5cbiAgaXNMaW5lYXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gTG9hZGluZ1R5cGUuTGluZWFyO1xuICB9XG5cbiAgaXNGdWxsU2NyZWVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0eWxlID09PSBMb2FkaW5nU3R5bGUuRnVsbFNjcmVlbjtcbiAgfVxuXG4gIGlzT3ZlcmxheSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdHlsZSA9PT0gTG9hZGluZ1N0eWxlLk92ZXJsYXk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGluIGFuaW1hdGlvbiBhbmQgcmV0dXJucyBhbiBvYnNlcnZhYmxlIGZvciBjb21wbGV0aXRpb24gZXZlbnQuXG4gICAqL1xuICBzaG93KCk6IHZvaWQge1xuICAgIC8qIG5lZWQgdG8gc3dpdGNoIGJhY2sgdG8gdGhlIHNlbGVjdGVkIG1vZGUsIHNvIHdlIGhhdmUgc2F2ZWQgaXQgaW4gYW5vdGhlciB2YXJpYWJsZVxuICAgICAqICBhbmQgdGhlbiByZWNvdmVyIGl0LiAoaXNzdWUgd2l0aCBwcm90cmFjdG9yKVxuICAgICAqL1xuICAgIHRoaXMuX21vZGUgPSB0aGlzLl9kZWZhdWx0TW9kZTtcbiAgICAvLyBTZXQgdmFsdWVzIGJlZm9yZSB0aGUgYW5pbWF0aW9ucyBzdGFydHNcbiAgICB0aGlzLl9zZXRDaXJjbGVEaWFtZXRlcigpO1xuICAgIC8vIENoZWNrIGZvciBjaGFuZ2VzIGZvciBgT25QdXNoYCBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgdGhpcy5hbmltYXRpb24gPSB0cnVlO1xuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBvdXQgYW5pbWF0aW9uIGFuZCByZXR1cm5zIGFuIG9ic2VydmFibGUgZm9yIGNvbXBsZXRpdGlvbiBldmVudC5cbiAgICovXG4gIGhpZGUoKTogdm9pZCB7XG4gICAgdGhpcy5hbmltYXRpb24gPSBmYWxzZTtcbiAgICAvKiBuZWVkIHRvIHN3aXRjaCBiYWNrIGFuZCBmb3J0aCBmcm9tIGRldGVybWluYXRlL2luZGV0ZXJtaW5hdGUgc28gdGhlIHNldEludGVydmFsKClcbiAgICAgKiBpbnNpZGUgbWF0LXByb2dyZXNzLXNwaW5uZXIgc3RvcHMgYW5kIHByb3RyYWN0b3IgZG9lc250IHRpbWVvdXQgd2FpdGluZyB0byBzeW5jLlxuICAgICAqL1xuICAgIHRoaXMuX21vZGUgPSBMb2FkaW5nTW9kZS5EZXRlcm1pbmF0ZTtcbiAgICAvLyBDaGVjayBmb3IgY2hhbmdlcyBmb3IgYE9uUHVzaGAgY2hhbmdlIGRldGVjdGlvblxuICAgIC8qIGxpdHRsZSBoYWNrIHRvIHJlc2V0IHRoZSBsb2FkZXIgdmFsdWUgYW5kIGFuaW1hdGlvbiBiZWZvcmUgcmVtb3ZpbmcgaXQgZnJvbSBET01cbiAgICAgKiBlbHNlLCB0aGUgbG9hZGVyIHdpbGwgYXBwZWFyIHdpdGggcHJldiB2YWx1ZSB3aGVuIGl0cyByZWdpc3RlcmVkIGFnYWluXG4gICAgICogYW5kIHdpbGwgZG8gYW4gYW5pbWF0aW9uIGdvaW5nIHByZXYgdmFsdWUgdG8gMC5cbiAgICAgKi9cbiAgICB0aGlzLnZhbHVlID0gMDtcbiAgICAvLyBDaGVjayBmb3IgY2hhbmdlcyBmb3IgYE9uUHVzaGAgY2hhbmdlIGRldGVjdGlvblxuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgcHJvcGVyIGRpYW1ldGVyIGZvciB0aGUgY2lyY2xlIGFuZCBzZXQgaXRcbiAgICovXG4gIHByaXZhdGUgX3NldENpcmNsZURpYW1ldGVyKCk6IHZvaWQge1xuICAgIC8vIHdlIHNldCBhIGRlZmF1bHQgZGlhbWV0ZXIgb2YgMTAwIHNpbmNlIHRoaXMgaXMgdGhlIGRlZmF1bHQgaW4gbWF0ZXJpYWxcbiAgICBsZXQgZGlhbWV0ZXI6IG51bWJlciA9IFREX0NJUkNMRV9ESUFNRVRFUjtcbiAgICAvLyBpZiBoZWlnaHQgaXMgcHJvdmlkZWQsIHRoZW4gd2UgdGFrZSB0aGF0IGFzIGRpYW1ldGVyXG4gICAgaWYgKHRoaXMuaGVpZ2h0KSB7XG4gICAgICBkaWFtZXRlciA9IHRoaXMuaGVpZ2h0O1xuICAgICAgLy8gZWxzZSBpZiBpdHMgbm90IHByb3ZpZGVkLCB0aGVuIHdlIHRha2UgdGhlIGhvc3QgaGVpZ2h0XG4gICAgfSBlbHNlIGlmICh0aGlzLmhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkaWFtZXRlciA9IHRoaXMuX2hvc3RIZWlnaHQoKTtcbiAgICB9XG4gICAgLy8gaWYgdGhlIGRpYW1ldGVyIGlzIG92ZXIgVERfQ0lSQ0xFX0RJQU1FVEVSLCB3ZSBzZXQgVERfQ0lSQ0xFX0RJQU1FVEVSXG4gICAgaWYgKGRpYW1ldGVyIDw9IFREX0NJUkNMRV9ESUFNRVRFUikge1xuICAgICAgdGhpcy5fY2lyY2xlRGlhbWV0ZXIgPSBNYXRoLmZsb29yKGRpYW1ldGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2lyY2xlRGlhbWV0ZXIgPSBURF9DSVJDTEVfRElBTUVURVI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGhvc3QgaGVpZ2h0IG9mIHRoZSBsb2FkaW5nIGNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBfaG9zdEhlaWdodCgpOiBudW1iZXIge1xuICAgIGlmICg8SFRNTEVsZW1lbnQ+dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm4gKDxIVE1MRWxlbWVudD4oXG4gICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxuICAgICAgKSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInRkLWxvYWRpbmctd3JhcHBlclwiXG4gIFtzdHlsZS5taW4taGVpZ2h0XT1cImdldEhlaWdodCgpXCJcbiAgW2NsYXNzLnRkLW92ZXJsYXktY2lyY3VsYXJdPVwiKGlzT3ZlcmxheSgpIHx8IGlzRnVsbFNjcmVlbigpKSAmJiAhaXNMaW5lYXIoKVwiXG4gIFtjbGFzcy50ZC1vdmVybGF5XT1cImlzT3ZlcmxheSgpIHx8IGlzRnVsbFNjcmVlbigpXCJcbiAgW2NsYXNzLnRkLWZ1bGxzY3JlZW5dPVwiaXNGdWxsU2NyZWVuKClcIlxuPlxuICA8ZGl2XG4gICAgW0B0ZEZhZGVJbk91dF09XCJhbmltYXRpb25cIlxuICAgIFtzdHlsZS5taW4taGVpZ2h0XT1cImdldEhlaWdodCgpXCJcbiAgICBjbGFzcz1cInRkLWxvYWRpbmdcIlxuICA+XG4gICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyXG4gICAgICAqbmdJZj1cImlzQ2lyY3VsYXIoKVwiXG4gICAgICBbbW9kZV09XCJtb2RlXCJcbiAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICBbY29sb3JdPVwiY29sb3JcIlxuICAgICAgW2RpYW1ldGVyXT1cImdldENpcmNsZURpYW1ldGVyKClcIlxuICAgICAgW3N0cm9rZVdpZHRoXT1cImdldENpcmNsZVN0cm9rZVdpZHRoKClcIlxuICAgID48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICAgIDxtYXQtcHJvZ3Jlc3MtYmFyXG4gICAgICAqbmdJZj1cImlzTGluZWFyKClcIlxuICAgICAgW21vZGVdPVwibW9kZVwiXG4gICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgW2NvbG9yXT1cImNvbG9yXCJcbiAgICA+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICA8L2Rpdj5cbiAgPG5nLXRlbXBsYXRlIFtjZGtQb3J0YWxPdXRsZXRdPVwiY29udGVudFwiPjwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbiJdfQ==","import { Injectable, ComponentFactoryResolver, SkipSelf, Optional, inject, } from '@angular/core';\nimport { Injector, } from '@angular/core';\nimport { TemplatePortal, ComponentPortal } from '@angular/cdk/portal';\nimport { Overlay, OverlayConfig } from '@angular/cdk/overlay';\nimport { Subject } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { TdLoadingComponent, LoadingStyle } from '../loading.component';\nimport * as i0 from \"@angular/core\";\n/**\n * NOTE: @internal usage only.\n */\nexport class TdLoadingFactory {\n _componentFactoryResolver = inject(ComponentFactoryResolver);\n _overlay = inject(Overlay);\n _injector = inject(Injector);\n /**\n * Uses material `Overlay` services to create a DOM element and attach the loading component\n * into it. Leveraging the state and configuration from it.\n *\n * Saves a reference in context to be called when registering/resolving the loading element.\n */\n createFullScreenComponent(options) {\n options.height = undefined;\n options.style = LoadingStyle.FullScreen;\n const loadingRef = this._initializeContext();\n let loading = false;\n let overlayRef;\n loadingRef.observable\n .pipe(distinctUntilChanged())\n .subscribe((registered) => {\n if (registered > 0 && !loading) {\n loading = true;\n overlayRef = this._createOverlay();\n loadingRef.componentRef = overlayRef.attach(new ComponentPortal(TdLoadingComponent));\n this._mapOptions(options, loadingRef.componentRef?.instance);\n loadingRef.componentRef?.instance.show();\n loadingRef.componentRef?.changeDetectorRef.detectChanges();\n }\n else if (registered <= 0 && loading) {\n loading = false;\n loadingRef.componentRef?.instance.hide();\n loadingRef.componentRef?.destroy();\n overlayRef.detach();\n overlayRef.dispose();\n }\n });\n return loadingRef;\n }\n /**\n * Creates a loading component dynamically and attaches it into the given viewContainerRef.\n * Leverages TemplatePortals from material to inject the template inside of it so it fits\n * perfectly when overlaying it.\n *\n * Saves a reference in context to be called when registering/resolving the loading element.\n */\n createOverlayComponent(options, viewContainerRef, templateRef) {\n options.height = undefined;\n options.style = LoadingStyle.Overlay;\n const loadingRef = this._createComponent(options);\n let loading = false;\n if (loadingRef.componentRef) {\n loadingRef.componentRef.instance.content = new TemplatePortal(templateRef, viewContainerRef);\n viewContainerRef.clear();\n viewContainerRef.insert(loadingRef.componentRef?.hostView, 0);\n }\n loadingRef.observable\n .pipe(distinctUntilChanged())\n .subscribe((registered) => {\n if (registered > 0 && !loading) {\n loading = true;\n loadingRef.componentRef?.instance.show();\n }\n else if (registered <= 0 && loading) {\n loading = false;\n loadingRef.componentRef?.instance.hide();\n }\n });\n return loadingRef;\n }\n /**\n * Creates a loading component dynamically and attaches it into the given viewContainerRef.\n * Replaces the template with the loading component depending if it was registered or resolved.\n *\n * Saves a reference in context to be called when registering/resolving the loading element.\n */\n createReplaceComponent(options, viewContainerRef, templateRef, context) {\n const nativeElement = (templateRef.elementRef.nativeElement);\n options.height = nativeElement.nextElementSibling\n ? nativeElement.nextElementSibling.scrollHeight\n : undefined;\n options.style = LoadingStyle.None;\n const loadingRef = this._createComponent(options);\n let loading = false;\n // passing context so when the template is attached, we can keep the reference of the variables\n const contentRef = viewContainerRef.createEmbeddedView(templateRef, context);\n loadingRef.observable\n .pipe(distinctUntilChanged())\n .subscribe((registered) => {\n if (registered > 0 && !loading && loadingRef.componentRef) {\n loading = true;\n // detach the content and attach the loader if loader is there\n const index = viewContainerRef.indexOf(loadingRef.componentRef.hostView);\n if (index < 0) {\n viewContainerRef.detach(viewContainerRef.indexOf(contentRef));\n viewContainerRef.insert(loadingRef.componentRef.hostView, 0);\n }\n loadingRef.componentRef?.instance.show();\n }\n else if (registered <= 0 && loading && loadingRef.componentRef) {\n loading = false;\n loadingRef.componentRef?.instance.hide();\n // detach loader and attach the content if content is there\n const index = viewContainerRef.indexOf(contentRef);\n if (index < 0) {\n viewContainerRef.detach(viewContainerRef.indexOf(loadingRef.componentRef.hostView));\n viewContainerRef.insert(contentRef, 0);\n }\n /**\n * Need to call \"markForCheck\" and \"detectChanges\" on attached template, so its detected by parent component when attached\n * with \"OnPush\" change detection\n */\n contentRef.detectChanges();\n contentRef.markForCheck();\n }\n });\n return loadingRef;\n }\n /**\n * Creates a fullscreen overlay for the loading usage.\n */\n _createOverlay() {\n const state = new OverlayConfig();\n state.hasBackdrop = false;\n state.positionStrategy = this._overlay\n .position()\n .global()\n .centerHorizontally()\n .centerVertically();\n return this._overlay.create(state);\n }\n /**\n * Creates a generic component dynamically waiting to be attached to a viewContainerRef.\n */\n _createComponent(options) {\n const compRef = this._initializeContext();\n compRef.componentRef = this._componentFactoryResolver\n .resolveComponentFactory(TdLoadingComponent)\n .create(this._injector);\n this._mapOptions(options, compRef.componentRef.instance);\n return compRef;\n }\n /**\n * Initialize context for loading component.\n */\n _initializeContext() {\n const subject = new Subject();\n return {\n observable: subject.asObservable(),\n subject,\n componentRef: undefined,\n times: 0,\n };\n }\n /**\n * Maps configuration to the loading component instance.\n */\n _mapOptions(options, instance) {\n if (options.style) {\n instance.style = options.style;\n }\n if (options.type !== undefined) {\n instance.type = options.type;\n }\n if (options.height !== undefined) {\n instance.height = options.height;\n }\n if (options.mode !== undefined) {\n instance.mode = options.mode;\n }\n if (options.color !== undefined) {\n instance.color = options.color;\n }\n }\n static ɵfac = function TdLoadingFactory_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TdLoadingFactory)(); };\n static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: TdLoadingFactory, factory: TdLoadingFactory.ɵfac });\n}\n(() => { (typeof ngDevMode === \"undefined\" || ngDevMode) && i0.ɵsetClassMetadata(TdLoadingFactory, [{\n type: Injectable\n }], null, null); })();\nexport function LOADING_FACTORY_PROVIDER_FACTORY(parent) {\n return parent || new TdLoadingFactory();\n}\nexport const LOADING_FACTORY_PROVIDER = {\n // If there is already a service available, use that. Otherwise, provide a new one.\n provide: TdLoadingFactory,\n deps: [\n [new Optional(), new SkipSelf(), TdLoadingFactory],\n ComponentFactoryResolver,\n Overlay,\n Injector,\n ],\n useFactory: LOADING_FACTORY_PROVIDER_FACTORY,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGluZy5mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2xvYWRpbmcvc3JjL3NlcnZpY2VzL2xvYWRpbmcuZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLHdCQUF3QixFQUV4QixRQUFRLEVBQ1IsUUFBUSxFQUVSLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsUUFBUSxHQUlULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQWMsTUFBTSxzQkFBc0IsQ0FBQztBQUUxRSxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFleEU7O0dBRUc7QUFFSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ25CLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzdELFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVyQzs7Ozs7T0FLRztJQUNJLHlCQUF5QixDQUFDLE9BQXlCO1FBQzlCLE9BQVEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQzVCLE9BQVEsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUNuRSxNQUFNLFVBQVUsR0FBZ0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUQsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FB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WUFDaEMsUUFBUSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDOzBHQTFNVSxnQkFBZ0I7Z0VBQWhCLGdCQUFnQixXQUFoQixnQkFBZ0I7O2lGQUFoQixnQkFBZ0I7Y0FENUIsVUFBVTs7QUE4TVgsTUFBTSxVQUFVLGdDQUFnQyxDQUM5QyxNQUF3QjtJQUV4QixPQUFPLE1BQU0sSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7QUFDMUMsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFhO0lBQ2hELG1GQUFtRjtJQUNuRixPQUFPLEVBQUUsZ0JBQWdCO0lBQ3pCLElBQUksRUFBRTtRQUNKLENBQUMsSUFBSSxRQUFRLEVBQUUsRUFBRSxJQUFJLFFBQVEsRUFBRSxFQUFFLGdCQUFnQixDQUFDO1FBQ2xELHdCQUF3QjtRQUN4QixPQUFPO1FBQ1AsUUFBUTtLQUNUO0lBQ0QsVUFBVSxFQUFFLGdDQUFnQztDQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBQcm92aWRlcixcbiAgU2tpcFNlbGYsXG4gIE9wdGlvbmFsLFxuICBFbWJlZGRlZFZpZXdSZWYsXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBJbmplY3RvcixcbiAgQ29tcG9uZW50UmVmLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBvcnRhbCwgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVGRMb2FkaW5nQ29udGV4dCB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvbG9hZGluZy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgVGRMb2FkaW5nQ29tcG9uZW50LCBMb2FkaW5nU3R5bGUgfSBmcm9tICcuLi9sb2FkaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJVGRMb2FkaW5nQ29uZmlnIH0gZnJvbSAnLi9sb2FkaW5nLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElJbnRlcm5hbExvYWRpbmdPcHRpb25zIGV4dGVuZHMgSVRkTG9hZGluZ0NvbmZpZyB7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgc3R5bGU/OiBMb2FkaW5nU3R5bGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvYWRpbmdSZWYge1xuICBvYnNlcnZhYmxlOiBPYnNlcnZhYmxlPGFueT47XG4gIGNvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjxhbnk+O1xuICBzdWJqZWN0OiBTdWJqZWN0PGFueT47XG4gIHRpbWVzOiBudW1iZXI7XG59XG5cbi8qKlxuICogTk9URTogQGludGVybmFsIHVzYWdlIG9ubHkuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUZExvYWRpbmdGYWN0b3J5IHtcbiAgcHJpdmF0ZSBfY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gaW5qZWN0KENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcik7XG4gIHByaXZhdGUgX292ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICAvKipcbiAgICogVXNlcyBtYXRlcmlhbCBgT3ZlcmxheWAgc2VydmljZXMgdG8gY3JlYXRlIGEgRE9NIGVsZW1lbnQgYW5kIGF0dGFjaCB0aGUgbG9hZGluZyBjb21wb25lbnRcbiAgICogaW50byBpdC4gTGV2ZXJhZ2luZyB0aGUgc3RhdGUgYW5kIGNvbmZpZ3VyYXRpb24gZnJvbSBpdC5cbiAgICpcbiAgICogU2F2ZXMgYSByZWZlcmVuY2UgaW4gY29udGV4dCB0byBiZSBjYWxsZWQgd2hlbiByZWdpc3RlcmluZy9yZXNvbHZpbmcgdGhlIGxvYWRpbmcgZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBjcmVhdGVGdWxsU2NyZWVuQ29tcG9uZW50KG9wdGlvbnM6IElUZExvYWRpbmdDb25maWcpOiBJTG9hZGluZ1JlZiB7XG4gICAgKDxJSW50ZXJuYWxMb2FkaW5nT3B0aW9ucz5vcHRpb25zKS5oZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgKDxJSW50ZXJuYWxMb2FkaW5nT3B0aW9ucz5vcHRpb25zKS5zdHlsZSA9IExvYWRpbmdTdHlsZS5GdWxsU2NyZWVuO1xuICAgIGNvbnN0IGxvYWRpbmdSZWY6IElMb2FkaW5nUmVmID0gdGhpcy5faW5pdGlhbGl6ZUNvbnRleHQoKTtcbiAgICBsZXQgbG9hZGluZyA9IGZhbHNlO1xuICAgIGxldCBvdmVybGF5UmVmOiBPdmVybGF5UmVmO1xuICAgIGxvYWRpbmdSZWYub2JzZXJ2YWJsZVxuICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlZ2lzdGVyZWQ6IG51bWJlcikgPT4ge1xuICAgICAgICBpZiAocmVnaXN0ZXJlZCA+IDAgJiYgIWxvYWRpbmcpIHtcbiAgICAgICAgICBsb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICBvdmVybGF5UmVmID0gdGhpcy5fY3JlYXRlT3ZlcmxheSgpO1xuICAgICAgICAgIGxvYWRpbmdSZWYuY29tcG9uZW50UmVmID0gb3ZlcmxheVJlZi5hdHRhY2goXG4gICAgICAgICAgICBuZXcgQ29tcG9uZW50UG9ydGFsKFRkTG9hZGluZ0NvbXBvbmVudCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9tYXBPcHRpb25zKG9wdGlvbnMsIGxvYWRpbmdSZWYuY29tcG9uZW50UmVmPy5pbnN0YW5jZSk7XG4gICAgICAgICAgbG9hZGluZ1JlZi5jb21wb25lbnRSZWY/Lmluc3RhbmNlLnNob3coKTtcbiAgICAgICAgICBsb2FkaW5nUmVmLmNvbXBvbmVudFJlZj8uY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlZ2lzdGVyZWQgPD0gMCAmJiBsb2FkaW5nKSB7XG4gICAgICAgICAgbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIGxvYWRpbmdSZWYuY29tcG9uZW50UmVmPy5pbnN0YW5jZS5oaWRlKCk7XG4gICAgICAgICAgbG9hZGluZ1JlZi5jb21wb25lbnRSZWY/LmRlc3Ryb3koKTtcbiAgICAgICAgICBvdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgICAgIG92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICByZXR1cm4gbG9hZGluZ1JlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbG9hZGluZyBjb21wb25lbnQgZHluYW1pY2FsbHkgYW5kIGF0dGFjaGVzIGl0IGludG8gdGhlIGdpdmVuIHZpZXdDb250YWluZXJSZWYuXG4gICAqIExldmVyYWdlcyBUZW1wbGF0ZVBvcnRhbHMgZnJvbSBtYXRlcmlhbCB0byBpbmplY3QgdGhlIHRlbXBsYXRlIGluc2lkZSBvZiBpdCBzbyBpdCBmaXRzXG4gICAqIHBlcmZlY3RseSB3aGVuIG92ZXJsYXlpbmcgaXQuXG4gICAqXG4gICAqIFNhdmVzIGEgcmVmZXJlbmNlIGluIGNvbnRleHQgdG8gYmUgY2FsbGVkIHdoZW4gcmVnaXN0ZXJpbmcvcmVzb2x2aW5nIHRoZSBsb2FkaW5nIGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlT3ZlcmxheUNvbXBvbmVudChcbiAgICBvcHRpb25zOiBJVGRMb2FkaW5nQ29uZmlnLFxuICAgIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPG9iamVjdD4sXG4gICk6IElMb2FkaW5nUmVmIHtcbiAgICAoPElJbnRlcm5hbExvYWRpbmdPcHRpb25zPm9wdGlvbnMpLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICAoPElJbnRlcm5hbExvYWRpbmdPcHRpb25zPm9wdGlvbnMpLnN0eWxlID0gTG9hZGluZ1N0eWxlLk92ZXJsYXk7XG4gICAgY29uc3QgbG9hZGluZ1JlZjogSUxvYWRpbmdSZWYgPSB0aGlzLl9jcmVhdGVDb21wb25lbnQob3B0aW9ucyk7XG4gICAgbGV0IGxvYWRpbmcgPSBmYWxzZTtcblxuICAgIGlmIChsb2FkaW5nUmVmLmNvbXBvbmVudFJlZikge1xuICAgICAgbG9hZGluZ1JlZi5jb21wb25lbnRSZWYuaW5zdGFuY2UuY29udGVudCA9IG5ldyBUZW1wbGF0ZVBvcnRhbChcbiAgICAgICAgdGVtcGxhdGVSZWYsXG4gICAgICAgIHZpZXdDb250YWluZXJSZWYsXG4gICAgICApO1xuICAgICAgdmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xuICAgICAgdmlld0NvbnRhaW5lclJlZi5pbnNlcnQobG9hZGluZ1JlZi5jb21wb25lbnRSZWY/Lmhvc3RWaWV3LCAwKTtcbiAgICB9XG5cbiAgICBsb2FkaW5nUmVmLm9ic2VydmFibGVcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgICAuc3Vic2NyaWJlKChyZWdpc3RlcmVkOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHJlZ2lzdGVyZWQgPiAwICYmICFsb2FkaW5nKSB7XG4gICAgICAgICAgbG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgbG9hZGluZ1JlZi5jb21wb25lbnRSZWY/Lmluc3RhbmNlLnNob3coKTtcbiAgICAgICAgfSBlbHNlIGlmICh