@decaf-ts/for-angular 0.0.12 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +19 -92
- package/LICENSE.md +0 -659
- package/dist/for-angular/cli/cli-module.d.ts +0 -22
- package/dist/for-angular/cli/cli-module.d.ts.map +0 -1
- package/dist/for-angular/cli/cli-module.js +0 -131
- package/dist/for-angular/cli/cli-module.js.map +0 -1
- package/dist/lib/README.md +0 -92
- package/dist/lib/assets/i18n/en.json +0 -140
- package/dist/lib/assets/images/angular-logo.svg +0 -45
- package/dist/lib/assets/images/decaf-logo-black.svg +0 -22
- package/dist/lib/assets/images/decaf-logo-lw.svg +0 -50
- package/dist/lib/assets/images/decaf-logo-white.svg +0 -22
- package/dist/lib/assets/images/decaf-logo.svg +0 -54
- package/dist/lib/components/component-renderer/component-renderer.component.d.ts +0 -277
- package/dist/lib/components/component-renderer/component-renderer.component.d.ts.map +0 -1
- package/dist/lib/components/crud-field/crud-field.component.d.ts +0 -446
- package/dist/lib/components/crud-field/crud-field.component.d.ts.map +0 -1
- package/dist/lib/components/crud-form/constants.d.ts +0 -6
- package/dist/lib/components/crud-form/constants.d.ts.map +0 -1
- package/dist/lib/components/crud-form/crud-form.component.d.ts +0 -103
- package/dist/lib/components/crud-form/crud-form.component.d.ts.map +0 -1
- package/dist/lib/components/crud-form/types.d.ts +0 -18
- package/dist/lib/components/crud-form/types.d.ts.map +0 -1
- package/dist/lib/components/empty-state/empty-state.component.d.ts +0 -302
- package/dist/lib/components/empty-state/empty-state.component.d.ts.map +0 -1
- package/dist/lib/components/fieldset/fieldset.component.d.ts +0 -200
- package/dist/lib/components/fieldset/fieldset.component.d.ts.map +0 -1
- package/dist/lib/components/filter/filter.component.d.ts +0 -506
- package/dist/lib/components/filter/filter.component.d.ts.map +0 -1
- package/dist/lib/components/for-angular-components.module.d.ts +0 -21
- package/dist/lib/components/for-angular-components.module.d.ts.map +0 -1
- package/dist/lib/components/index.d.ts +0 -17
- package/dist/lib/components/index.d.ts.map +0 -1
- package/dist/lib/components/layout/layout.component.d.ts +0 -134
- package/dist/lib/components/layout/layout.component.d.ts.map +0 -1
- package/dist/lib/components/list/constants.d.ts +0 -30
- package/dist/lib/components/list/constants.d.ts.map +0 -1
- package/dist/lib/components/list/list.component.d.ts +0 -850
- package/dist/lib/components/list/list.component.d.ts.map +0 -1
- package/dist/lib/components/list-item/list-item.component.d.ts +0 -391
- package/dist/lib/components/list-item/list-item.component.d.ts.map +0 -1
- package/dist/lib/components/model-renderer/model-renderer.component.d.ts +0 -97
- package/dist/lib/components/model-renderer/model-renderer.component.d.ts.map +0 -1
- package/dist/lib/components/pagination/constants.d.ts +0 -8
- package/dist/lib/components/pagination/constants.d.ts.map +0 -1
- package/dist/lib/components/pagination/pagination.component.d.ts +0 -265
- package/dist/lib/components/pagination/pagination.component.d.ts.map +0 -1
- package/dist/lib/components/searchbar/searchbar.component.d.ts +0 -408
- package/dist/lib/components/searchbar/searchbar.component.d.ts.map +0 -1
- package/dist/lib/decaf-ts-for-angular.d.ts.map +0 -1
- package/dist/lib/directives/collapsable.directive.d.ts +0 -9
- package/dist/lib/directives/collapsable.directive.d.ts.map +0 -1
- package/dist/lib/directives/index.d.ts +0 -2
- package/dist/lib/directives/index.d.ts.map +0 -1
- package/dist/lib/engine/DynamicModule.d.ts +0 -18
- package/dist/lib/engine/DynamicModule.d.ts.map +0 -1
- package/dist/lib/engine/NgxBaseComponent.d.ts +0 -542
- package/dist/lib/engine/NgxBaseComponent.d.ts.map +0 -1
- package/dist/lib/engine/NgxCrudFormField.d.ts +0 -119
- package/dist/lib/engine/NgxCrudFormField.d.ts.map +0 -1
- package/dist/lib/engine/NgxFormService.d.ts +0 -168
- package/dist/lib/engine/NgxFormService.d.ts.map +0 -1
- package/dist/lib/engine/NgxRenderingEngine.d.ts +0 -128
- package/dist/lib/engine/NgxRenderingEngine.d.ts.map +0 -1
- package/dist/lib/engine/NgxRenderingEngine2.d.ts +0 -251
- package/dist/lib/engine/NgxRenderingEngine2.d.ts.map +0 -1
- package/dist/lib/engine/ValidatorFactory.d.ts +0 -16
- package/dist/lib/engine/ValidatorFactory.d.ts.map +0 -1
- package/dist/lib/engine/constants.d.ts +0 -152
- package/dist/lib/engine/constants.d.ts.map +0 -1
- package/dist/lib/engine/decorators.d.ts +0 -26
- package/dist/lib/engine/decorators.d.ts.map +0 -1
- package/dist/lib/engine/index.d.ts +0 -17
- package/dist/lib/engine/index.d.ts.map +0 -1
- package/dist/lib/engine/types.d.ts +0 -382
- package/dist/lib/engine/types.d.ts.map +0 -1
- package/dist/lib/esm2022/components/component-renderer/component-renderer.component.mjs +0 -359
- package/dist/lib/esm2022/components/crud-field/crud-field.component.mjs +0 -456
- package/dist/lib/esm2022/components/crud-form/constants.mjs +0 -14
- package/dist/lib/esm2022/components/crud-form/crud-form.component.mjs +0 -272
- package/dist/lib/esm2022/components/crud-form/types.mjs +0 -2
- package/dist/lib/esm2022/components/empty-state/empty-state.component.mjs +0 -410
- package/dist/lib/esm2022/components/fieldset/fieldset.component.mjs +0 -250
- package/dist/lib/esm2022/components/filter/filter.component.mjs +0 -906
- package/dist/lib/esm2022/components/for-angular-components.module.mjs +0 -72
- package/dist/lib/esm2022/components/index.mjs +0 -20
- package/dist/lib/esm2022/components/layout/layout.component.mjs +0 -245
- package/dist/lib/esm2022/components/list/constants.mjs +0 -6
- package/dist/lib/esm2022/components/list/list.component.mjs +0 -1405
- package/dist/lib/esm2022/components/list-item/list-item.component.mjs +0 -612
- package/dist/lib/esm2022/components/model-renderer/model-renderer.component.mjs +0 -182
- package/dist/lib/esm2022/components/pagination/constants.mjs +0 -2
- package/dist/lib/esm2022/components/pagination/pagination.component.mjs +0 -364
- package/dist/lib/esm2022/components/searchbar/searchbar.component.mjs +0 -503
- package/dist/lib/esm2022/decaf-ts-for-angular.mjs +0 -5
- package/dist/lib/esm2022/directives/collapsable.directive.mjs +0 -28
- package/dist/lib/esm2022/directives/index.mjs +0 -2
- package/dist/lib/esm2022/engine/DynamicModule.mjs +0 -18
- package/dist/lib/esm2022/engine/NgxBaseComponent.mjs +0 -546
- package/dist/lib/esm2022/engine/NgxCrudFormField.mjs +0 -125
- package/dist/lib/esm2022/engine/NgxFormService.mjs +0 -315
- package/dist/lib/esm2022/engine/NgxRenderingEngine.mjs +0 -192
- package/dist/lib/esm2022/engine/NgxRenderingEngine2.mjs +0 -332
- package/dist/lib/esm2022/engine/ValidatorFactory.mjs +0 -102
- package/dist/lib/esm2022/engine/constants.mjs +0 -160
- package/dist/lib/esm2022/engine/decorators.mjs +0 -38
- package/dist/lib/esm2022/engine/index.mjs +0 -17
- package/dist/lib/esm2022/engine/types.mjs +0 -4
- package/dist/lib/esm2022/for-angular.module.mjs +0 -119
- package/dist/lib/esm2022/helpers/index.mjs +0 -13
- package/dist/lib/esm2022/helpers/utils.mjs +0 -415
- package/dist/lib/esm2022/interfaces.mjs +0 -2
- package/dist/lib/esm2022/public-apis.mjs +0 -14
- package/dist/lib/fesm2022/decaf-ts-for-angular.mjs +0 -8293
- package/dist/lib/fesm2022/decaf-ts-for-angular.mjs.map +0 -1
- package/dist/lib/for-angular.module.d.ts +0 -46
- package/dist/lib/for-angular.module.d.ts.map +0 -1
- package/dist/lib/helpers/index.d.ts +0 -13
- package/dist/lib/helpers/index.d.ts.map +0 -1
- package/dist/lib/helpers/utils.d.ts +0 -254
- package/dist/lib/helpers/utils.d.ts.map +0 -1
- package/dist/lib/index.d.ts +0 -6
- package/dist/lib/interfaces.d.ts +0 -29
- package/dist/lib/interfaces.d.ts.map +0 -1
- package/dist/lib/public-apis.d.ts +0 -14
- package/dist/lib/public-apis.d.ts.map +0 -1
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, inject, Injector, Input, Output, TemplateRef, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
2
|
-
import { Model, sf } from '@decaf-ts/decorator-validation';
|
|
3
|
-
import { NgComponentOutlet } from '@angular/common';
|
|
4
|
-
import { AngularEngineKeys, BaseComponentProps, NgxRenderingEngine2, } from '../../engine';
|
|
5
|
-
import { ForAngularModule } from '../../for-angular.module';
|
|
6
|
-
import { ComponentRendererComponent } from '../component-renderer/component-renderer.component';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@angular/common";
|
|
9
|
-
const _c0 = ["inner"];
|
|
10
|
-
const _c1 = ["componentOuter"];
|
|
11
|
-
function ModelRendererComponent_ng_template_0_Template(rf, ctx) { }
|
|
12
|
-
function ModelRendererComponent_ng_template_2_For_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
13
|
-
i0.ɵɵelement(0, "ngx-decaf-component-renderer", 4);
|
|
14
|
-
} if (rf & 2) {
|
|
15
|
-
const child_r1 = i0.ɵɵnextContext().$implicit;
|
|
16
|
-
i0.ɵɵproperty("parent", child_r1);
|
|
17
|
-
} }
|
|
18
|
-
function ModelRendererComponent_ng_template_2_For_2_Conditional_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
19
|
-
i0.ɵɵelementContainer(0, null, 2);
|
|
20
|
-
} }
|
|
21
|
-
function ModelRendererComponent_ng_template_2_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
22
|
-
i0.ɵɵtemplate(0, ModelRendererComponent_ng_template_2_For_2_Conditional_1_ng_container_0_Template, 2, 0, "ng-container", 5);
|
|
23
|
-
} if (rf & 2) {
|
|
24
|
-
const child_r1 = i0.ɵɵnextContext().$implicit;
|
|
25
|
-
i0.ɵɵproperty("ngComponentOutlet", child_r1.component)("ngComponentOutletInjector", child_r1.injector)("ngComponentOutletInputs", child_r1.inputs)("ngComponentOutletContent", child_r1.content);
|
|
26
|
-
} }
|
|
27
|
-
function ModelRendererComponent_ng_template_2_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
28
|
-
i0.ɵɵtemplate(0, ModelRendererComponent_ng_template_2_For_2_Conditional_0_Template, 1, 1, "ngx-decaf-component-renderer", 4)(1, ModelRendererComponent_ng_template_2_For_2_Conditional_1_Template, 1, 4, "ng-container");
|
|
29
|
-
} if (rf & 2) {
|
|
30
|
-
const child_r1 = ctx.$implicit;
|
|
31
|
-
i0.ɵɵconditional((child_r1 == null ? null : child_r1.children == null ? null : child_r1.children.length) ? 0 : 1);
|
|
32
|
-
} }
|
|
33
|
-
function ModelRendererComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
34
|
-
i0.ɵɵelementStart(0, "div", 3);
|
|
35
|
-
i0.ɵɵrepeaterCreate(1, ModelRendererComponent_ng_template_2_For_2_Template, 2, 1, null, null, i0.ɵɵrepeaterTrackByIdentity);
|
|
36
|
-
i0.ɵɵelementEnd();
|
|
37
|
-
} if (rf & 2) {
|
|
38
|
-
const ctx_r1 = i0.ɵɵnextContext();
|
|
39
|
-
i0.ɵɵproperty("id", ctx_r1.rendererId || null);
|
|
40
|
-
i0.ɵɵadvance();
|
|
41
|
-
i0.ɵɵrepeater(ctx_r1.output == null ? null : ctx_r1.output.children);
|
|
42
|
-
} }
|
|
43
|
-
/**
|
|
44
|
-
* @description Component for rendering dynamic models
|
|
45
|
-
* @summary This component is responsible for dynamically rendering models,
|
|
46
|
-
* handling model changes, and managing event subscriptions for the rendered components.
|
|
47
|
-
* It uses the NgxRenderingEngine2 to render the models and supports both string and Model inputs.
|
|
48
|
-
* @class
|
|
49
|
-
* @template M - Type extending Model
|
|
50
|
-
* @param {Injector} injector - Angular Injector for dependency injection
|
|
51
|
-
* @example
|
|
52
|
-
* <ngx-decaf-model-renderer
|
|
53
|
-
* [model]="myModel"
|
|
54
|
-
* [globals]="globalVariables"
|
|
55
|
-
* (listenEvent)="handleEvent($event)">
|
|
56
|
-
* </ngx-decaf-model-renderer>
|
|
57
|
-
* @mermaid
|
|
58
|
-
* sequenceDiagram
|
|
59
|
-
* participant App
|
|
60
|
-
* participant ModelRenderer
|
|
61
|
-
* participant RenderingEngine
|
|
62
|
-
* participant Model
|
|
63
|
-
* App->>ModelRenderer: Input model
|
|
64
|
-
* ModelRenderer->>Model: Parse if string
|
|
65
|
-
* Model-->>ModelRenderer: Parsed model
|
|
66
|
-
* ModelRenderer->>RenderingEngine: Render model
|
|
67
|
-
* RenderingEngine-->>ModelRenderer: Rendered output
|
|
68
|
-
* ModelRenderer->>ModelRenderer: Subscribe to events
|
|
69
|
-
* ModelRenderer-->>App: Emit events
|
|
70
|
-
*/
|
|
71
|
-
export class ModelRendererComponent {
|
|
72
|
-
constructor() {
|
|
73
|
-
/**
|
|
74
|
-
* @description Global variables to be passed to the rendered component
|
|
75
|
-
*/
|
|
76
|
-
this.globals = {};
|
|
77
|
-
/**
|
|
78
|
-
* @description Event emitter for custom events from the rendered component
|
|
79
|
-
*/
|
|
80
|
-
this.listenEvent = new EventEmitter();
|
|
81
|
-
this.injector = inject(Injector);
|
|
82
|
-
this.JSON = JSON;
|
|
83
|
-
}
|
|
84
|
-
// constructor() {}
|
|
85
|
-
/**
|
|
86
|
-
* @description Refreshes the rendered model
|
|
87
|
-
* @param {string | M} model - The model to be rendered
|
|
88
|
-
*/
|
|
89
|
-
refresh(model) {
|
|
90
|
-
model =
|
|
91
|
-
typeof model === 'string'
|
|
92
|
-
? Model.build({}, model)
|
|
93
|
-
: model;
|
|
94
|
-
this.output = model.render(this.globals || {}, this.vcr, this.injector, this.inner);
|
|
95
|
-
if (this.output?.inputs)
|
|
96
|
-
this.rendererId = sf(AngularEngineKeys.RENDERED_ID, this.output.inputs['rendererId']);
|
|
97
|
-
this.instance = this.output?.instance;
|
|
98
|
-
this.subscribeEvents();
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* @description Lifecycle hook that is called when data-bound properties of a directive change
|
|
102
|
-
* @param {SimpleChanges} changes - Object containing changes
|
|
103
|
-
*/
|
|
104
|
-
ngOnChanges(changes) {
|
|
105
|
-
if (changes[BaseComponentProps.MODEL]) {
|
|
106
|
-
const { currentValue } = changes[BaseComponentProps.MODEL];
|
|
107
|
-
this.refresh(currentValue);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* @description Lifecycle hook that is called when a directive, pipe, or service is destroyed
|
|
112
|
-
* @return {Promise<void>}
|
|
113
|
-
*/
|
|
114
|
-
async ngOnDestroy() {
|
|
115
|
-
if (this.instance) {
|
|
116
|
-
this.unsubscribeEvents();
|
|
117
|
-
await NgxRenderingEngine2.destroy();
|
|
118
|
-
}
|
|
119
|
-
this.output = undefined;
|
|
120
|
-
}
|
|
121
|
-
subscribeEvents() {
|
|
122
|
-
if (this.instance) {
|
|
123
|
-
const componentKeys = Object.keys(this.instance);
|
|
124
|
-
for (const key of componentKeys) {
|
|
125
|
-
const value = this.instance[key];
|
|
126
|
-
if (value instanceof EventEmitter)
|
|
127
|
-
this.instance[key].subscribe((event) => {
|
|
128
|
-
this.listenEvent.emit({
|
|
129
|
-
component: this.output?.component.name || '',
|
|
130
|
-
name: key,
|
|
131
|
-
...event,
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* @description Unsubscribes from events emitted by the rendered component
|
|
139
|
-
*/
|
|
140
|
-
unsubscribeEvents() {
|
|
141
|
-
if (this.instance) {
|
|
142
|
-
const componentKeys = Object.keys(this.instance);
|
|
143
|
-
for (const key of componentKeys) {
|
|
144
|
-
const value = this.instance[key];
|
|
145
|
-
if (value instanceof EventEmitter)
|
|
146
|
-
this.instance[key].unsubscribe();
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
static { this.ɵfac = function ModelRendererComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ModelRendererComponent)(); }; }
|
|
151
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ModelRendererComponent, selectors: [["ngx-decaf-model-renderer"]], viewQuery: function ModelRendererComponent_Query(rf, ctx) { if (rf & 1) {
|
|
152
|
-
i0.ɵɵviewQuery(_c0, 7, TemplateRef);
|
|
153
|
-
i0.ɵɵviewQuery(_c1, 7, ViewContainerRef);
|
|
154
|
-
} if (rf & 2) {
|
|
155
|
-
let _t;
|
|
156
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.inner = _t.first);
|
|
157
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.vcr = _t.first);
|
|
158
|
-
} }, inputs: { model: "model", globals: "globals", rendererId: "rendererId" }, outputs: { listenEvent: "listenEvent" }, standalone: true, features: [i0.ɵɵNgOnChangesFeature, i0.ɵɵStandaloneFeature], decls: 4, vars: 0, consts: [["componentOuter", ""], ["inner", ""], ["childComponents", ""], [3, "id"], [3, "parent"], [4, "ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletInputs", "ngComponentOutletContent"]], template: function ModelRendererComponent_Template(rf, ctx) { if (rf & 1) {
|
|
159
|
-
i0.ɵɵtemplate(0, ModelRendererComponent_ng_template_0_Template, 0, 0, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor)(2, ModelRendererComponent_ng_template_2_Template, 3, 1, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
|
|
160
|
-
} }, dependencies: [ForAngularModule, i1.NgComponentOutlet, ComponentRendererComponent] }); }
|
|
161
|
-
}
|
|
162
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ModelRendererComponent, [{
|
|
163
|
-
type: Component,
|
|
164
|
-
args: [{ standalone: true, imports: [ForAngularModule, NgComponentOutlet, ComponentRendererComponent], selector: 'ngx-decaf-model-renderer', template: " <ng-template #componentOuter></ng-template>\n <ng-template #inner>\n <div [id]=\"rendererId || null\">\n @for (child of output?.children; track child) {\n @if(child?.children?.length) {\n <ngx-decaf-component-renderer [parent]=\"child\" />\n } @else {\n <ng-container\n #childComponents\n *ngComponentOutlet=\"\n child.component;\n injector: child.injector;\n inputs: child.inputs;\n content:child.content;\n \"\n />\n }\n }\n </div>\n </ng-template>\n" }]
|
|
165
|
-
}], null, { model: [{
|
|
166
|
-
type: Input,
|
|
167
|
-
args: [{ required: true }]
|
|
168
|
-
}], globals: [{
|
|
169
|
-
type: Input
|
|
170
|
-
}], inner: [{
|
|
171
|
-
type: ViewChild,
|
|
172
|
-
args: ['inner', { read: TemplateRef, static: true }]
|
|
173
|
-
}], rendererId: [{
|
|
174
|
-
type: Input
|
|
175
|
-
}], vcr: [{
|
|
176
|
-
type: ViewChild,
|
|
177
|
-
args: ['componentOuter', { static: true, read: ViewContainerRef }]
|
|
178
|
-
}], listenEvent: [{
|
|
179
|
-
type: Output
|
|
180
|
-
}] }); })();
|
|
181
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ModelRendererComponent, { className: "ModelRendererComponent", filePath: "components/model-renderer/model-renderer.component.ts", lineNumber: 65 }); })();
|
|
182
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vZGVsLXJlbmRlcmVyL21vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2RlbC1yZW5kZXJlci9tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUVsQixtQkFBbUIsR0FFcEIsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFNUQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7Ozs7SUN0QnRGLGtEQUFpRDs7O0lBQW5CLGlDQUFnQjs7O0lBRTlDLGlDQVFFOzs7SUFSRiwySEFRRTs7O0lBRmlCLEFBREEsQUFEQSxBQUZoQixzREFFZ0IsZ0RBQ0EsNENBQ0EsOENBRTdCOzs7SUFUVSxBQUZGLDRIQUE4Qiw0RkFFckI7OztJQUZULGlIQVlDOzs7SUFkTCw4QkFBZ0M7SUFDOUIsMkhBY0M7SUFDSCxpQkFBTTs7O0lBaEJBLDhDQUF5QjtJQUM3QixjQWNDO0lBZEQsb0VBY0M7O0FEWVA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQVFILE1BQU0sT0FBTyxzQkFBc0I7SUFQbkM7UUFpQkU7O1dBRUc7UUFFSCxZQUFPLEdBQTRCLEVBQUUsQ0FBQztRQXlCdEM7O1dBRUc7UUFFSCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUF1QixDQUFDO1FBWTlDLGFBQVEsR0FBYSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFrRjNCLFNBQUksR0FBRyxJQUFJLENBQUM7S0FDaEM7SUFqRkMsbUJBQW1CO0lBRW5COzs7T0FHRztJQUNLLE9BQU8sQ0FBQyxLQUFpQjtRQUMvQixLQUFLO1lBQ0gsT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFDdkIsQ0FBQyxDQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBTztnQkFDL0IsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNaLElBQUksQ0FBQyxNQUFNLEdBQUksS0FBK0IsQ0FBQyxNQUFNLENBQ25ELElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxFQUNsQixJQUFJLENBQUMsR0FBRyxFQUNSLElBQUksQ0FBQyxRQUFRLEVBQ2IsSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU07WUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQ2xCLGlCQUFpQixDQUFDLFdBQVcsRUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFrQyxDQUFDLFlBQVksQ0FBVyxDQUN4RSxDQUFDO1FBQ0osSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztRQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxXQUFXO1FBQ2YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsTUFBTSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsS0FBSyxNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakMsSUFBSSxLQUFLLFlBQVksWUFBWTtvQkFDOUIsSUFBSSxDQUFDLFFBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBK0IsRUFBRSxFQUFFO3dCQUM3RSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQzs0QkFDcEIsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLElBQUksSUFBSSxFQUFFOzRCQUM1QyxJQUFJLEVBQUUsR0FBRzs0QkFDVCxHQUFHLEtBQUs7eUJBQ2MsQ0FBQyxDQUFDO29CQUM1QixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssaUJBQWlCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELEtBQUssTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksS0FBSyxZQUFZLFlBQVk7b0JBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO3VIQXZJVSxzQkFBc0I7b0VBQXRCLHNCQUFzQjttQ0FtQkwsV0FBVzttQ0FpQlksZ0JBQWdCOzs7Ozs7WUNuR25FLEFBREEsd0hBQTZCLDJHQUNUOzRCRDBEVixnQkFBZ0Isd0JBQXFCLDBCQUEwQjs7aUZBSzlELHNCQUFzQjtjQVBsQyxTQUFTOzZCQUNJLElBQUksV0FDUCxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixDQUFDLFlBQ2hFLDBCQUEwQjtnQkFZcEMsS0FBSztrQkFESixLQUFLO21CQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQU96QixPQUFPO2tCQUROLEtBQUs7WUFPTixLQUFLO2tCQURKLFNBQVM7bUJBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO1lBWXZELFVBQVU7a0JBRFQsS0FBSztZQU9OLEdBQUc7a0JBREYsU0FBUzttQkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBT3JFLFdBQVc7a0JBRFYsTUFBTTs7a0ZBMUNJLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RlbCwgc2YgfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuaW1wb3J0IHsgTmdDb21wb25lbnRPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQW5ndWxhckR5bmFtaWNPdXRwdXQsXG4gIEFuZ3VsYXJFbmdpbmVLZXlzLFxuICBCYXNlQ29tcG9uZW50UHJvcHMsXG4gIEJhc2VDdXN0b21FdmVudCxcbiAgTmd4UmVuZGVyaW5nRW5naW5lMixcbiAgUmVuZGVyZWRNb2RlbCxcbn0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEtleVZhbHVlLCBSZW5kZXJlckN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lL3R5cGVzJztcbmltcG9ydCB7IEZvckFuZ3VsYXJNb2R1bGUgfSBmcm9tICcuLi8uLi9mb3ItYW5ndWxhci5tb2R1bGUnO1xuaW1wb3J0IHsgUmVuZGVyYWJsZSB9IGZyb20gJ0BkZWNhZi10cy91aS1kZWNvcmF0b3JzJztcbmltcG9ydCB7IENvbXBvbmVudFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50LXJlbmRlcmVyL2NvbXBvbmVudC1yZW5kZXJlci5jb21wb25lbnQnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnQgZm9yIHJlbmRlcmluZyBkeW5hbWljIG1vZGVsc1xuICogQHN1bW1hcnkgVGhpcyBjb21wb25lbnQgaXMgcmVzcG9uc2libGUgZm9yIGR5bmFtaWNhbGx5IHJlbmRlcmluZyBtb2RlbHMsXG4gKiBoYW5kbGluZyBtb2RlbCBjaGFuZ2VzLCBhbmQgbWFuYWdpbmcgZXZlbnQgc3Vic2NyaXB0aW9ucyBmb3IgdGhlIHJlbmRlcmVkIGNvbXBvbmVudHMuXG4gKiBJdCB1c2VzIHRoZSBOZ3hSZW5kZXJpbmdFbmdpbmUyIHRvIHJlbmRlciB0aGUgbW9kZWxzIGFuZCBzdXBwb3J0cyBib3RoIHN0cmluZyBhbmQgTW9kZWwgaW5wdXRzLlxuICogQGNsYXNzXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAcGFyYW0ge0luamVjdG9yfSBpbmplY3RvciAtIEFuZ3VsYXIgSW5qZWN0b3IgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uXG4gKiBAZXhhbXBsZVxuICogPG5neC1kZWNhZi1tb2RlbC1yZW5kZXJlclxuICogICBbbW9kZWxdPVwibXlNb2RlbFwiXG4gKiAgIFtnbG9iYWxzXT1cImdsb2JhbFZhcmlhYmxlc1wiXG4gKiAgIChsaXN0ZW5FdmVudCk9XCJoYW5kbGVFdmVudCgkZXZlbnQpXCI+XG4gKiA8L25neC1kZWNhZi1tb2RlbC1yZW5kZXJlcj5cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsUmVuZGVyZXJcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIEFwcC0+Pk1vZGVsUmVuZGVyZXI6IElucHV0IG1vZGVsXG4gKiAgIE1vZGVsUmVuZGVyZXItPj5Nb2RlbDogUGFyc2UgaWYgc3RyaW5nXG4gKiAgIE1vZGVsLS0+Pk1vZGVsUmVuZGVyZXI6IFBhcnNlZCBtb2RlbFxuICogICBNb2RlbFJlbmRlcmVyLT4+UmVuZGVyaW5nRW5naW5lOiBSZW5kZXIgbW9kZWxcbiAqICAgUmVuZGVyaW5nRW5naW5lLS0+Pk1vZGVsUmVuZGVyZXI6IFJlbmRlcmVkIG91dHB1dFxuICogICBNb2RlbFJlbmRlcmVyLT4+TW9kZWxSZW5kZXJlcjogU3Vic2NyaWJlIHRvIGV2ZW50c1xuICogICBNb2RlbFJlbmRlcmVyLS0+PkFwcDogRW1pdCBldmVudHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtGb3JBbmd1bGFyTW9kdWxlLCBOZ0NvbXBvbmVudE91dGxldCwgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRdLFxuICBzZWxlY3RvcjogJ25neC1kZWNhZi1tb2RlbC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIE1vZGVsUmVuZGVyZXJDb21wb25lbnQ8TSBleHRlbmRzIE1vZGVsPlxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBSZW5kZXJlZE1vZGVsIHtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIElucHV0IG1vZGVsIHRvIGJlIHJlbmRlcmVkXG4gICAqIEBzdW1tYXJ5IENhbiBiZSBhIE1vZGVsIGluc3RhbmNlIG9yIGEgSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtb2RlbFxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgbW9kZWwhOiBNIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2xvYmFsIHZhcmlhYmxlcyB0byBiZSBwYXNzZWQgdG8gdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZ2xvYmFsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRlbXBsYXRlIHJlZmVyZW5jZSBmb3IgaW5uZXIgY29udGVudFxuICAgKi9cbiAgQFZpZXdDaGlsZCgnaW5uZXInLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgaW5uZXI/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE91dHB1dCBvZiB0aGUgcmVuZGVyZWQgbW9kZWxcbiAgICovXG4gIG91dHB1dD86IEFuZ3VsYXJEeW5hbWljT3V0cHV0O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZW5kZXJlclxuICAgKi9cbiAgQElucHV0KClcbiAgcmVuZGVyZXJJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZpZXcgY29udGFpbmVyIHJlZmVyZW5jZSBmb3IgZHluYW1pYyBjb21wb25lbnQgcmVuZGVyaW5nXG4gICAqL1xuICBAVmlld0NoaWxkKCdjb21wb25lbnRPdXRlcicsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIHZjciE6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciBjdXN0b20gZXZlbnRzIGZyb20gdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIGxpc3RlbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxSZW5kZXJlckN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5zdGFuY2Ugb2YgdGhlIE5neFJlbmRlcmluZ0VuZ2luZTJcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyITogTmd4UmVuZGVyaW5nRW5naW5lMjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluc3RhbmNlIG9mIHRoZSByZW5kZXJlZCBjb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgaW5zdGFuY2UhOiBLZXlWYWx1ZSB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cbiAgLy8gY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmcmVzaGVzIHRoZSByZW5kZXJlZCBtb2RlbFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IE19IG1vZGVsIC0gVGhlIG1vZGVsIHRvIGJlIHJlbmRlcmVkXG4gICAqL1xuICBwcml2YXRlIHJlZnJlc2gobW9kZWw6IHN0cmluZyB8IE0pIHtcbiAgICBtb2RlbCA9XG4gICAgICB0eXBlb2YgbW9kZWwgPT09ICdzdHJpbmcnXG4gICAgICAgID8gKE1vZGVsLmJ1aWxkKHt9LCBtb2RlbCkgYXMgTSlcbiAgICAgICAgOiBtb2RlbDtcbiAgICB0aGlzLm91dHB1dCA9IChtb2RlbCBhcyB1bmtub3duIGFzIFJlbmRlcmFibGUpLnJlbmRlcjxBbmd1bGFyRHluYW1pY091dHB1dD4oXG4gICAgICB0aGlzLmdsb2JhbHMgfHwge30sXG4gICAgICB0aGlzLnZjcixcbiAgICAgIHRoaXMuaW5qZWN0b3IsXG4gICAgICB0aGlzLmlubmVyLFxuICAgICk7XG4gICAgaWYgKHRoaXMub3V0cHV0Py5pbnB1dHMpXG4gICAgICB0aGlzLnJlbmRlcmVySWQgPSBzZihcbiAgICAgICAgQW5ndWxhckVuZ2luZUtleXMuUkVOREVSRURfSUQsXG4gICAgICAgICh0aGlzLm91dHB1dC5pbnB1dHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pWydyZW5kZXJlcklkJ10gYXMgc3RyaW5nLFxuICAgICAgKTtcbiAgICB0aGlzLmluc3RhbmNlID0gdGhpcy5vdXRwdXQ/Lmluc3RhbmNlO1xuICAgIHRoaXMuc3Vic2NyaWJlRXZlbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpZmVjeWNsZSBob29rIHRoYXQgaXMgY2FsbGVkIHdoZW4gZGF0YS1ib3VuZCBwcm9wZXJ0aWVzIG9mIGEgZGlyZWN0aXZlIGNoYW5nZVxuICAgKiBAcGFyYW0ge1NpbXBsZUNoYW5nZXN9IGNoYW5nZXMgLSBPYmplY3QgY29udGFpbmluZyBjaGFuZ2VzXG4gICAqL1xuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbQmFzZUNvbXBvbmVudFByb3BzLk1PREVMXSkge1xuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IGNoYW5nZXNbQmFzZUNvbXBvbmVudFByb3BzLk1PREVMXTtcbiAgICAgIHRoaXMucmVmcmVzaChjdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgd2hlbiBhIGRpcmVjdGl2ZSwgcGlwZSwgb3Igc2VydmljZSBpcyBkZXN0cm95ZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIG5nT25EZXN0cm95KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlRXZlbnRzKCk7XG4gICAgICBhd2FpdCBOZ3hSZW5kZXJpbmdFbmdpbmUyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5vdXRwdXQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZUV2ZW50cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnN0YW5jZSkge1xuICAgICAgY29uc3QgY29tcG9uZW50S2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuaW5zdGFuY2UpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgY29tcG9uZW50S2V5cykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaW5zdGFuY2Vba2V5XTtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKVxuICAgICAgICAgICh0aGlzLmluc3RhbmNlIGFzIEtleVZhbHVlKVtrZXldLnN1YnNjcmliZSgoZXZlbnQ6IFBhcnRpYWw8QmFzZUN1c3RvbUV2ZW50PikgPT4ge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5FdmVudC5lbWl0KHtcbiAgICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLm91dHB1dD8uY29tcG9uZW50Lm5hbWUgfHwgJycsXG4gICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgICAgICB9IGFzIFJlbmRlcmVyQ3VzdG9tRXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5zdWJzY3JpYmVzIGZyb20gZXZlbnRzIGVtaXR0ZWQgYnkgdGhlIHJlbmRlcmVkIGNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZUV2ZW50cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnN0YW5jZSkge1xuICAgICAgY29uc3QgY29tcG9uZW50S2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuaW5zdGFuY2UpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgY29tcG9uZW50S2V5cykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaW5zdGFuY2Vba2V5XTtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKVxuICAgICAgICAgIHRoaXMuaW5zdGFuY2Vba2V5XS51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBKU09OID0gSlNPTjtcbn1cbiIsIiAgPG5nLXRlbXBsYXRlICNjb21wb25lbnRPdXRlcj48L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgI2lubmVyPlxuICAgIDxkaXYgIFtpZF09XCJyZW5kZXJlcklkIHx8IG51bGxcIj5cbiAgICAgIEBmb3IgKGNoaWxkIG9mIG91dHB1dD8uY2hpbGRyZW47IHRyYWNrIGNoaWxkKSB7XG4gICAgICAgIEBpZihjaGlsZD8uY2hpbGRyZW4/Lmxlbmd0aCkge1xuICAgICAgICAgIDxuZ3gtZGVjYWYtY29tcG9uZW50LXJlbmRlcmVyIFtwYXJlbnRdPVwiY2hpbGRcIiAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAjY2hpbGRDb21wb25lbnRzXG4gICAgICAgICAgICAqbmdDb21wb25lbnRPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgY2hpbGQuY29tcG9uZW50O1xuICAgICAgICAgICAgICBpbmplY3RvcjogY2hpbGQuaW5qZWN0b3I7XG4gICAgICAgICAgICAgIGlucHV0czogY2hpbGQuaW5wdXRzO1xuICAgICAgICAgICAgICBjb250ZW50OmNoaWxkLmNvbnRlbnQ7XG4gICAgICAgICAgICBcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3BhZ2luYXRpb24vY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ3VzdG9tRXZlbnQgfSBmcm9tIFwiLi4vLi4vZW5naW5lXCJcblxuZXhwb3J0IHR5cGUgUGFnaW5hdGlvbkN1c3RvbUV2ZW50ID0gQmFzZUN1c3RvbUV2ZW50ICYge1xuICBkYXRhOiB7XG4gICAgcGFnZTogbnVtYmVyLFxuICAgIGRpcmVjdGlvbjogJ25leHQnIHwgJ3ByZXZpb3VzJ1xuICB9XG59XG4iXX0=
|
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
import { IonIcon } from '@ionic/angular/standalone';
|
|
3
|
-
import { addIcons } from 'ionicons';
|
|
4
|
-
import { chevronBackOutline, chevronForwardOutline } from 'ionicons/icons';
|
|
5
|
-
import { ForAngularModule } from '../../for-angular.module';
|
|
6
|
-
import { NgxBaseComponent } from '../../engine/NgxBaseComponent';
|
|
7
|
-
import { EventConstants } from '../../engine';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/common";
|
|
10
|
-
import * as i2 from "@ngx-translate/core";
|
|
11
|
-
const _c0 = (a0, a1) => ({ value0: a0, value1: a1 });
|
|
12
|
-
const _c1 = a0 => ({ "dcf-disabled": a0 });
|
|
13
|
-
const _c2 = (a0, a1) => ({ "dcf-active": a0, "dcf-disabled": a1 });
|
|
14
|
-
function PaginationComponent_For_9_Template(rf, ctx) { if (rf & 1) {
|
|
15
|
-
const _r2 = i0.ɵɵgetCurrentView();
|
|
16
|
-
i0.ɵɵelementStart(0, "div", 8);
|
|
17
|
-
i0.ɵɵlistener("click", function PaginationComponent_For_9_Template_div_click_0_listener() { const page_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.navigate(page_r3["index"])); })("keydown.enter", function PaginationComponent_For_9_Template_div_keydown_enter_0_listener() { const page_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.navigate(page_r3["index"])); });
|
|
18
|
-
i0.ɵɵelementStart(1, "span", 10);
|
|
19
|
-
i0.ɵɵtext(2);
|
|
20
|
-
i0.ɵɵelementEnd()();
|
|
21
|
-
} if (rf & 2) {
|
|
22
|
-
const page_r3 = ctx.$implicit;
|
|
23
|
-
const ctx_r3 = i0.ɵɵnextContext();
|
|
24
|
-
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(2, _c2, ctx_r3.current === page_r3["index"], page_r3["index"] === ctx_r3.ndivl));
|
|
25
|
-
i0.ɵɵadvance(2);
|
|
26
|
-
i0.ɵɵtextInterpolate(page_r3["text"]);
|
|
27
|
-
} }
|
|
28
|
-
/**
|
|
29
|
-
* @description A pagination component for navigating through multiple pages of content.
|
|
30
|
-
* @summary This component provides a user interface for paginated content navigation,
|
|
31
|
-
* displaying page numbers and navigation controls. It supports customizable page counts,
|
|
32
|
-
* current page tracking, and emits events when users navigate between pages.
|
|
33
|
-
*
|
|
34
|
-
* The component intelligently handles large numbers of pages by showing a subset of page
|
|
35
|
-
* numbers with ellipses to indicate skipped pages, ensuring the UI remains clean and usable
|
|
36
|
-
* even with many pages.
|
|
37
|
-
*
|
|
38
|
-
* @mermaid
|
|
39
|
-
* sequenceDiagram
|
|
40
|
-
* participant U as User
|
|
41
|
-
* participant P as PaginationComponent
|
|
42
|
-
* participant E as External Component
|
|
43
|
-
*
|
|
44
|
-
* U->>P: Click page number
|
|
45
|
-
* P->>P: navigate(page)
|
|
46
|
-
* P->>P: handleClick(direction, page)
|
|
47
|
-
* P->>E: Emit clickEvent with PaginationCustomEvent
|
|
48
|
-
*
|
|
49
|
-
* U->>P: Click next button
|
|
50
|
-
* P->>P: next()
|
|
51
|
-
* P->>P: handleClick('next')
|
|
52
|
-
* P->>E: Emit clickEvent with PaginationCustomEvent
|
|
53
|
-
*
|
|
54
|
-
* U->>P: Click previous button
|
|
55
|
-
* P->>P: previous()
|
|
56
|
-
* P->>P: handleClick('previous')
|
|
57
|
-
* P->>E: Emit clickEvent with PaginationCustomEvent
|
|
58
|
-
*
|
|
59
|
-
* @example
|
|
60
|
-
* <ngx-decaf-pagination
|
|
61
|
-
* [pages]="10"
|
|
62
|
-
* [current]="3"
|
|
63
|
-
* (clickEvent)="handlePageChange($event)">
|
|
64
|
-
* </ngx-decaf-pagination>
|
|
65
|
-
*
|
|
66
|
-
* @extends {NgxBaseComponent}
|
|
67
|
-
* @implements {OnInit}
|
|
68
|
-
*/
|
|
69
|
-
export class PaginationComponent extends NgxBaseComponent {
|
|
70
|
-
/**
|
|
71
|
-
* @constructor
|
|
72
|
-
* @description Initializes a new instance of the PaginationComponent.
|
|
73
|
-
* Calls the parent constructor with the component name for generate base locale string.
|
|
74
|
-
*/
|
|
75
|
-
constructor() {
|
|
76
|
-
super("PaginationComponent");
|
|
77
|
-
/**
|
|
78
|
-
* @description Controls whether the component uses translation services.
|
|
79
|
-
* @summary When set to true, the component will attempt to use translation services
|
|
80
|
-
* for any text content. This allows for internationalization of the pagination component.
|
|
81
|
-
*
|
|
82
|
-
* @type {StringOrBoolean}
|
|
83
|
-
* @default true
|
|
84
|
-
* @memberOf PaginationComponent
|
|
85
|
-
*/
|
|
86
|
-
this.translatable = true;
|
|
87
|
-
/**
|
|
88
|
-
* @description The currently active page number.
|
|
89
|
-
* @summary Specifies which page is currently active or selected. This value is used
|
|
90
|
-
* to highlight the current page in the UI and as a reference point for navigation.
|
|
91
|
-
*
|
|
92
|
-
* @type {number}
|
|
93
|
-
* @default 1
|
|
94
|
-
* @memberOf PaginationComponent
|
|
95
|
-
*/
|
|
96
|
-
this.current = 1;
|
|
97
|
-
/**
|
|
98
|
-
* @description Event emitter for pagination navigation events.
|
|
99
|
-
* @summary Emits a custom event when users navigate between pages, either by clicking
|
|
100
|
-
* on page numbers or using the next/previous buttons. The event contains information
|
|
101
|
-
* about the navigation direction and the target page number.
|
|
102
|
-
*
|
|
103
|
-
* @type {EventEmitter<PaginationCustomEvent>}
|
|
104
|
-
* @memberOf PaginationComponent
|
|
105
|
-
*/
|
|
106
|
-
this.clickEvent = new EventEmitter();
|
|
107
|
-
addIcons({ chevronBackOutline, chevronForwardOutline });
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* @description Initializes the component after Angular sets the input properties.
|
|
111
|
-
* @summary Sets up the component by initializing the locale settings based on the
|
|
112
|
-
* translatable property, generating the page numbers based on the total pages and
|
|
113
|
-
* current page, and storing the last page number for boundary checking.
|
|
114
|
-
*
|
|
115
|
-
* @mermaid
|
|
116
|
-
* sequenceDiagram
|
|
117
|
-
* participant A as Angular Lifecycle
|
|
118
|
-
* participant P as PaginationComponent
|
|
119
|
-
*
|
|
120
|
-
* A->>P: ngOnInit()
|
|
121
|
-
* P->>P: getLocale(translatable)
|
|
122
|
-
* P->>P: Set locale
|
|
123
|
-
* P->>P: getPages(data, current)
|
|
124
|
-
* P->>P: Set pages array
|
|
125
|
-
* P->>P: Set last page number
|
|
126
|
-
*
|
|
127
|
-
* @returns {void}
|
|
128
|
-
* @memberOf PaginationComponent
|
|
129
|
-
*/
|
|
130
|
-
ngOnInit() {
|
|
131
|
-
this.locale = this.getLocale(this.translatable);
|
|
132
|
-
this.pages = this.getPages(this.totalPages, this.current);
|
|
133
|
-
this.last = this.totalPages;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* @description Handles click events on pagination controls.
|
|
137
|
-
* @summary Processes user interactions with the pagination component, updating the
|
|
138
|
-
* current page if specified and emitting an event with navigation details. This method
|
|
139
|
-
* is called when users click on page numbers or navigation buttons.
|
|
140
|
-
*
|
|
141
|
-
* @param {('next' | 'previous')} direction - The direction of navigation
|
|
142
|
-
* @param {number} [page] - Optional page number to navigate to directly
|
|
143
|
-
* @returns {void}
|
|
144
|
-
*
|
|
145
|
-
* @mermaid
|
|
146
|
-
* sequenceDiagram
|
|
147
|
-
* participant U as User
|
|
148
|
-
* participant P as PaginationComponent
|
|
149
|
-
* participant E as External Component
|
|
150
|
-
*
|
|
151
|
-
* U->>P: Click pagination control
|
|
152
|
-
* P->>P: handleClick(direction, page?)
|
|
153
|
-
* alt page is provided
|
|
154
|
-
* P->>P: Update current page
|
|
155
|
-
* end
|
|
156
|
-
* P->>E: Emit clickEvent with direction and page
|
|
157
|
-
*
|
|
158
|
-
* @memberOf PaginationComponent
|
|
159
|
-
*/
|
|
160
|
-
handleClick(direction, page) {
|
|
161
|
-
if (page)
|
|
162
|
-
this.current = page;
|
|
163
|
-
this.clickEvent.emit({
|
|
164
|
-
name: EventConstants.CLICK_EVENT,
|
|
165
|
-
data: {
|
|
166
|
-
direction,
|
|
167
|
-
page: this.current
|
|
168
|
-
},
|
|
169
|
-
component: this.componentName
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* @description Generates the array of page objects for display.
|
|
174
|
-
* @summary Creates an array of page objects based on the total number of pages and
|
|
175
|
-
* the current page. For small page counts (≤5), all pages are shown. For larger page
|
|
176
|
-
* counts, a subset is shown with ellipses to indicate skipped pages. This ensures
|
|
177
|
-
* the pagination UI remains clean and usable even with many pages.
|
|
178
|
-
*
|
|
179
|
-
* @param {number} total - The total number of pages
|
|
180
|
-
* @param {number} [current] - The current active page (defaults to this.current)
|
|
181
|
-
* @returns {KeyValue[]} Array of page objects with index and text properties
|
|
182
|
-
*
|
|
183
|
-
* @mermaid
|
|
184
|
-
* flowchart TD
|
|
185
|
-
* A[Start] --> B{total <= 5?}
|
|
186
|
-
* B -->|Yes| C[Show all pages]
|
|
187
|
-
* B -->|No| D[Show first page]
|
|
188
|
-
* D --> E[Show last pages]
|
|
189
|
-
* E --> F[Add ellipses for skipped pages]
|
|
190
|
-
* C --> G[Return pages array]
|
|
191
|
-
* F --> G
|
|
192
|
-
*
|
|
193
|
-
* @memberOf PaginationComponent
|
|
194
|
-
*/
|
|
195
|
-
getPages(total, current) {
|
|
196
|
-
if (!current)
|
|
197
|
-
current = this.current;
|
|
198
|
-
const pages = [];
|
|
199
|
-
function getPage(index, text = '') {
|
|
200
|
-
if (pages.some(item => item['index'] === index))
|
|
201
|
-
return;
|
|
202
|
-
pages.push({ index, text: index != null ? index.toString().padStart(2, '0') : text });
|
|
203
|
-
}
|
|
204
|
-
if (total <= 5) {
|
|
205
|
-
for (let i = 1; i <= total; i++)
|
|
206
|
-
getPage(i);
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
// Adiciona os dois primeiros
|
|
210
|
-
getPage(1);
|
|
211
|
-
getPage(2);
|
|
212
|
-
// Adiciona "..." entre os blocos
|
|
213
|
-
if (current && current > 3)
|
|
214
|
-
getPage(null, '...');
|
|
215
|
-
// Adiciona a página atual (se estiver no meio)
|
|
216
|
-
if (current && current > 2 && current < total - 1)
|
|
217
|
-
getPage(current);
|
|
218
|
-
// Adiciona "..." entre os blocos
|
|
219
|
-
if (current && current < total - 2)
|
|
220
|
-
getPage(null, '...');
|
|
221
|
-
// Adiciona os dois últimos
|
|
222
|
-
getPage(total - 1);
|
|
223
|
-
getPage(total);
|
|
224
|
-
}
|
|
225
|
-
return pages;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* @description Gets the current active page number.
|
|
229
|
-
* @summary Returns the current page number that is active in the pagination component.
|
|
230
|
-
* This method provides a way to access the current page state from outside the component.
|
|
231
|
-
*
|
|
232
|
-
* @returns {number} The current page number
|
|
233
|
-
* @memberOf PaginationComponent
|
|
234
|
-
*/
|
|
235
|
-
getCurrent() {
|
|
236
|
-
return this.current;
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* @description Navigates to the next page.
|
|
240
|
-
* @summary Increments the current page number if not at the last page and triggers
|
|
241
|
-
* the click event handler with 'next' direction. This method is typically called
|
|
242
|
-
* when the user clicks on the "next" button in the pagination UI.
|
|
243
|
-
*
|
|
244
|
-
* @returns {void}
|
|
245
|
-
*
|
|
246
|
-
* @mermaid
|
|
247
|
-
* sequenceDiagram
|
|
248
|
-
* participant U as User
|
|
249
|
-
* participant P as PaginationComponent
|
|
250
|
-
*
|
|
251
|
-
* U->>P: Click next button
|
|
252
|
-
* P->>P: next()
|
|
253
|
-
* alt page <= max pages
|
|
254
|
-
* P->>P: Increment current page
|
|
255
|
-
* P->>P: handleClick('next')
|
|
256
|
-
* end
|
|
257
|
-
*
|
|
258
|
-
* @memberOf PaginationComponent
|
|
259
|
-
*/
|
|
260
|
-
next() {
|
|
261
|
-
const page = this.current + 1;
|
|
262
|
-
if (page <= Object.keys(this.pages)?.length || 0) {
|
|
263
|
-
this.current = page;
|
|
264
|
-
this.handleClick('next');
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* @description Navigates to the previous page.
|
|
269
|
-
* @summary Decrements the current page number if not at the first page and triggers
|
|
270
|
-
* the click event handler with 'previous' direction. This method is typically called
|
|
271
|
-
* when the user clicks on the "previous" button in the pagination UI.
|
|
272
|
-
*
|
|
273
|
-
* @returns {void}
|
|
274
|
-
*
|
|
275
|
-
* @mermaid
|
|
276
|
-
* sequenceDiagram
|
|
277
|
-
* participant U as User
|
|
278
|
-
* participant P as PaginationComponent
|
|
279
|
-
*
|
|
280
|
-
* U->>P: Click previous button
|
|
281
|
-
* P->>P: previous()
|
|
282
|
-
* alt page > 0
|
|
283
|
-
* P->>P: Decrement current page
|
|
284
|
-
* P->>P: handleClick('previous')
|
|
285
|
-
* end
|
|
286
|
-
*
|
|
287
|
-
* @memberOf PaginationComponent
|
|
288
|
-
*/
|
|
289
|
-
previous() {
|
|
290
|
-
const page = this.current - 1;
|
|
291
|
-
if (page > 0) {
|
|
292
|
-
this.current = page;
|
|
293
|
-
this.handleClick('previous');
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* @description Navigates to a specific page number.
|
|
298
|
-
* @summary Updates the current page to the specified page number and triggers
|
|
299
|
-
* the click event handler with the appropriate direction. This method is typically
|
|
300
|
-
* called when the user clicks directly on a page number in the pagination UI.
|
|
301
|
-
*
|
|
302
|
-
* @param {number | null} page - The page number to navigate to
|
|
303
|
-
* @returns {void}
|
|
304
|
-
*
|
|
305
|
-
* @mermaid
|
|
306
|
-
* sequenceDiagram
|
|
307
|
-
* participant U as User
|
|
308
|
-
* participant P as PaginationComponent
|
|
309
|
-
*
|
|
310
|
-
* U->>P: Click page number
|
|
311
|
-
* P->>P: navigate(page)
|
|
312
|
-
* alt page is not null and different from current
|
|
313
|
-
* P->>P: Determine direction (next/previous)
|
|
314
|
-
* P->>P: handleClick(direction, page)
|
|
315
|
-
* end
|
|
316
|
-
*
|
|
317
|
-
* @memberOf PaginationComponent
|
|
318
|
-
*/
|
|
319
|
-
navigate(page) {
|
|
320
|
-
if (page !== null && this.current !== page)
|
|
321
|
-
this.handleClick(page > this.current ? 'next' : 'previous', page);
|
|
322
|
-
}
|
|
323
|
-
static { this.ɵfac = function PaginationComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PaginationComponent)(); }; }
|
|
324
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PaginationComponent, selectors: [["ngx-decaf-pagination"]], inputs: { totalPages: "totalPages", current: "current" }, outputs: { clickEvent: "clickEvent" }, standalone: true, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 12, vars: 13, consts: [["paginationComponent", ""], ["id", "dcf-paginator-container", 1, "dcf-flex", "dcf-flex-center"], [1, "dcf-width-1-1"], [1, "dcf-pagination-resume", 3, "innerHTML"], [1, "dcf-pagination", "aeon-pagination", "dcf-flex-center"], ["aria-label", "previous", "tabindex", "0", 3, "click", "keydown.enter", "ngClass"], ["name", "chevron-back-outline", "aria-hidden", "true"], ["tabindex", "0", 3, "ngClass"], ["tabindex", "0", 3, "click", "keydown.enter", "ngClass"], ["name", "chevron-forward-outline", "aria-hidden", "true"], [1, "page-item"]], template: function PaginationComponent_Template(rf, ctx) { if (rf & 1) {
|
|
325
|
-
const _r1 = i0.ɵɵgetCurrentView();
|
|
326
|
-
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2);
|
|
327
|
-
i0.ɵɵelement(2, "div", 3);
|
|
328
|
-
i0.ɵɵpipe(3, "translate");
|
|
329
|
-
i0.ɵɵelementStart(4, "div", 4, 0)(6, "div", 5);
|
|
330
|
-
i0.ɵɵlistener("click", function PaginationComponent_Template_div_click_6_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.previous()); })("keydown.enter", function PaginationComponent_Template_div_keydown_enter_6_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.previous()); });
|
|
331
|
-
i0.ɵɵelement(7, "ion-icon", 6);
|
|
332
|
-
i0.ɵɵelementEnd();
|
|
333
|
-
i0.ɵɵrepeaterCreate(8, PaginationComponent_For_9_Template, 3, 5, "div", 7, i0.ɵɵrepeaterTrackByIdentity);
|
|
334
|
-
i0.ɵɵelementStart(10, "div", 8);
|
|
335
|
-
i0.ɵɵlistener("click", function PaginationComponent_Template_div_click_10_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.next()); })("keydown.enter", function PaginationComponent_Template_div_keydown_enter_10_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.next()); });
|
|
336
|
-
i0.ɵɵelement(11, "ion-icon", 9);
|
|
337
|
-
i0.ɵɵelementEnd()()()();
|
|
338
|
-
} if (rf & 2) {
|
|
339
|
-
i0.ɵɵadvance(2);
|
|
340
|
-
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(3, 3, ctx.locale + ".resume", i0.ɵɵpureFunction2(6, _c0, ctx.current, ctx.last)), i0.ɵɵsanitizeHtml);
|
|
341
|
-
i0.ɵɵadvance(4);
|
|
342
|
-
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(9, _c1, ctx.current === 1));
|
|
343
|
-
i0.ɵɵadvance(2);
|
|
344
|
-
i0.ɵɵrepeater(ctx.pages);
|
|
345
|
-
i0.ɵɵadvance(2);
|
|
346
|
-
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(11, _c1, ctx.current === ctx.last));
|
|
347
|
-
} }, dependencies: [ForAngularModule, i1.NgClass, i2.TranslatePipe, IonIcon], styles: ["#dcf-paginator-container[_ngcontent-%COMP%]{margin-bottom:1rem}.dcf-pagination[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;margin-left:0;padding:0;list-style:none}.dcf-pagination[_ngcontent-%COMP%] .page-item[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:top;color:var(--ion-color-gray-7);font-weight:600;width:36px;line-height:34px;padding:0!important;border-radius:50%;box-sizing:border-box}.dcf-pagination[_ngcontent-%COMP%] > *[_ngcontent-%COMP%]{flex:none;padding-left:0;position:relative;margin:0px .15rem}.dcf-pagination[_ngcontent-%COMP%] > *[_ngcontent-%COMP%]:not(.disabled){cursor:pointer}.dcf-pagination[_ngcontent-%COMP%] > *[_ngcontent-%COMP%]:hover .page-item[_ngcontent-%COMP%]{color:var(--ion-color-primary)}.dcf-pagination[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] .page-item[_ngcontent-%COMP%]{color:var(--ion-color-gray-7);font-weight:600}.dcf-pagination[_ngcontent-%COMP%] > *.dcf-active[_ngcontent-%COMP%] .page-item[_ngcontent-%COMP%]{background:rgba(var(--ion-color-primary-rgb),.15)}.dcf-pagination[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] > *[_ngcontent-%COMP%]{display:flex;align-items:center;column-gap:.25em;padding:5px 10px;color:var(--ion-color-gray-8);transition:color .1s ease-in-out}.dcf-pagination[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:hover{color:var(--ion-color-gray-6);text-decoration:none}.dcf-pagination[_ngcontent-%COMP%] .dcf-disabled[_ngcontent-%COMP%] > *[_ngcontent-%COMP%]{opacity:.5;color:var(--ion-color-gray-6)}.dcf-pagination-resume[_ngcontent-%COMP%]{color:var(--ion-color-gray-8);margin:1rem 0px;text-align:center}"] }); }
|
|
348
|
-
}
|
|
349
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PaginationComponent, [{
|
|
350
|
-
type: Component,
|
|
351
|
-
args: [{ selector: 'ngx-decaf-pagination', imports: [
|
|
352
|
-
ForAngularModule,
|
|
353
|
-
IonIcon
|
|
354
|
-
], standalone: true, template: " <div id=\"dcf-paginator-container\" class=\"dcf-flex dcf-flex-center\">\n <div class=\"dcf-width-1-1\">\n <div class=\"dcf-pagination-resume\" [innerHTML]=\"locale + '.resume' | translate: {value0: current, value1: last}\"></div>\n <div #paginationComponent class=\"dcf-pagination aeon-pagination dcf-flex-center\">\n <div\n aria-label=\"previous\"\n tabindex=\"0\"\n (click)=\"previous()\"\n (keydown.enter)=\"previous()\" [ngClass]=\"{'dcf-disabled': current === 1}\">\n <ion-icon name=\"chevron-back-outline\" aria-hidden=\"true\"></ion-icon>\n </div>\n @for(page of pages; track page) {\n <div tabindex=\"0\" (click)=\"navigate(page['index'])\"\n (keydown.enter)=\"navigate(page['index'])\"\n [ngClass]=\"{'dcf-active': current === page['index'], 'dcf-disabled': page['index'] === ndivl}\">\n <span class=\"page-item\">{{ page['text'] }}</span>\n </div>\n }\n <div\n tabindex=\"0\" (click)=\"next()\"\n (keydown.enter)=\"next()\"\n [ngClass]=\"{'dcf-disabled': current === last}\">\n <ion-icon name=\"chevron-forward-outline\" aria-hidden=\"true\"></ion-icon>\n </div>\n </div>\n </div>\n</div>\n", styles: ["#dcf-paginator-container{margin-bottom:1rem}.dcf-pagination{display:flex;flex-wrap:wrap;align-items:center;margin-left:0;padding:0;list-style:none}.dcf-pagination .page-item{display:flex;justify-content:center;align-items:top;color:var(--ion-color-gray-7);font-weight:600;width:36px;line-height:34px;padding:0!important;border-radius:50%;box-sizing:border-box}.dcf-pagination>*{flex:none;padding-left:0;position:relative;margin:0px .15rem}.dcf-pagination>*:not(.disabled){cursor:pointer}.dcf-pagination>*:hover .page-item{color:var(--ion-color-primary)}.dcf-pagination>* .page-item{color:var(--ion-color-gray-7);font-weight:600}.dcf-pagination>*.dcf-active .page-item{background:rgba(var(--ion-color-primary-rgb),.15)}.dcf-pagination>*>*{display:flex;align-items:center;column-gap:.25em;padding:5px 10px;color:var(--ion-color-gray-8);transition:color .1s ease-in-out}.dcf-pagination>*>:hover{color:var(--ion-color-gray-6);text-decoration:none}.dcf-pagination .dcf-disabled>*{opacity:.5;color:var(--ion-color-gray-6)}.dcf-pagination-resume{color:var(--ion-color-gray-8);margin:1rem 0px;text-align:center}\n"] }]
|
|
355
|
-
}], () => [], { totalPages: [{
|
|
356
|
-
type: Input,
|
|
357
|
-
args: [{ required: true }]
|
|
358
|
-
}], current: [{
|
|
359
|
-
type: Input
|
|
360
|
-
}], clickEvent: [{
|
|
361
|
-
type: Output
|
|
362
|
-
}] }); })();
|
|
363
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PaginationComponent, { className: "PaginationComponent", filePath: "components/pagination/pagination.component.ts", lineNumber: 62 }); })();
|
|
364
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUE2QixNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7O0lDTWpFLDhCQUVpRztJQUQvRixBQURnQixzTUFBUyx3QkFBYyxPQUFPLEVBQUUsS0FBQyx5TUFDaEMsd0JBQWMsT0FBTyxFQUFFLEtBQUM7SUFFekMsZ0NBQXdCO0lBQUEsWUFBa0I7SUFDNUMsQUFENEMsaUJBQU8sRUFDN0M7Ozs7SUFGSiw0SEFBOEY7SUFDdEUsZUFBa0I7SUFBbEIscUNBQWtCOztBRE5wRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdDRztBQVlILE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxnQkFBZ0I7SUFvRXZEOzs7O09BSUc7SUFDSDtRQUNFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FB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MVNVLG1CQUFtQjtvRUFBbkIsbUJBQW1COztZQzVEOUIsQUFERCw4QkFBbUUsYUFDdkM7WUFDekIseUJBQXVIOztZQUVySCxBQURGLGlDQUFpRixhQUtKO1lBQXpFLEFBREEsbUlBQVMsY0FBVSxLQUFDLHNJQUNILGNBQVUsS0FBQztZQUM1Qiw4QkFBb0U7WUFDdEUsaUJBQU07WUFDTix3R0FNQztZQUNELCtCQUdpRDtZQUQvQyxBQURhLG9JQUFTLFVBQU0sS0FBQyx1SUFDWixVQUFNLEtBQUM7WUFFeEIsK0JBQXVFO1lBSS9FLEFBREUsQUFERSxBQURFLGlCQUFNLEVBQ0YsRUFDRixFQUNGOztZQXhCaUMsZUFBNkU7WUFBN0UsOElBQTZFO1lBTS9FLGVBQTJDO1lBQTNDLHVFQUEyQztZQUcxRSxlQU1DO1lBTkQsd0JBTUM7WUFJQyxlQUE4QztZQUE5QywrRUFBOEM7NEJEa0NsRCxnQkFBZ0IsZ0NBQ2hCLE9BQU87O2lGQUtFLG1CQUFtQjtjQVgvQixTQUFTOzJCQUNFLHNCQUFzQixXQUd2QjtvQkFDUCxnQkFBZ0I7b0JBQ2hCLE9BQU87aUJBQ1IsY0FDVyxJQUFJO29CQTBCaEIsVUFBVTtrQkFEVCxLQUFLO21CQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQWF6QixPQUFPO2tCQUROLEtBQUs7WUFnQ04sVUFBVTtrQkFEVCxNQUFNOztrRkFqRUksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW9uSWNvbiB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5pbXBvcnQgeyBjaGV2cm9uQmFja091dGxpbmUsIGNoZXZyb25Gb3J3YXJkT3V0bGluZSB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcbmltcG9ydCB7IEZvckFuZ3VsYXJNb2R1bGUgfSBmcm9tICcuLi8uLi9mb3ItYW5ndWxhci5tb2R1bGUnO1xuaW1wb3J0IHsgTmd4QmFzZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2VuZ2luZS9OZ3hCYXNlQ29tcG9uZW50JztcbmltcG9ydCB7IEV2ZW50Q29uc3RhbnRzLCBLZXlWYWx1ZSwgU3RyaW5nT3JCb29sZWFuIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IFBhZ2luYXRpb25DdXN0b21FdmVudCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBwYWdpbmF0aW9uIGNvbXBvbmVudCBmb3IgbmF2aWdhdGluZyB0aHJvdWdoIG11bHRpcGxlIHBhZ2VzIG9mIGNvbnRlbnQuXG4gKiBAc3VtbWFyeSBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHVzZXIgaW50ZXJmYWNlIGZvciBwYWdpbmF0ZWQgY29udGVudCBuYXZpZ2F0aW9uLFxuICogZGlzcGxheWluZyBwYWdlIG51bWJlcnMgYW5kIG5hdmlnYXRpb24gY29udHJvbHMuIEl0IHN1cHBvcnRzIGN1c3RvbWl6YWJsZSBwYWdlIGNvdW50cyxcbiAqIGN1cnJlbnQgcGFnZSB0cmFja2luZywgYW5kIGVtaXRzIGV2ZW50cyB3aGVuIHVzZXJzIG5hdmlnYXRlIGJldHdlZW4gcGFnZXMuXG4gKlxuICogVGhlIGNvbXBvbmVudCBpbnRlbGxpZ2VudGx5IGhhbmRsZXMgbGFyZ2UgbnVtYmVycyBvZiBwYWdlcyBieSBzaG93aW5nIGEgc3Vic2V0IG9mIHBhZ2VcbiAqIG51bWJlcnMgd2l0aCBlbGxpcHNlcyB0byBpbmRpY2F0ZSBza2lwcGVkIHBhZ2VzLCBlbnN1cmluZyB0aGUgVUkgcmVtYWlucyBjbGVhbiBhbmQgdXNhYmxlXG4gKiBldmVuIHdpdGggbWFueSBwYWdlcy5cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICogICBwYXJ0aWNpcGFudCBQIGFzIFBhZ2luYXRpb25Db21wb25lbnRcbiAqICAgcGFydGljaXBhbnQgRSBhcyBFeHRlcm5hbCBDb21wb25lbnRcbiAqXG4gKiAgIFUtPj5QOiBDbGljayBwYWdlIG51bWJlclxuICogICBQLT4+UDogbmF2aWdhdGUocGFnZSlcbiAqICAgUC0+PlA6IGhhbmRsZUNsaWNrKGRpcmVjdGlvbiwgcGFnZSlcbiAqICAgUC0+PkU6IEVtaXQgY2xpY2tFdmVudCB3aXRoIFBhZ2luYXRpb25DdXN0b21FdmVudFxuICpcbiAqICAgVS0+PlA6IENsaWNrIG5leHQgYnV0dG9uXG4gKiAgIFAtPj5QOiBuZXh0KClcbiAqICAgUC0+PlA6IGhhbmRsZUNsaWNrKCduZXh0JylcbiAqICAgUC0+PkU6IEVtaXQgY2xpY2tFdmVudCB3aXRoIFBhZ2luYXRpb25DdXN0b21FdmVudFxuICpcbiAqICAgVS0+PlA6IENsaWNrIHByZXZpb3VzIGJ1dHRvblxuICogICBQLT4+UDogcHJldmlvdXMoKVxuICogICBQLT4+UDogaGFuZGxlQ2xpY2soJ3ByZXZpb3VzJylcbiAqICAgUC0+PkU6IEVtaXQgY2xpY2tFdmVudCB3aXRoIFBhZ2luYXRpb25DdXN0b21FdmVudFxuICpcbiAqIEBleGFtcGxlXG4gKiA8bmd4LWRlY2FmLXBhZ2luYXRpb25cbiAqICAgW3BhZ2VzXT1cIjEwXCJcbiAqICAgW2N1cnJlbnRdPVwiM1wiXG4gKiAgIChjbGlja0V2ZW50KT1cImhhbmRsZVBhZ2VDaGFuZ2UoJGV2ZW50KVwiPlxuICogPC9uZ3gtZGVjYWYtcGFnaW5hdGlvbj5cbiAqXG4gKiBAZXh0ZW5kcyB7Tmd4QmFzZUNvbXBvbmVudH1cbiAqIEBpbXBsZW1lbnRzIHtPbkluaXR9XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1kZWNhZi1wYWdpbmF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wYWdpbmF0aW9uLmNvbXBvbmVudC5zY3NzJ10sXG4gIGltcG9ydHM6IFtcbiAgICBGb3JBbmd1bGFyTW9kdWxlLFxuICAgIElvbkljb25cbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcblxufSlcbmV4cG9ydCBjbGFzcyBQYWdpbmF0aW9uQ29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIHRoZSBjb21wb25lbnQgdXNlcyB0cmFuc2xhdGlvbiBzZXJ2aWNlcy5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGNvbXBvbmVudCB3aWxsIGF0dGVtcHQgdG8gdXNlIHRyYW5zbGF0aW9uIHNlcnZpY2VzXG4gICAqIGZvciBhbnkgdGV4dCBjb250ZW50LiBUaGlzIGFsbG93cyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gb2YgdGhlIHBhZ2luYXRpb24gY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqL1xuICBvdmVycmlkZSB0cmFuc2xhdGFibGU6IFN0cmluZ09yQm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIHRvIGRpc3BsYXkgaW4gdGhlIHBhZ2luYXRpb24gY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBhdmFpbGFibGUgZm9yIG5hdmlnYXRpb24uIFRoaXMgaXMgYSByZXF1aXJlZFxuICAgKiBpbnB1dCB0aGF0IGRldGVybWluZXMgaG93IG1hbnkgcGFnZSBudW1iZXJzIHdpbGwgYmUgZ2VuZXJhdGVkIGFuZCBkaXNwbGF5ZWQuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEByZXF1aXJlZFxuICAgKiBAbWVtYmVyT2YgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgdG90YWxQYWdlcyE6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50bHkgYWN0aXZlIHBhZ2UgbnVtYmVyLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hpY2ggcGFnZSBpcyBjdXJyZW50bHkgYWN0aXZlIG9yIHNlbGVjdGVkLiBUaGlzIHZhbHVlIGlzIHVzZWRcbiAgICogdG8gaGlnaGxpZ2h0IHRoZSBjdXJyZW50IHBhZ2UgaW4gdGhlIFVJIGFuZCBhcyBhIHJlZmVyZW5jZSBwb2ludCBmb3IgbmF2aWdhdGlvbi5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKiBAbWVtYmVyT2YgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgY3VycmVudCA9IDE7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiBwYWdlIG9iamVjdHMgZm9yIHJlbmRlcmluZyBpbiB0aGUgdGVtcGxhdGUuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIHRoZSBwcm9jZXNzZWQgcGFnZSBkYXRhIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgcGFnaW5hdGlvbiBVSS5cbiAgICogRWFjaCBvYmplY3QgaW5jbHVkZXMgYW4gaW5kZXggKHBhZ2UgbnVtYmVyKSBhbmQgdGV4dCByZXByZXNlbnRhdGlvbi5cbiAgICpcbiAgICogQHR5cGUge0tleVZhbHVlW119XG4gICAqIEBtZW1iZXJPZiBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqL1xuICBwYWdlcyE6IEtleVZhbHVlW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbGFzdCBwYWdlIG51bWJlciBpbiB0aGUgcGFnaW5hdGlvbi5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBudW1iZXIgb2YgdGhlIGxhc3QgcGFnZSBmb3IgYm91bmRhcnkgY2hlY2tpbmcgZHVyaW5nIG5hdmlnYXRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJPZiBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqL1xuICBsYXN0ITogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZW1pdHRlciBmb3IgcGFnaW5hdGlvbiBuYXZpZ2F0aW9uIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgRW1pdHMgYSBjdXN0b20gZXZlbnQgd2hlbiB1c2VycyBuYXZpZ2F0ZSBiZXR3ZWVuIHBhZ2VzLCBlaXRoZXIgYnkgY2xpY2tpbmdcbiAgICogb24gcGFnZSBudW1iZXJzIG9yIHVzaW5nIHRoZSBuZXh0L3ByZXZpb3VzIGJ1dHRvbnMuIFRoZSBldmVudCBjb250YWlucyBpbmZvcm1hdGlvblxuICAgKiBhYm91dCB0aGUgbmF2aWdhdGlvbiBkaXJlY3Rpb24gYW5kIHRoZSB0YXJnZXQgcGFnZSBudW1iZXIuXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8UGFnaW5hdGlvbkN1c3RvbUV2ZW50Pn1cbiAgICogQG1lbWJlck9mIFBhZ2luYXRpb25Db21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKVxuICBjbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8UGFnaW5hdGlvbkN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnaW5hdGlvbkN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBQYWdpbmF0aW9uQ29tcG9uZW50LlxuICAgKiBDYWxscyB0aGUgcGFyZW50IGNvbnN0cnVjdG9yIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lIGZvciBnZW5lcmF0ZSBiYXNlIGxvY2FsZSBzdHJpbmcuXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlBhZ2luYXRpb25Db21wb25lbnRcIik7XG4gICAgIGFkZEljb25zKHtjaGV2cm9uQmFja091dGxpbmUsIGNoZXZyb25Gb3J3YXJkT3V0bGluZX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50IGFmdGVyIEFuZ3VsYXIgc2V0cyB0aGUgaW5wdXQgcHJvcGVydGllcy5cbiAgICogQHN1bW1hcnkgU2V0cyB1cCB0aGUgY29tcG9uZW50IGJ5IGluaXRpYWxpemluZyB0aGUgbG9jYWxlIHNldHRpbmdzIGJhc2VkIG9uIHRoZVxuICAgKiB0cmFuc2xhdGFibGUgcHJvcGVydHksIGdlbmVyYXRpbmcgdGhlIHBhZ2UgbnVtYmVycyBiYXNlZCBvbiB0aGUgdG90YWwgcGFnZXMgYW5kXG4gICAqIGN1cnJlbnQgcGFnZSwgYW5kIHN0b3JpbmcgdGhlIGxhc3QgcGFnZSBudW1iZXIgZm9yIGJvdW5kYXJ5IGNoZWNraW5nLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIEFuZ3VsYXIgTGlmZWN5Y2xlXG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqXG4gICAqICAgQS0+PlA6IG5nT25Jbml0KClcbiAgICogICBQLT4+UDogZ2V0TG9jYWxlKHRyYW5zbGF0YWJsZSlcbiAgICogICBQLT4+UDogU2V0IGxvY2FsZVxuICAgKiAgIFAtPj5QOiBnZXRQYWdlcyhkYXRhLCBjdXJyZW50KVxuICAgKiAgIFAtPj5QOiBTZXQgcGFnZXMgYXJyYXlcbiAgICogICBQLT4+UDogU2V0IGxhc3QgcGFnZSBudW1iZXJcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqL1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvY2FsZSA9IHRoaXMuZ2V0TG9jYWxlKHRoaXMudHJhbnNsYXRhYmxlKTtcbiAgICB0aGlzLnBhZ2VzID0gdGhpcy5nZXRQYWdlcyh0aGlzLnRvdGFsUGFnZXMsIHRoaXMuY3VycmVudCkgYXMgS2V5VmFsdWVbXTtcbiAgICB0aGlzLmxhc3QgPSB0aGlzLnRvdGFsUGFnZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgY2xpY2sgZXZlbnRzIG9uIHBhZ2luYXRpb24gY29udHJvbHMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyB1c2VyIGludGVyYWN0aW9ucyB3aXRoIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudCwgdXBkYXRpbmcgdGhlXG4gICAqIGN1cnJlbnQgcGFnZSBpZiBzcGVjaWZpZWQgYW5kIGVtaXR0aW5nIGFuIGV2ZW50IHdpdGggbmF2aWdhdGlvbiBkZXRhaWxzLiBUaGlzIG1ldGhvZFxuICAgKiBpcyBjYWxsZWQgd2hlbiB1c2VycyBjbGljayBvbiBwYWdlIG51bWJlcnMgb3IgbmF2aWdhdGlvbiBidXR0b25zLlxuICAgKlxuICAgKiBAcGFyYW0geygnbmV4dCcgfCAncHJldmlvdXMnKX0gZGlyZWN0aW9uIC0gVGhlIGRpcmVjdGlvbiBvZiBuYXZpZ2F0aW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZV0gLSBPcHRpb25hbCBwYWdlIG51bWJlciB0byBuYXZpZ2F0ZSB0byBkaXJlY3RseVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgRSBhcyBFeHRlcm5hbCBDb21wb25lbnRcbiAgICpcbiAgICogICBVLT4+UDogQ2xpY2sgcGFnaW5hdGlvbiBjb250cm9sXG4gICAqICAgUC0+PlA6IGhhbmRsZUNsaWNrKGRpcmVjdGlvbiwgcGFnZT8pXG4gICAqICAgYWx0IHBhZ2UgaXMgcHJvdmlkZWRcbiAgICogICAgIFAtPj5QOiBVcGRhdGUgY3VycmVudCBwYWdlXG4gICAqICAgZW5kXG4gICAqICAgUC0+PkU6IEVtaXQgY2xpY2tFdmVudCB3aXRoIGRpcmVjdGlvbiBhbmQgcGFnZVxuICAgKlxuICAgKiBAbWVtYmVyT2YgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlQ2xpY2soZGlyZWN0aW9uOiAnbmV4dCcgfCAncHJldmlvdXMnLCBwYWdlPzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYocGFnZSlcbiAgICAgIHRoaXMuY3VycmVudCA9IHBhZ2U7XG4gICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoe1xuICAgICAgbmFtZTogRXZlbnRDb25zdGFudHMuQ0xJQ0tfRVZFTlQsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgcGFnZTogdGhpcy5jdXJyZW50XG4gICAgICB9LFxuICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudE5hbWVcbiAgICB9IGFzIFBhZ2luYXRpb25DdXN0b21FdmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyB0aGUgYXJyYXkgb2YgcGFnZSBvYmplY3RzIGZvciBkaXNwbGF5LlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGFuIGFycmF5IG9mIHBhZ2Ugb2JqZWN0cyBiYXNlZCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGFuZFxuICAgKiB0aGUgY3VycmVudCBwYWdlLiBGb3Igc21hbGwgcGFnZSBjb3VudHMgKOKJpDUpLCBhbGwgcGFnZXMgYXJlIHNob3duLiBGb3IgbGFyZ2VyIHBhZ2VcbiAgICogY291bnRzLCBhIHN1YnNldCBpcyBzaG93biB3aXRoIGVsbGlwc2VzIHRvIGluZGljYXRlIHNraXBwZWQgcGFnZXMuIFRoaXMgZW5zdXJlc1xuICAgKiB0aGUgcGFnaW5hdGlvbiBVSSByZW1haW5zIGNsZWFuIGFuZCB1c2FibGUgZXZlbiB3aXRoIG1hbnkgcGFnZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0b3RhbCAtIFRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtjdXJyZW50XSAtIFRoZSBjdXJyZW50IGFjdGl2ZSBwYWdlIChkZWZhdWx0cyB0byB0aGlzLmN1cnJlbnQpXG4gICAqIEByZXR1cm5zIHtLZXlWYWx1ZVtdfSBBcnJheSBvZiBwYWdlIG9iamVjdHMgd2l0aCBpbmRleCBhbmQgdGV4dCBwcm9wZXJ0aWVzXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIGZsb3djaGFydCBURFxuICAgKiAgIEFbU3RhcnRdIC0tPiBCe3RvdGFsIDw9IDU/fVxuICAgKiAgIEIgLS0+fFllc3wgQ1tTaG93IGFsbCBwYWdlc11cbiAgICogICBCIC0tPnxOb3wgRFtTaG93IGZpcnN0IHBhZ2VdXG4gICAqICAgRCAtLT4gRVtTaG93IGxhc3QgcGFnZXNdXG4gICAqICAgRSAtLT4gRltBZGQgZWxsaXBzZXMgZm9yIHNraXBwZWQgcGFnZXNdXG4gICAqICAgQyAtLT4gR1tSZXR1cm4gcGFnZXMgYXJyYXldXG4gICAqICAgRiAtLT4gR1xuICAgKlxuICAgKiBAbWVtYmVyT2YgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKi9cbiAgZ2V0UGFnZXModG90YWw6IG51bWJlciwgY3VycmVudD86IG51bWJlcik6IEtleVZhbHVlW10ge1xuICAgIGlmICghY3VycmVudCkgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblxuICAgIGNvbnN0IHBhZ2VzOiBLZXlWYWx1ZVtdID0gW107XG5cbiAgICBmdW5jdGlvbiBnZXRQYWdlKGluZGV4OiBudW1iZXIgfCBudWxsLCB0ZXh0ID0gJycpIHtcbiAgICAgICAgaWYgKHBhZ2VzLnNvbWUoaXRlbSA9PiBpdGVtWydpbmRleCddID09PSBpbmRleCkpIHJldHVybjtcbiAgICAgICAgcGFnZXMucHVzaCh7IGluZGV4LCB0ZXh0OiBpbmRleCAhPSBudWxsID8gaW5kZXgudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpIDogdGV4dCB9KTtcbiAgICB9XG5cbiAgICBpZiAodG90YWwgPD0gNSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0b3RhbDsgaSsrKSBnZXRQYWdlKGkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGljaW9uYSBvcyBkb2lzIHByaW1laXJvc1xuICAgICAgZ2V0UGFnZSgxKTtcbiAgICAgIGdldFBhZ2UoMik7XG5cbiAgICAgIC8vIEFkaWNpb25hIFwiLi4uXCIgZW50cmUgb3MgYmxvY29zXG4gICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50ID4gMykgZ2V0UGFnZShudWxsLCAnLi4uJyk7XG5cbiAgICAgIC8vIEFkaWNpb25hIGEgcMOhZ2luYSBhdHVhbCAoc2UgZXN0aXZlciBubyBtZWlvKVxuICAgICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudCA+IDIgJiYgY3VycmVudCA8IHRvdGFsIC0gMSkgZ2V0UGFnZShjdXJyZW50KTtcblxuICAgICAgLy8gQWRpY2lvbmEgXCIuLi5cIiBlbnRyZSBvcyBibG9jb3NcbiAgICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQgPCB0b3RhbCAtIDIpIGdldFBhZ2UobnVsbCwgJy4uLicpO1xuXG4gICAgICAvLyBBZGljaW9uYSBvcyBkb2lzIMO6bHRpbW9zXG4gICAgICBnZXRQYWdlKHRvdGFsIC0gMSk7XG4gICAgICBnZXRQYWdlKHRvdGFsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFnZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGN1cnJlbnQgYWN0aXZlIHBhZ2UgbnVtYmVyLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjdXJyZW50IHBhZ2UgbnVtYmVyIHRoYXQgaXMgYWN0aXZlIGluIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudC5cbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYSB3YXkgdG8gYWNjZXNzIHRoZSBjdXJyZW50IHBhZ2Ugc3RhdGUgZnJvbSBvdXRzaWRlIHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBjdXJyZW50IHBhZ2UgbnVtYmVyXG4gICAqIEBtZW1iZXJPZiBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqL1xuICBnZXRDdXJyZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTmF2aWdhdGVzIHRvIHRoZSBuZXh0IHBhZ2UuXG4gICAqIEBzdW1tYXJ5IEluY3JlbWVudHMgdGhlIGN1cnJlbnQgcGFnZSBudW1iZXIgaWYgbm90IGF0IHRoZSBsYXN0IHBhZ2UgYW5kIHRyaWdnZXJzXG4gICAqIHRoZSBjbGljayBldmVudCBoYW5kbGVyIHdpdGggJ25leHQnIGRpcmVjdGlvbi4gVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IGNhbGxlZFxuICAgKiB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgXCJuZXh0XCIgYnV0dG9uIGluIHRoZSBwYWdpbmF0aW9uIFVJLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqXG4gICAqICAgVS0+PlA6IENsaWNrIG5leHQgYnV0dG9uXG4gICAqICAgUC0+PlA6IG5leHQoKVxuICAgKiAgIGFsdCBwYWdlIDw9IG1heCBwYWdlc1xuICAgKiAgICAgUC0+PlA6IEluY3JlbWVudCBjdXJyZW50IHBhZ2VcbiAgICogICAgIFAtPj5QOiBoYW5kbGVDbGljaygnbmV4dCcpXG4gICAqICAgZW5kXG4gICAqXG4gICAqIEBtZW1iZXJPZiBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqL1xuICBuZXh0KCk6IHZvaWQge1xuICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmN1cnJlbnQgKyAxO1xuICAgIGlmKHBhZ2UgPD0gT2JqZWN0LmtleXModGhpcy5wYWdlcyk/Lmxlbmd0aCB8fCAwKSB7XG4gICAgICB0aGlzLmN1cnJlbnQgPSBwYWdlO1xuICAgICAgdGhpcy5oYW5kbGVDbGljaygnbmV4dCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTmF2aWdhdGVzIHRvIHRoZSBwcmV2aW91cyBwYWdlLlxuICAgKiBAc3VtbWFyeSBEZWNyZW1lbnRzIHRoZSBjdXJyZW50IHBhZ2UgbnVtYmVyIGlmIG5vdCBhdCB0aGUgZmlyc3QgcGFnZSBhbmQgdHJpZ2dlcnNcbiAgICogdGhlIGNsaWNrIGV2ZW50IGhhbmRsZXIgd2l0aCAncHJldmlvdXMnIGRpcmVjdGlvbi4gVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IGNhbGxlZFxuICAgKiB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgXCJwcmV2aW91c1wiIGJ1dHRvbiBpbiB0aGUgcGFnaW5hdGlvbiBVSS5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICAgKiAgIHBhcnRpY2lwYW50IFAgYXMgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKlxuICAgKiAgIFUtPj5QOiBDbGljayBwcmV2aW91cyBidXR0b25cbiAgICogICBQLT4+UDogcHJldmlvdXMoKVxuICAgKiAgIGFsdCBwYWdlID4gMFxuICAgKiAgICAgUC0+PlA6IERlY3JlbWVudCBjdXJyZW50IHBhZ2VcbiAgICogICAgIFAtPj5QOiBoYW5kbGVDbGljaygncHJldmlvdXMnKVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiBAbWVtYmVyT2YgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKi9cbiAgcHJldmlvdXMoKTogdm9pZCB7XG4gICAgY29uc3QgcGFnZSA9IHRoaXMuY3VycmVudCAtIDE7XG4gICAgaWYocGFnZSA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudCA9IHBhZ2U7XG4gICAgICB0aGlzLmhhbmRsZUNsaWNrKCdwcmV2aW91cycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTmF2aWdhdGVzIHRvIGEgc3BlY2lmaWMgcGFnZSBudW1iZXIuXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgdGhlIGN1cnJlbnQgcGFnZSB0byB0aGUgc3BlY2lmaWVkIHBhZ2UgbnVtYmVyIGFuZCB0cmlnZ2Vyc1xuICAgKiB0aGUgY2xpY2sgZXZlbnQgaGFuZGxlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rpb24uIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseVxuICAgKiBjYWxsZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgZGlyZWN0bHkgb24gYSBwYWdlIG51bWJlciBpbiB0aGUgcGFnaW5hdGlvbiBVSS5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsfSBwYWdlIC0gVGhlIHBhZ2UgbnVtYmVyIHRvIG5hdmlnYXRlIHRvXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBQIGFzIFBhZ2luYXRpb25Db21wb25lbnRcbiAgICpcbiAgICogICBVLT4+UDogQ2xpY2sgcGFnZSBudW1iZXJcbiAgICogICBQLT4+UDogbmF2aWdhdGUocGFnZSlcbiAgICogICBhbHQgcGFnZSBpcyBub3QgbnVsbCBhbmQgZGlmZmVyZW50IGZyb20gY3VycmVudFxuICAgKiAgICAgUC0+PlA6IERldGVybWluZSBkaXJlY3Rpb24gKG5leHQvcHJldmlvdXMpXG4gICAqICAgICBQLT4+UDogaGFuZGxlQ2xpY2soZGlyZWN0aW9uLCBwYWdlKVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiBAbWVtYmVyT2YgUGFnaW5hdGlvbkNvbXBvbmVudFxuICAgKi9cbiAgbmF2aWdhdGUocGFnZTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmKHBhZ2UgIT09IG51bGwgJiYgdGhpcy5jdXJyZW50ICE9PSBwYWdlIGFzIG51bWJlcilcbiAgICAgIHRoaXMuaGFuZGxlQ2xpY2socGFnZSA+IHRoaXMuY3VycmVudCA/ICduZXh0JyA6ICdwcmV2aW91cycsIHBhZ2UpO1xuICB9XG59XG4iLCIgPGRpdiBpZD1cImRjZi1wYWdpbmF0b3ItY29udGFpbmVyXCIgY2xhc3M9XCJkY2YtZmxleCBkY2YtZmxleC1jZW50ZXJcIj5cbiAgPGRpdiBjbGFzcz1cImRjZi13aWR0aC0xLTFcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGNmLXBhZ2luYXRpb24tcmVzdW1lXCIgW2lubmVySFRNTF09XCJsb2NhbGUgKyAnLnJlc3VtZScgfCB0cmFuc2xhdGU6IHt2YWx1ZTA6IGN1cnJlbnQsIHZhbHVlMTogbGFzdH1cIj48L2Rpdj5cbiAgICA8ZGl2ICNwYWdpbmF0aW9uQ29tcG9uZW50IGNsYXNzPVwiZGNmLXBhZ2luYXRpb24gYWVvbi1wYWdpbmF0aW9uIGRjZi1mbGV4LWNlbnRlclwiPlxuICAgICAgPGRpdlxuICAgICAgICBhcmlhLWxhYmVsPVwicHJldmlvdXNcIlxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAoY2xpY2spPVwicHJldmlvdXMoKVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cInByZXZpb3VzKClcIiBbbmdDbGFzc109XCJ7J2RjZi1kaXNhYmxlZCc6IGN1cnJlbnQgPT09IDF9XCI+XG4gICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hldnJvbi1iYWNrLW91dGxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2lvbi1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICBAZm9yKHBhZ2Ugb2YgcGFnZXM7IHRyYWNrIHBhZ2UpIHtcbiAgICAgICAgPGRpdiB0YWJpbmRleD1cIjBcIiAoY2xpY2spPVwibmF2aWdhdGUocGFnZVsnaW5kZXgnXSlcIlxuICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm5hdmlnYXRlKHBhZ2VbJ2luZGV4J10pXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2RjZi1hY3RpdmUnOiBjdXJyZW50ID09PSBwYWdlWydpbmRleCddLCAnZGNmLWRpc2FibGVkJzogcGFnZVsnaW5kZXgnXSA9PT0gbmRpdmx9XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdlLWl0ZW1cIj57eyBwYWdlWyd0ZXh0J10gfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPGRpdlxuICAgICAgICB0YWJpbmRleD1cIjBcIiAoY2xpY2spPVwibmV4dCgpXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwibmV4dCgpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieydkY2YtZGlzYWJsZWQnOiBjdXJyZW50ID09PSBsYXN0fVwiPlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cImNoZXZyb24tZm9yd2FyZC1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pb24taWNvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|