@firestitch/form 12.2.6 → 12.3.1

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.
Files changed (100) hide show
  1. package/app/components/form-dialog-actions/form-dialog-actions.component.d.ts +22 -22
  2. package/app/consts/error-messages.const.d.ts +19 -19
  3. package/app/directives/{submit-button.directive.d.ts → button.directive.d.ts} +34 -31
  4. package/app/directives/form/form.directive.d.ts +110 -108
  5. package/app/directives/form-dialog-close.directive.d.ts +12 -12
  6. package/app/directives/validators/compare.directive.d.ts +15 -15
  7. package/app/directives/validators/control.directive.d.ts +48 -48
  8. package/app/directives/validators/daterange.directive.d.ts +13 -13
  9. package/app/directives/validators/email.directive.d.ts +13 -13
  10. package/app/directives/validators/emails.directive.d.ts +13 -13
  11. package/app/directives/validators/function.directive.d.ts +14 -14
  12. package/app/directives/validators/greater.directive.d.ts +13 -13
  13. package/app/directives/validators/integer.directive.d.ts +13 -13
  14. package/app/directives/validators/lesser.directive.d.ts +13 -13
  15. package/app/directives/validators/max.directive.d.ts +13 -13
  16. package/app/directives/validators/maxlength.directive.d.ts +13 -13
  17. package/app/directives/validators/min.directive.d.ts +13 -13
  18. package/app/directives/validators/minlength.directive.d.ts +13 -13
  19. package/app/directives/validators/no-fs-validators.directive.d.ts +13 -13
  20. package/app/directives/validators/numeric.directive.d.ts +13 -13
  21. package/app/directives/validators/pattern.directive.d.ts +13 -13
  22. package/app/directives/validators/phone.directive.d.ts +13 -13
  23. package/app/directives/validators/required.directive.d.ts +16 -16
  24. package/app/directives/validators/url.directive.d.ts +14 -14
  25. package/app/directives/validators/validate.directive.d.ts +14 -14
  26. package/app/enums/confirm-result.d.ts +7 -7
  27. package/app/enums/form-status.d.ts +9 -9
  28. package/app/fs-form.module.d.ts +36 -36
  29. package/app/guards/form-deactivate.guard.d.ts +12 -12
  30. package/app/helpers/confirm-result-continue.d.ts +1 -1
  31. package/app/helpers/confirm-unsaved.d.ts +5 -5
  32. package/app/helpers/get-form-errors.d.ts +2 -2
  33. package/app/helpers/index.d.ts +2 -2
  34. package/app/helpers/is-enabled.d.ts +1 -1
  35. package/app/interfaces/async-validator.d.ts +14 -14
  36. package/app/interfaces/confirm-config.d.ts +7 -7
  37. package/app/interfaces/confirm-tab-group.d.ts +10 -10
  38. package/app/interfaces/form-deactivate.d.ts +4 -4
  39. package/app/interfaces/index.d.ts +4 -4
  40. package/app/interfaces/submit-event.d.ts +5 -5
  41. package/app/interfaces/submitted-event.d.ts +6 -6
  42. package/app/interfaces/validator.d.ts +13 -13
  43. package/app/providers/validate-messages.provider.d.ts +25 -25
  44. package/app/services/fsform.service.d.ts +10 -10
  45. package/app/validators/validators.d.ts +12 -12
  46. package/bundles/firestitch-form.umd.js +2702 -2677
  47. package/bundles/firestitch-form.umd.js.map +1 -1
  48. package/esm2015/app/components/form-dialog-actions/form-dialog-actions.component.js +88 -88
  49. package/esm2015/app/consts/error-messages.const.js +19 -19
  50. package/esm2015/app/directives/button.directive.js +156 -0
  51. package/esm2015/app/directives/form/form.directive.js +637 -622
  52. package/esm2015/app/directives/form-dialog-close.directive.js +30 -30
  53. package/esm2015/app/directives/validators/compare.directive.js +48 -48
  54. package/esm2015/app/directives/validators/control.directive.js +256 -256
  55. package/esm2015/app/directives/validators/daterange.directive.js +40 -40
  56. package/esm2015/app/directives/validators/email.directive.js +40 -40
  57. package/esm2015/app/directives/validators/emails.directive.js +40 -40
  58. package/esm2015/app/directives/validators/function.directive.js +30 -30
  59. package/esm2015/app/directives/validators/greater.directive.js +39 -39
  60. package/esm2015/app/directives/validators/integer.directive.js +40 -40
  61. package/esm2015/app/directives/validators/lesser.directive.js +39 -39
  62. package/esm2015/app/directives/validators/max.directive.js +35 -35
  63. package/esm2015/app/directives/validators/maxlength.directive.js +34 -34
  64. package/esm2015/app/directives/validators/min.directive.js +35 -35
  65. package/esm2015/app/directives/validators/minlength.directive.js +34 -34
  66. package/esm2015/app/directives/validators/no-fs-validators.directive.js +46 -46
  67. package/esm2015/app/directives/validators/numeric.directive.js +40 -40
  68. package/esm2015/app/directives/validators/pattern.directive.js +34 -34
  69. package/esm2015/app/directives/validators/phone.directive.js +40 -40
  70. package/esm2015/app/directives/validators/required.directive.js +70 -70
  71. package/esm2015/app/directives/validators/url.directive.js +46 -46
  72. package/esm2015/app/directives/validators/validate.directive.js +32 -32
  73. package/esm2015/app/enums/confirm-result.js +8 -8
  74. package/esm2015/app/enums/form-status.js +10 -10
  75. package/esm2015/app/fs-form.module.js +176 -176
  76. package/esm2015/app/guards/form-deactivate.guard.js +39 -39
  77. package/esm2015/app/helpers/confirm-result-continue.js +4 -4
  78. package/esm2015/app/helpers/confirm-unsaved.js +69 -69
  79. package/esm2015/app/helpers/get-form-errors.js +24 -24
  80. package/esm2015/app/helpers/index.js +2 -2
  81. package/esm2015/app/helpers/is-enabled.js +3 -3
  82. package/esm2015/app/interfaces/async-validator.js +1 -1
  83. package/esm2015/app/interfaces/confirm-config.js +1 -1
  84. package/esm2015/app/interfaces/confirm-tab-group.js +1 -1
  85. package/esm2015/app/interfaces/form-deactivate.js +1 -1
  86. package/esm2015/app/interfaces/index.js +4 -4
  87. package/esm2015/app/interfaces/submit-event.js +1 -1
  88. package/esm2015/app/interfaces/submitted-event.js +1 -1
  89. package/esm2015/app/interfaces/validator.js +1 -1
  90. package/esm2015/app/providers/validate-messages.provider.js +10 -10
  91. package/esm2015/app/services/fsform.service.js +24 -24
  92. package/esm2015/app/validators/validators.js +96 -96
  93. package/esm2015/firestitch-form.js +4 -4
  94. package/esm2015/public_api.js +36 -36
  95. package/fesm2015/firestitch-form.js +2145 -2120
  96. package/fesm2015/firestitch-form.js.map +1 -1
  97. package/firestitch-form.d.ts +5 -5
  98. package/package.json +1 -1
  99. package/public_api.d.ts +34 -34
  100. package/esm2015/app/directives/submit-button.directive.js +0 -146
@@ -1,5 +1,5 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- /// <amd-module name="@firestitch/form" />
5
- export * from './public_api';
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@firestitch/form" />
5
+ export * from './public_api';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@firestitch/form",
3
- "version": "12.2.6",
3
+ "version": "12.3.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/Firestitch/ngx-form"
package/public_api.d.ts CHANGED
@@ -1,34 +1,34 @@
1
- export { FsFormModule } from './app/fs-form.module';
2
- export { FsForm } from './app/services/fsform.service';
3
- export { FsFormDirective } from './app/directives/form/form.directive';
4
- export { FsControlDirective } from './app/directives/validators/control.directive';
5
- export { FsFormRequiredDirective } from './app/directives/validators/required.directive';
6
- export { FsFormMinDirective } from './app/directives/validators/min.directive';
7
- export { FsFormMaxDirective } from './app/directives/validators/max.directive';
8
- export { FsFormMinLengthDirective } from './app/directives/validators/minlength.directive';
9
- export { FsFormMaxLengthDirective } from './app/directives/validators/maxlength.directive';
10
- export { FsFormEmailDirective } from './app/directives/validators/email.directive';
11
- export { FsFormEmailsDirective } from './app/directives/validators/emails.directive';
12
- export { FsFormPhoneDirective } from './app/directives/validators/phone.directive';
13
- export { FsFormCompareDirective } from './app/directives/validators/compare.directive';
14
- export { FsFormIntegerDirective } from './app/directives/validators/integer.directive';
15
- export { FsFormNumericDirective } from './app/directives/validators/numeric.directive';
16
- export { FsFormPatternDirective } from './app/directives/validators/pattern.directive';
17
- export { FsFormFunctionDirective } from './app/directives/validators/function.directive';
18
- export { FsFormDateRangeDirective } from './app/directives/validators/daterange.directive';
19
- export { FsFormGreaterDirective } from './app/directives/validators/greater.directive';
20
- export { FsFormLesserDirective } from './app/directives/validators/lesser.directive';
21
- export { FsFormUrlDirective } from './app/directives/validators/url.directive';
22
- export { FsFormDialogCloseDirective } from './app/directives/form-dialog-close.directive';
23
- export { FsSubmitButtonDirective } from './app/directives/submit-button.directive';
24
- export { FsFormValidateDirective } from './app/directives/validators/validate.directive';
25
- export { FsFormNoFsValidatorsDirective } from './app/directives/validators/no-fs-validators.directive';
26
- export { FsFormDialogActionsComponent } from './app/components/form-dialog-actions/form-dialog-actions.component';
27
- export { FsValidators } from './app/validators/validators';
28
- export { FormDeactivate } from './app/interfaces/form-deactivate';
29
- export { FormDeactivateGuard } from './app/guards/form-deactivate.guard';
30
- export { SubmitEvent } from './app/interfaces/submit-event';
31
- export { SubmittedEvent } from './app/interfaces/submitted-event';
32
- export { ConfirmConfig } from './app/interfaces/confirm-config';
33
- export { ConfirmResult } from './app/enums/confirm-result';
34
- export { FormStatus } from './app/enums/form-status';
1
+ export { FsFormModule } from './app/fs-form.module';
2
+ export { FsForm } from './app/services/fsform.service';
3
+ export { FsFormDirective } from './app/directives/form/form.directive';
4
+ export { FsControlDirective } from './app/directives/validators/control.directive';
5
+ export { FsFormRequiredDirective } from './app/directives/validators/required.directive';
6
+ export { FsFormMinDirective } from './app/directives/validators/min.directive';
7
+ export { FsFormMaxDirective } from './app/directives/validators/max.directive';
8
+ export { FsFormMinLengthDirective } from './app/directives/validators/minlength.directive';
9
+ export { FsFormMaxLengthDirective } from './app/directives/validators/maxlength.directive';
10
+ export { FsFormEmailDirective } from './app/directives/validators/email.directive';
11
+ export { FsFormEmailsDirective } from './app/directives/validators/emails.directive';
12
+ export { FsFormPhoneDirective } from './app/directives/validators/phone.directive';
13
+ export { FsFormCompareDirective } from './app/directives/validators/compare.directive';
14
+ export { FsFormIntegerDirective } from './app/directives/validators/integer.directive';
15
+ export { FsFormNumericDirective } from './app/directives/validators/numeric.directive';
16
+ export { FsFormPatternDirective } from './app/directives/validators/pattern.directive';
17
+ export { FsFormFunctionDirective } from './app/directives/validators/function.directive';
18
+ export { FsFormDateRangeDirective } from './app/directives/validators/daterange.directive';
19
+ export { FsFormGreaterDirective } from './app/directives/validators/greater.directive';
20
+ export { FsFormLesserDirective } from './app/directives/validators/lesser.directive';
21
+ export { FsFormUrlDirective } from './app/directives/validators/url.directive';
22
+ export { FsFormDialogCloseDirective } from './app/directives/form-dialog-close.directive';
23
+ export { FsButtonDirective } from './app/directives/button.directive';
24
+ export { FsFormValidateDirective } from './app/directives/validators/validate.directive';
25
+ export { FsFormNoFsValidatorsDirective } from './app/directives/validators/no-fs-validators.directive';
26
+ export { FsFormDialogActionsComponent } from './app/components/form-dialog-actions/form-dialog-actions.component';
27
+ export { FsValidators } from './app/validators/validators';
28
+ export { FormDeactivate } from './app/interfaces/form-deactivate';
29
+ export { FormDeactivateGuard } from './app/guards/form-deactivate.guard';
30
+ export { SubmitEvent } from './app/interfaces/submit-event';
31
+ export { SubmittedEvent } from './app/interfaces/submitted-event';
32
+ export { ConfirmConfig } from './app/interfaces/confirm-config';
33
+ export { ConfirmResult } from './app/enums/confirm-result';
34
+ export { FormStatus } from './app/enums/form-status';
@@ -1,146 +0,0 @@
1
- import { Directive, Host, ElementRef, HostBinding, Optional, Input, ChangeDetectorRef } from '@angular/core';
2
- import { MatButton } from '@angular/material/button';
3
- import { FsFormDirective } from '../directives/form/form.directive';
4
- import { fromEvent, Subject } from 'rxjs';
5
- import { takeUntil } from 'rxjs/operators';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/material/button";
8
- import * as i2 from "../directives/form/form.directive";
9
- export class FsSubmitButtonDirective {
10
- constructor(_matButton, _form, _elementRef, _cdRef) {
11
- this._matButton = _matButton;
12
- this._form = _form;
13
- this._elementRef = _elementRef;
14
- this._cdRef = _cdRef;
15
- this.dirtySubmit = true;
16
- this.transitionStyle = null;
17
- this.active = false;
18
- this._destroy$ = new Subject();
19
- }
20
- ngOnInit() {
21
- if (this._form) {
22
- this._form.addSubmitButton(this);
23
- fromEvent(this.element, 'click')
24
- .pipe(takeUntil(this._destroy$))
25
- .subscribe(() => {
26
- this.active = true;
27
- });
28
- if (this.dirtySubmit) {
29
- if (this._form.dirtySubmitButton) {
30
- if (!this._form.ngForm.dirty) {
31
- this.disable();
32
- }
33
- }
34
- }
35
- this.transitionStyle = 'none';
36
- setTimeout(() => {
37
- this.transitionStyle = null;
38
- }, 500);
39
- }
40
- }
41
- disable() {
42
- if (this._matButton) {
43
- this._matButton.disabled = true;
44
- this._cdRef.markForCheck();
45
- }
46
- }
47
- enable() {
48
- if (this._matButton) {
49
- this._matButton.disabled = false;
50
- this._matButton.disableRipple = true;
51
- this._cdRef.markForCheck();
52
- }
53
- }
54
- process() {
55
- this.setClass('process');
56
- this._matButton.disableRipple = true;
57
- }
58
- success() {
59
- this.setClass('success');
60
- this._matButton.disableRipple = false;
61
- }
62
- error() {
63
- this.setClass('error');
64
- this._matButton.disableRipple = false;
65
- }
66
- setClass(cls) {
67
- const svg = this._getSvg(cls);
68
- this._resetClass();
69
- this._disableShadowAnimation();
70
- this.element.classList.add(`submit-${cls}`);
71
- this.element.append(svg);
72
- }
73
- get element() {
74
- return this._elementRef.nativeElement;
75
- }
76
- reset() {
77
- this.active = false;
78
- this.enable();
79
- this.element.querySelectorAll('.svg-icon')
80
- .forEach((el) => {
81
- el.remove();
82
- });
83
- this._matButton.disableRipple = false;
84
- this._resetClass();
85
- }
86
- ngOnDestroy() {
87
- var _a;
88
- this._destroy$.next();
89
- this._destroy$.complete();
90
- (_a = this._form) === null || _a === void 0 ? void 0 : _a.removeSubmitButton(this);
91
- }
92
- _disableShadowAnimation() {
93
- // .mat-elevation-z2 removes the click shadow animation
94
- //this.element.classList.add('mat-elevation-z2');
95
- }
96
- _resetClass() {
97
- this.element.classList.remove('submit-success', 'submit-error', 'submit-process', 'mat-elevation-z2');
98
- }
99
- _getSvg(type) {
100
- if (type === 'success') {
101
- return new DOMParser().parseFromString(`<svg class="svg-icon svg-icon-success" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 38 38" style="enable-background:new 0 0 38 38;" xml:space="preserve" width="38px" height="38px">
102
- <g>
103
- <g class="check">
104
- <g>
105
- <path d="M29.6,11.9c-0.5-0.5-1.3-0.5-1.8,0L16.3,23.4l-6.1-6.1c-0.5-0.5-1.3-0.5-1.8,0s-0.5,1.3,0,1.8l7,7c0.3,0.3,0.6,0.4,0.9,0.4s0.7-0.1,0.9-0.4l12.4-12.4C30.1,13.2,30.1,12.4,29.6,11.9z"/>
106
- </g>
107
- </g>
108
- </g>
109
- </svg>`, 'text/xml').firstChild;
110
- }
111
- if (type === 'process') {
112
- return new DOMParser().parseFromString(`<svg class="svg-icon svg-icon-process" width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg">
113
- <g fill="none" fill-rule="evenodd">
114
- <g transform="translate(1 1)" stroke-width="2"><circle stroke-opacity=".5" cx="18" cy="18" r="18"/>
115
- <path d="M36 18c0-9.94-8.06-18-18-18"><animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur=".7s" repeatCount="indefinite"/></path>
116
- </g>
117
- </g>
118
- </svg>`, 'text/xml').firstChild;
119
- }
120
- if (type === 'error') {
121
- return new DOMParser().parseFromString(`<svg class="svg-icon svg-icon-error" xmlns="http://www.w3.org/2000/svg" width="38px" height="38px" viewBox="0 0 16 16"><g><path d="M8 1c3.9 0 7 3.1 7 7s-3.1 7-7 7-7-3.1-7-7 3.1-7 7-7zM8 0c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8v0z" data-original="#444444" data-old_color="#444444"/><path d="M12.2 10.8l-2.8-2.8 2.8-2.8-1.4-1.4-2.8 2.8-2.8-2.8-1.4 1.4 2.8 2.8-2.8 2.8 1.4 1.4 2.8-2.8 2.8 2.8z"/></g> </svg>`, 'text/xml').firstChild;
122
- }
123
- }
124
- }
125
- FsSubmitButtonDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsSubmitButtonDirective, deps: [{ token: i1.MatButton, host: true, optional: true }, { token: i2.FsFormDirective, optional: true }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
126
- FsSubmitButtonDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.16", type: FsSubmitButtonDirective, selector: "button[type=\"submit\"]", inputs: { name: "name", dirtySubmit: "dirtySubmit" }, host: { properties: { "style.transition": "this.transitionStyle" } }, ngImport: i0 });
127
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsSubmitButtonDirective, decorators: [{
128
- type: Directive,
129
- args: [{
130
- selector: 'button[type="submit"]',
131
- }]
132
- }], ctorParameters: function () { return [{ type: i1.MatButton, decorators: [{
133
- type: Optional
134
- }, {
135
- type: Host
136
- }] }, { type: i2.FsFormDirective, decorators: [{
137
- type: Optional
138
- }] }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { name: [{
139
- type: Input
140
- }], dirtySubmit: [{
141
- type: Input
142
- }], transitionStyle: [{
143
- type: HostBinding,
144
- args: ['style.transition']
145
- }] } });
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0LWJ1dHRvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2RpcmVjdGl2ZXMvc3VibWl0LWJ1dHRvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFhLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhJLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBTTNDLE1BQU0sT0FBTyx1QkFBdUI7SUFlbEMsWUFDOEIsVUFBcUIsRUFDN0IsS0FBc0IsRUFDbEMsV0FBdUIsRUFDdkIsTUFBeUI7UUFITCxlQUFVLEdBQVYsVUFBVSxDQUFXO1FBQzdCLFVBQUssR0FBTCxLQUFLLENBQWlCO1FBQ2xDLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBYjVCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBR25CLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBRXZCLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFZCxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQU8vQixDQUFDO0lBRUcsUUFBUTtRQUNiLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWpDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztpQkFDN0IsSUFB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LCBPbkluaXQsIEhvc3QsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBPcHRpb25hbCwgSW5wdXQsIE9uRGVzdHJveSwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IEZzRm9ybURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZm9ybS9mb3JtLmRpcmVjdGl2ZSc7XG5cbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ2J1dHRvblt0eXBlPVwic3VibWl0XCJdJyxcbn0pXG5leHBvcnQgY2xhc3MgRnNTdWJtaXRCdXR0b25EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KClcbiAgcHVibGljIG5hbWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGRpcnR5U3VibWl0ID0gdHJ1ZTtcblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLnRyYW5zaXRpb24nKVxuICBwdWJsaWMgdHJhbnNpdGlvblN0eWxlID0gbnVsbDtcblxuICBwdWJsaWMgYWN0aXZlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBIb3N0KCkgcHJpdmF0ZSBfbWF0QnV0dG9uOiBNYXRCdXR0b24sXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfZm9ybTogRnNGb3JtRGlyZWN0aXZlLFxuICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLl9mb3JtKSB7XG4gICAgICB0aGlzLl9mb3JtLmFkZFN1Ym1pdEJ1dHRvbih0aGlzKTtcblxuICAgICAgZnJvbUV2ZW50KHRoaXMuZWxlbWVudCwgJ2NsaWNrJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5kaXJ0eVN1Ym1pdCkge1xuICAgICAgICBpZiAodGhpcy5fZm9ybS5kaXJ0eVN1Ym1pdEJ1dHRvbikge1xuICAgICAgICAgIGlmKCF0aGlzLl9mb3JtLm5nRm9ybS5kaXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMudHJhbnNpdGlvblN0eWxlID0gJ25vbmUnO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblN0eWxlID0gbnVsbDtcbiAgICAgIH0sIDUwMCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc2FibGUoKSB7XG4gICAgaWYgKHRoaXMuX21hdEJ1dHRvbikge1xuICAgICAgdGhpcy5fbWF0QnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlbmFibGUoKSB7XG4gICAgaWYgKHRoaXMuX21hdEJ1dHRvbikge1xuICAgICAgdGhpcy5fbWF0QnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9tYXRCdXR0b24uZGlzYWJsZVJpcHBsZSA9IHRydWU7XG4gICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICB0aGlzLnNldENsYXNzKCdwcm9jZXNzJyk7XG4gICAgdGhpcy5fbWF0QnV0dG9uLmRpc2FibGVSaXBwbGUgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIHN1Y2Nlc3MoKSB7XG4gICAgdGhpcy5zZXRDbGFzcygnc3VjY2VzcycpO1xuICAgIHRoaXMuX21hdEJ1dHRvbi5kaXNhYmxlUmlwcGxlID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZXJyb3IoKSB7XG4gICAgdGhpcy5zZXRDbGFzcygnZXJyb3InKTtcbiAgICB0aGlzLl9tYXRCdXR0b24uZGlzYWJsZVJpcHBsZSA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHNldENsYXNzKGNscykge1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuX2dldFN2ZyhjbHMpO1xuICAgIHRoaXMuX3Jlc2V0Q2xhc3MoKTtcbiAgICB0aGlzLl9kaXNhYmxlU2hhZG93QW5pbWF0aW9uKCk7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoYHN1Ym1pdC0ke2Nsc31gKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kKHN2Zyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdmctaWNvbicpXG4gICAgICAuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgZWwucmVtb3ZlKCk7XG4gICAgICB9KTtcbiAgICB0aGlzLl9tYXRCdXR0b24uZGlzYWJsZVJpcHBsZSA9IGZhbHNlO1xuICAgIHRoaXMuX3Jlc2V0Q2xhc3MoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLl9mb3JtPy5yZW1vdmVTdWJtaXRCdXR0b24odGhpcyk7XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlU2hhZG93QW5pbWF0aW9uKCkge1xuICAgIC8vIC5tYXQtZWxldmF0aW9uLXoyIHJlbW92ZXMgdGhlIGNsaWNrIHNoYWRvdyBhbmltYXRpb25cbiAgICAvL3RoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtYXQtZWxldmF0aW9uLXoyJyk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNldENsYXNzKCkge1xuICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzdWJtaXQtc3VjY2VzcycsICdzdWJtaXQtZXJyb3InLCAnc3VibWl0LXByb2Nlc3MnLCAnbWF0LWVsZXZhdGlvbi16MicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U3ZnKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICByZXR1cm4gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhgPHN2ZyBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLXN1Y2Nlc3NcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmVyc2lvbj1cIjEuMVwiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAzOCAzOFwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzOCAzODtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIHdpZHRoPVwiMzhweFwiIGhlaWdodD1cIjM4cHhcIj5cbiAgICAgIDxnPlxuICAgICAgICA8ZyBjbGFzcz1cImNoZWNrXCI+XG4gICAgICAgICAgPGc+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTI5LjYsMTEuOWMtMC41LTAuNS0xLjMtMC41LTEuOCwwTDE2LjMsMjMuNGwtNi4xLTYuMWMtMC41LTAuNS0xLjMtMC41LTEuOCwwcy0wLjUsMS4zLDAsMS44bDcsN2MwLjMsMC4zLDAuNiwwLjQsMC45LDAuNHMwLjctMC4xLDAuOS0wLjRsMTIuNC0xMi40QzMwLjEsMTMuMiwzMC4xLDEyLjQsMjkuNiwxMS45elwiLz5cbiAgICAgICAgICA8L2c+XG4gICAgICAgIDwvZz5cbiAgICAgIDwvZz5cbiAgICAgIDwvc3ZnPmAsICd0ZXh0L3htbCcpLmZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdwcm9jZXNzJykge1xuICAgICAgcmV0dXJuIG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoYDxzdmcgY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi1wcm9jZXNzXCIgd2lkdGg9XCIzOFwiIGhlaWdodD1cIjM4XCIgdmlld0JveD1cIjAgMCAzOCAzOFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgIDxnIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPlxuICAgICAgICA8ZyB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMSAxKVwiIHN0cm9rZS13aWR0aD1cIjJcIj48Y2lyY2xlIHN0cm9rZS1vcGFjaXR5PVwiLjVcIiBjeD1cIjE4XCIgY3k9XCIxOFwiIHI9XCIxOFwiLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTM2IDE4YzAtOS45NC04LjA2LTE4LTE4LTE4XCI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT1cInRyYW5zZm9ybVwiIHR5cGU9XCJyb3RhdGVcIiBmcm9tPVwiMCAxOCAxOFwiIHRvPVwiMzYwIDE4IDE4XCIgZHVyPVwiLjdzXCIgcmVwZWF0Q291bnQ9XCJpbmRlZmluaXRlXCIvPjwvcGF0aD5cbiAgICAgICAgPC9nPlxuICAgICAgPC9nPlxuICAgICAgPC9zdmc+YCwgJ3RleHQveG1sJykuZmlyc3RDaGlsZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgcmV0dXJuIG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoYDxzdmcgY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi1lcnJvclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjM4cHhcIiBoZWlnaHQ9XCIzOHB4XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPjxnPjxwYXRoIGQ9XCJNOCAxYzMuOSAwIDcgMy4xIDcgN3MtMy4xIDctNyA3LTctMy4xLTctNyAzLjEtNyA3LTd6TTggMGMtNC40IDAtOCAzLjYtOCA4czMuNiA4IDggOCA4LTMuNiA4LTgtMy42LTgtOC04djB6XCIgZGF0YS1vcmlnaW5hbD1cIiM0NDQ0NDRcIiBkYXRhLW9sZF9jb2xvcj1cIiM0NDQ0NDRcIi8+PHBhdGggZD1cIk0xMi4yIDEwLjhsLTIuOC0yLjggMi44LTIuOC0xLjQtMS40LTIuOCAyLjgtMi44LTIuOC0xLjQgMS40IDIuOCAyLjgtMi44IDIuOCAxLjQgMS40IDIuOC0yLjggMi44IDIuOHpcIi8+PC9nPiA8L3N2Zz5gLCAndGV4dC94bWwnKS5maXJzdENoaWxkO1xuICAgIH1cbiAgfVxufVxuIl19