@vgip/meta-ui 1.6.9 → 1.7.2

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 (160) hide show
  1. package/{esm2020 → esm2022}/lib/common/metaAutofocus.directive.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/common/metaIcons.pipe.mjs +4 -4
  3. package/{esm2020 → esm2022}/lib/common/metaModel.pipe.mjs +4 -4
  4. package/{esm2020 → esm2022}/lib/common/metaNormalizer.mjs +16 -1
  5. package/{esm2020 → esm2022}/lib/common/metaStripHtml.pipe.mjs +4 -4
  6. package/{esm2020 → esm2022}/lib/fieldAbstract.mjs +5 -5
  7. package/esm2022/lib/fieldBoolean/index.mjs +56 -0
  8. package/{esm2020 → esm2022}/lib/fieldComposite/index.mjs +4 -4
  9. package/{esm2020 → esm2022}/lib/fieldDatetime/index.mjs +5 -5
  10. package/{esm2020 → esm2022}/lib/fieldHidden/index.mjs +4 -4
  11. package/{esm2020 → esm2022}/lib/fieldInput/index.mjs +5 -5
  12. package/{esm2020 → esm2022}/lib/fieldList/index.mjs +4 -4
  13. package/{esm2020 → esm2022}/lib/fieldRadio/index.mjs +5 -5
  14. package/esm2022/lib/fieldReference/index.mjs +825 -0
  15. package/esm2022/lib/fieldRichtext/index.mjs +95 -0
  16. package/esm2022/lib/fieldSelect/index.mjs +490 -0
  17. package/esm2022/lib/fieldText/index.mjs +65 -0
  18. package/{esm2020 → esm2022}/lib/fieldUnknown/index.mjs +4 -4
  19. package/esm2022/lib/index.mjs +163 -0
  20. package/{esm2020 → esm2022}/lib/layout/index.mjs +4 -4
  21. package/{esm2020 → esm2022}/lib/metaField/index.mjs +7 -7
  22. package/{esm2020 → esm2022}/lib/refDialog/index.mjs +4 -4
  23. package/{esm2020 → esm2022}/lib/resource/index.mjs +4 -4
  24. package/{esm2020 → esm2022}/lib/resourceCard/index.mjs +4 -4
  25. package/{esm2020 → esm2022}/lib/services/metaContext/index.mjs +4 -4
  26. package/{esm2020 → esm2022}/lib/services/metaMsg/index.mjs +4 -4
  27. package/{esm2020 → esm2022}/lib/services/metaReference/index.mjs +4 -4
  28. package/{esm2020 → esm2022}/lib/services/metaResource/index.mjs +4 -4
  29. package/{esm2020 → esm2022}/lib/services/metaResource/metaHttpClient.mjs +4 -4
  30. package/{esm2020 → esm2022}/lib/services/metaTracker/index.mjs +4 -4
  31. package/{esm2020 → esm2022}/lib/services/resourceDrafts/index.mjs +4 -4
  32. package/{fesm2020/vgip-meta-ui-fieldAbstract-17f26446.mjs → fesm2022/vgip-meta-ui-fieldAbstract-ce47588e.mjs} +5 -5
  33. package/fesm2022/vgip-meta-ui-fieldAbstract-ce47588e.mjs.map +1 -0
  34. package/{fesm2015/vgip-meta-ui-index-6e77c362.mjs → fesm2022/vgip-meta-ui-index-1467556e.mjs} +4 -4
  35. package/{fesm2020/vgip-meta-ui-index-6e77c362.mjs.map → fesm2022/vgip-meta-ui-index-1467556e.mjs.map} +1 -1
  36. package/fesm2022/vgip-meta-ui-index-5509b1d2.mjs +68 -0
  37. package/fesm2022/vgip-meta-ui-index-5509b1d2.mjs.map +1 -0
  38. package/fesm2022/vgip-meta-ui-index-5d664781.mjs +858 -0
  39. package/fesm2022/vgip-meta-ui-index-5d664781.mjs.map +1 -0
  40. package/{fesm2020/vgip-meta-ui-index-b428f3c0.mjs → fesm2022/vgip-meta-ui-index-617c4bac.mjs} +43 -28
  41. package/fesm2022/vgip-meta-ui-index-617c4bac.mjs.map +1 -0
  42. package/fesm2022/vgip-meta-ui-index-6dcb4942.mjs +24 -0
  43. package/{fesm2015/vgip-meta-ui-index-5a12f79d.mjs.map → fesm2022/vgip-meta-ui-index-6dcb4942.mjs.map} +1 -1
  44. package/{fesm2015/vgip-meta-ui-index-8c0d0972.mjs → fesm2022/vgip-meta-ui-index-78d7b9be.mjs} +7 -7
  45. package/fesm2022/vgip-meta-ui-index-78d7b9be.mjs.map +1 -0
  46. package/fesm2022/vgip-meta-ui-index-85109066.mjs +97 -0
  47. package/fesm2022/vgip-meta-ui-index-85109066.mjs.map +1 -0
  48. package/{fesm2015/vgip-meta-ui-index-fda3d1e2.mjs → fesm2022/vgip-meta-ui-index-86211382.mjs} +7 -8
  49. package/{fesm2020/vgip-meta-ui-index-39177940.mjs.map → fesm2022/vgip-meta-ui-index-86211382.mjs.map} +1 -1
  50. package/fesm2022/vgip-meta-ui-index-adb42356.mjs +95 -0
  51. package/fesm2022/vgip-meta-ui-index-adb42356.mjs.map +1 -0
  52. package/{fesm2020/vgip-meta-ui-index-db9a2218.mjs → fesm2022/vgip-meta-ui-index-cb0d4f82.mjs} +5 -5
  53. package/{fesm2015/vgip-meta-ui-index-db9a2218.mjs.map → fesm2022/vgip-meta-ui-index-cb0d4f82.mjs.map} +1 -1
  54. package/fesm2022/vgip-meta-ui-index-cfb67422.mjs +497 -0
  55. package/fesm2022/vgip-meta-ui-index-cfb67422.mjs.map +1 -0
  56. package/{fesm2020/vgip-meta-ui-index-8f956c8f.mjs → fesm2022/vgip-meta-ui-index-eba0dd05.mjs} +8 -8
  57. package/fesm2022/vgip-meta-ui-index-eba0dd05.mjs.map +1 -0
  58. package/fesm2022/vgip-meta-ui-index-eef5fc0f.mjs +61 -0
  59. package/fesm2022/vgip-meta-ui-index-eef5fc0f.mjs.map +1 -0
  60. package/{fesm2020/vgip-meta-ui-index-dae4cc15.mjs → fesm2022/vgip-meta-ui-index-f0fa2cbd.mjs} +6 -6
  61. package/{fesm2020/vgip-meta-ui-index-dae4cc15.mjs.map → fesm2022/vgip-meta-ui-index-f0fa2cbd.mjs.map} +1 -1
  62. package/{fesm2020/vgip-meta-ui-index-b0cee687.mjs → fesm2022/vgip-meta-ui-index-f5e42e1d.mjs} +20 -20
  63. package/{fesm2020/vgip-meta-ui-index-b0cee687.mjs.map → fesm2022/vgip-meta-ui-index-f5e42e1d.mjs.map} +1 -1
  64. package/{fesm2015/vgip-meta-ui-metaModel.pipe-4b068359.mjs → fesm2022/vgip-meta-ui-metaModel.pipe-3487ede2.mjs} +4 -4
  65. package/{fesm2015/vgip-meta-ui-metaModel.pipe-4b068359.mjs.map → fesm2022/vgip-meta-ui-metaModel.pipe-3487ede2.mjs.map} +1 -1
  66. package/{fesm2020 → fesm2022}/vgip-meta-ui.mjs +96 -91
  67. package/{fesm2015 → fesm2022}/vgip-meta-ui.mjs.map +1 -1
  68. package/lib/common/metaAutofocus.directive.d.ts +1 -1
  69. package/lib/fieldBoolean/index.d.ts +1 -1
  70. package/lib/fieldComposite/index.d.ts +1 -1
  71. package/lib/fieldRadio/index.d.ts +1 -1
  72. package/lib/fieldRichtext/index.d.ts +6 -8
  73. package/lib/fieldText/index.d.ts +1 -1
  74. package/lib/layout/index.d.ts +1 -1
  75. package/lib/metaField/index.d.ts +1 -1
  76. package/lib/resource/index.d.ts +1 -1
  77. package/lib/resourceCard/index.d.ts +1 -1
  78. package/package.json +8 -14
  79. package/esm2020/lib/fieldBoolean/index.mjs +0 -56
  80. package/esm2020/lib/fieldReference/index.mjs +0 -825
  81. package/esm2020/lib/fieldRichtext/index.mjs +0 -85
  82. package/esm2020/lib/fieldSelect/index.mjs +0 -488
  83. package/esm2020/lib/fieldText/index.mjs +0 -65
  84. package/esm2020/lib/index.mjs +0 -158
  85. package/fesm2015/vgip-meta-ui-fieldAbstract-17f26446.mjs +0 -397
  86. package/fesm2015/vgip-meta-ui-fieldAbstract-17f26446.mjs.map +0 -1
  87. package/fesm2015/vgip-meta-ui-index-0fc1c4a5.mjs +0 -68
  88. package/fesm2015/vgip-meta-ui-index-0fc1c4a5.mjs.map +0 -1
  89. package/fesm2015/vgip-meta-ui-index-5a12f79d.mjs +0 -24
  90. package/fesm2015/vgip-meta-ui-index-6e77c362.mjs.map +0 -1
  91. package/fesm2015/vgip-meta-ui-index-89b8d1d4.mjs +0 -858
  92. package/fesm2015/vgip-meta-ui-index-89b8d1d4.mjs.map +0 -1
  93. package/fesm2015/vgip-meta-ui-index-8a2f9dbf.mjs +0 -151
  94. package/fesm2015/vgip-meta-ui-index-8a2f9dbf.mjs.map +0 -1
  95. package/fesm2015/vgip-meta-ui-index-8c0d0972.mjs.map +0 -1
  96. package/fesm2015/vgip-meta-ui-index-8f956c8f.mjs +0 -460
  97. package/fesm2015/vgip-meta-ui-index-8f956c8f.mjs.map +0 -1
  98. package/fesm2015/vgip-meta-ui-index-91a02c0f.mjs +0 -95
  99. package/fesm2015/vgip-meta-ui-index-91a02c0f.mjs.map +0 -1
  100. package/fesm2015/vgip-meta-ui-index-9af6e01b.mjs +0 -88
  101. package/fesm2015/vgip-meta-ui-index-9af6e01b.mjs.map +0 -1
  102. package/fesm2015/vgip-meta-ui-index-9ca39230.mjs +0 -1900
  103. package/fesm2015/vgip-meta-ui-index-9ca39230.mjs.map +0 -1
  104. package/fesm2015/vgip-meta-ui-index-a276b206.mjs +0 -61
  105. package/fesm2015/vgip-meta-ui-index-a276b206.mjs.map +0 -1
  106. package/fesm2015/vgip-meta-ui-index-b79a6173.mjs +0 -72
  107. package/fesm2015/vgip-meta-ui-index-b79a6173.mjs.map +0 -1
  108. package/fesm2015/vgip-meta-ui-index-db9a2218.mjs +0 -23
  109. package/fesm2015/vgip-meta-ui-index-e4e3a171.mjs +0 -496
  110. package/fesm2015/vgip-meta-ui-index-e4e3a171.mjs.map +0 -1
  111. package/fesm2015/vgip-meta-ui-index-fda3d1e2.mjs.map +0 -1
  112. package/fesm2015/vgip-meta-ui.mjs +0 -525
  113. package/fesm2020/vgip-meta-ui-fieldAbstract-17f26446.mjs.map +0 -1
  114. package/fesm2020/vgip-meta-ui-index-0fc1c4a5.mjs +0 -68
  115. package/fesm2020/vgip-meta-ui-index-0fc1c4a5.mjs.map +0 -1
  116. package/fesm2020/vgip-meta-ui-index-39177940.mjs +0 -74
  117. package/fesm2020/vgip-meta-ui-index-5a12f79d.mjs +0 -24
  118. package/fesm2020/vgip-meta-ui-index-5a12f79d.mjs.map +0 -1
  119. package/fesm2020/vgip-meta-ui-index-6e77c362.mjs +0 -130
  120. package/fesm2020/vgip-meta-ui-index-8c0d0972.mjs +0 -368
  121. package/fesm2020/vgip-meta-ui-index-8c0d0972.mjs.map +0 -1
  122. package/fesm2020/vgip-meta-ui-index-8f956c8f.mjs.map +0 -1
  123. package/fesm2020/vgip-meta-ui-index-91a02c0f.mjs +0 -95
  124. package/fesm2020/vgip-meta-ui-index-91a02c0f.mjs.map +0 -1
  125. package/fesm2020/vgip-meta-ui-index-9af6e01b.mjs +0 -88
  126. package/fesm2020/vgip-meta-ui-index-9af6e01b.mjs.map +0 -1
  127. package/fesm2020/vgip-meta-ui-index-a276b206.mjs +0 -61
  128. package/fesm2020/vgip-meta-ui-index-a276b206.mjs.map +0 -1
  129. package/fesm2020/vgip-meta-ui-index-ad59c1c4.mjs +0 -495
  130. package/fesm2020/vgip-meta-ui-index-ad59c1c4.mjs.map +0 -1
  131. package/fesm2020/vgip-meta-ui-index-b428f3c0.mjs.map +0 -1
  132. package/fesm2020/vgip-meta-ui-index-db9a2218.mjs.map +0 -1
  133. package/fesm2020/vgip-meta-ui-index-e5f4755f.mjs +0 -858
  134. package/fesm2020/vgip-meta-ui-index-e5f4755f.mjs.map +0 -1
  135. package/fesm2020/vgip-meta-ui-metaModel.pipe-4b068359.mjs +0 -28
  136. package/fesm2020/vgip-meta-ui-metaModel.pipe-4b068359.mjs.map +0 -1
  137. package/fesm2020/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs +0 -51
  138. package/fesm2020/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs.map +0 -1
  139. package/fesm2020/vgip-meta-ui.mjs.map +0 -1
  140. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/boolean.mjs +0 -0
  141. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/datetime.mjs +0 -0
  142. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/index.mjs +0 -0
  143. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/number.mjs +0 -0
  144. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/options.mjs +0 -0
  145. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/radio.mjs +0 -0
  146. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/reference.mjs +0 -0
  147. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/richtext.mjs +0 -0
  148. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/string.mjs +0 -0
  149. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/text.mjs +0 -0
  150. /package/{esm2020 → esm2022}/lib/common/fieldNormalizer/uniqueNameFilter.mjs +0 -0
  151. /package/{esm2020 → esm2022}/lib/common/utils/colorThemes.mjs +0 -0
  152. /package/{esm2020 → esm2022}/lib/common/utils/indexedDbStore/index.mjs +0 -0
  153. /package/{esm2020 → esm2022}/lib/common/utils/relativeTimeBuilder.mjs +0 -0
  154. /package/{esm2020 → esm2022}/lib/common/utils/resourceCardLabel.mjs +0 -0
  155. /package/{esm2020 → esm2022}/lib/common/utils/smartProp.mjs +0 -0
  156. /package/{esm2020 → esm2022}/lib/common/utils/templateBuilder.mjs +0 -0
  157. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  158. /package/{esm2020 → esm2022}/vgip-meta-ui.mjs +0 -0
  159. /package/{fesm2015 → fesm2022}/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs +0 -0
  160. /package/{fesm2015 → fesm2022}/vgip-meta-ui-relativeTimeBuilder-31791ce4.mjs.map +0 -0
@@ -1,825 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import { FieldAbstract } from '../fieldAbstract';
3
- import { ControlContainer, NgForm } from '@angular/forms';
4
- import { Subject } from 'rxjs';
5
- import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
6
- import { MetaRefDialog } from '../refDialog';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "../services/metaReference";
9
- import * as i2 from "../services/metaResource";
10
- import * as i3 from "../services/metaMsg";
11
- import * as i4 from "../services/metaContext";
12
- import * as i5 from "../services/metaTracker";
13
- import * as i6 from "@angular/common";
14
- import * as i7 from "@angular/forms";
15
- import * as i8 from "../metaField/index";
16
- import * as i9 from "../common/metaModel.pipe";
17
- export class FieldReference extends FieldAbstract {
18
- constructor(referenceService, metaResource, metaMsgService, metaContext, metaTracker, viewContainerRef) {
19
- super();
20
- this.referenceService = referenceService;
21
- this.metaResource = metaResource;
22
- this.metaMsgService = metaMsgService;
23
- this.metaContext = metaContext;
24
- this.metaTracker = metaTracker;
25
- this.viewContainerRef = viewContainerRef;
26
- this.searchResourceType = {};
27
- this.searchTextChanged = new Subject();
28
- this.isCreatable = false;
29
- this.dropdownVisible = false;
30
- this.searchResourceTypeMeta = {
31
- type: 'select',
32
- name: 'resourceType',
33
- label: 'Type',
34
- options: [],
35
- standalone: true
36
- };
37
- this.filteredSuggestions = [];
38
- this.smartSuggestions = [];
39
- this.clickout = (event) => {
40
- const internalControl = this.elementRef.nativeElement.contains(event.target);
41
- if (internalControl && ['Vlt-dropdown__link', 'Vlt-dropdown__block'].indexOf(event.target.className) !== -1) {
42
- this.focus();
43
- }
44
- else if (!internalControl && event.target !== this.input && event.target.className !== 'Vlt-dropdown__title') {
45
- this.dismissDropdown();
46
- }
47
- else {
48
- if (!internalControl && internalControl.tagName !== 'INPUT') {
49
- this.focus();
50
- }
51
- }
52
- };
53
- this.keydown = (event) => {
54
- switch (event.key) {
55
- case 'ArrowDown': {
56
- this.showDropdown();
57
- if (typeof (this.activeSuggestionIndex) === 'undefined') {
58
- this.activeSuggestionIndex = 0;
59
- }
60
- else {
61
- this.activeSuggestionIndex++;
62
- if (this.activeSuggestionIndex >= (this.searchResults || this.suggestions).length) {
63
- this.activeSuggestionIndex = 0;
64
- }
65
- }
66
- this.ensureDropdownOptionIsVisible();
67
- event.preventDefault();
68
- event.stopPropagation();
69
- break;
70
- }
71
- case 'ArrowUp': {
72
- this.showDropdown();
73
- if (typeof (this.activeSuggestionIndex) === 'undefined') {
74
- this.activeSuggestionIndex = (this.searchResults || this.suggestions).length - 1;
75
- }
76
- else {
77
- this.activeSuggestionIndex--;
78
- if (this.activeSuggestionIndex < 0) {
79
- this.activeSuggestionIndex = (this.searchResults || this.suggestions).length - 1;
80
- }
81
- }
82
- this.ensureDropdownOptionIsVisible();
83
- event.preventDefault();
84
- event.stopPropagation();
85
- break;
86
- }
87
- case 'Space':
88
- case 'Enter': {
89
- if (typeof (this.activeSuggestionIndex) !== 'undefined') {
90
- event.preventDefault();
91
- event.stopPropagation();
92
- this.onSuggestionSelect(event, (this.searchResults || this.suggestions)[this.activeSuggestionIndex]);
93
- delete this.activeSuggestionIndex;
94
- }
95
- break;
96
- }
97
- case 'Escape': {
98
- event.preventDefault();
99
- event.stopPropagation();
100
- this.dismissDropdown();
101
- break;
102
- }
103
- case 'Backspace': {
104
- if (!this.multiple && this.model) { // HPBR-8229
105
- event.preventDefault();
106
- event.stopPropagation();
107
- this.removeSelection();
108
- }
109
- break;
110
- }
111
- }
112
- };
113
- }
114
- get disabled() {
115
- const superDisabled = this.logicalDisabled || this.validations.disabled || this.meta.disabled === true
116
- || (this.meta.updatable === false && this.isPersistedParent);
117
- this.searchResourceTypeMeta.disabled = superDisabled;
118
- return superDisabled;
119
- }
120
- get showTypes() {
121
- return (typeof (this.meta.showTypes) !== 'undefined') ? this.meta.showTypes : true;
122
- }
123
- get suggestions() {
124
- return this.smartSuggestions.concat(!this.searchResourceType.resourceType ?
125
- // eslint-disable-next-line max-len
126
- (this.asyncSuggestions || this.meta.suggestions || []) : (this.asyncSuggestions || this.meta.suggestions || []).filter((s) => s.type === this.searchResourceType.resourceType));
127
- }
128
- get hasAppendButton() {
129
- if (!this.multiple && this.model) {
130
- if (this.isPolymorphic) {
131
- for (const ref of this.metaReference) {
132
- if ((ref.name || ref.resourceType) === (this.model.type || this.model.resourceType)) {
133
- return ref.updatable || (ref.creatable && ref.updatable !== false);
134
- }
135
- }
136
- }
137
- else {
138
- return this.metaReference.updatable || (this.metaReference.creatable && this.metaReference.updatable !== false); // VGIS-6911
139
- }
140
- }
141
- else if (this.metaReference instanceof Array) {
142
- // setTimeout(() => {
143
- // this.searchResourceTypesScope = this.metaReference.map(rt => rt.name).join(',');
144
- // }, 0);
145
- for (const rt of this.metaReference) {
146
- if (rt.hidden !== false && rt.creatable) {
147
- return true;
148
- }
149
- }
150
- }
151
- else {
152
- return this.metaReference.creatable;
153
- }
154
- }
155
- get resourceService() {
156
- if (!this.metaResourceService) {
157
- const metaResourceConfig = {
158
- integrationCode: this.integrationCode,
159
- resourceType: this.resourceType
160
- };
161
- this.metaResourceService = this.metaResource.new(metaResourceConfig);
162
- }
163
- return this.metaResourceService;
164
- }
165
- get metaReference() {
166
- return this.meta.reference || {};
167
- }
168
- ngOnInit() {
169
- this.multiple = (this.meta.type === 'multireference') || this.meta.multiple;
170
- this.searchResourceTypeMeta.label = this.meta.label;
171
- if (!this.meta.valueType) {
172
- // this.meta.valueType = 'object';
173
- Object.defineProperty(this.meta, 'valueType', {
174
- value: 'object'
175
- });
176
- }
177
- if (this.metaReference instanceof Array) {
178
- this.isPolymorphic = true;
179
- this.isSearchable = true;
180
- this.searchResourceTypesScope = this.metaReference.filter(rt => rt.hidden !== true).map(rt => rt.name).join(',');
181
- for (const rt of this.metaReference) {
182
- if (rt.creatable) {
183
- this.isCreatable = true;
184
- if (typeof (rt.searchable) !== 'undefined' && !rt.searchable) {
185
- this.isSearchable = false;
186
- }
187
- }
188
- }
189
- this.metaReference.forEach((r) => {
190
- if (!r.hidden) {
191
- this.searchResourceTypeMeta.options.push({ id: r.name, label: r.label || r.name });
192
- }
193
- });
194
- }
195
- else {
196
- this.isSearchable = typeof (this.metaReference.searchable) === 'undefined' || this.metaReference.searchable;
197
- this.searchResourceType = this.metaReference;
198
- this.searchResourceTypesScope = this.metaReference.name || this.metaReference.resourceType;
199
- this.isCreatable = this.metaReference.creatable;
200
- }
201
- this.buildPlaceholderLabel();
202
- this.searchTextChanged.pipe(debounceTime(300), distinctUntilChanged()).subscribe((value) => {
203
- this.searchText = value;
204
- this.search();
205
- });
206
- const origValue = this.parent[this.meta.name];
207
- // this.suggestions = this.meta.suggestions; // TODO filter by default type
208
- // console.log('this.suggestions', this.suggestions);
209
- Object.defineProperty(this.parent, this.meta.name, {
210
- set: (value) => {
211
- if (value === '') {
212
- value = null;
213
- }
214
- if (this.multiple) {
215
- if (value && value instanceof Array) {
216
- for (const v of value) {
217
- if (!this.model) {
218
- this.model = [];
219
- }
220
- if (typeof (v) === 'string') {
221
- this.model.push({
222
- id: v,
223
- label: v,
224
- type: this.metaReference.name
225
- });
226
- }
227
- }
228
- }
229
- else {
230
- value = null; // protect when value from server is not array
231
- }
232
- }
233
- else {
234
- if (typeof (value) === 'string') {
235
- value = {
236
- id: value,
237
- label: value,
238
- type: this.metaReference.name
239
- };
240
- }
241
- this.searchText = value ?
242
- ((!value.label || value.label === ' ') ? `N/A (${value.type}#${value.id})` : value.label || value) :
243
- '';
244
- // if (this.isPolymorphic && this.model) { //TODO show or not?
245
- // this.searchResourceType = this.metaReference.find((rt)=> {
246
- // return rt.name === this.model.type;
247
- // });
248
- // }
249
- }
250
- this.model = value;
251
- if (!this.multiple) {
252
- this.value = this.modelToValue(value, this.meta.valueType || 'object');
253
- this.buildExternalLink();
254
- }
255
- else {
256
- this.value = !this.model ? this.model : this.model.map((m) => this.modelToValue(m, this.meta.valueType || 'object'));
257
- }
258
- this.meta.$optional = this.isOptional;
259
- },
260
- get: () => this.value,
261
- enumerable: this.sendToServer,
262
- configurable: true
263
- });
264
- if (origValue) {
265
- this.parent[this.meta.name] = origValue;
266
- }
267
- if (!this.model && this.default) {
268
- if (this.multiple) {
269
- this.parent[this.meta.name] = [];
270
- if (this.default.length) {
271
- for (const dv of this.default) {
272
- if ((dv.id || dv.value) && dv.type) {
273
- const item = {
274
- id: dv.id || dv.value,
275
- label: dv.label || dv.id || dv.value,
276
- type: dv.type
277
- };
278
- if (dv.externalLink) {
279
- item.externalLink = dv.externalLink;
280
- }
281
- this.parent[this.meta.name].push(item);
282
- }
283
- }
284
- }
285
- if (!this.parent[this.meta.name].length) {
286
- this.clear();
287
- }
288
- }
289
- else {
290
- if (this.default.id && this.default.label && this.default.type) {
291
- setTimeout(() => {
292
- const item = {
293
- id: this.default.id || this.default.value,
294
- label: this.default.label || this.default.id || this.default.value,
295
- type: this.default.type,
296
- smart: true
297
- };
298
- if (this.default.externalLink) {
299
- item.externalLink = this.default.externalLink;
300
- }
301
- this.parent[this.meta.name] = item;
302
- }, 0);
303
- }
304
- else {
305
- console.warn('!!!default value is not valid format', this.meta);
306
- }
307
- }
308
- }
309
- if (typeof (this.meta.disabled) !== undefined) {
310
- if (typeof (this.meta.disabled) === 'object') {
311
- for (const p of Object.keys(this.meta.disabled)) {
312
- const props = p.split('.');
313
- if (typeof (this.parent[props[0]]) !== 'undefined') {
314
- let val = this.parent;
315
- for (const prop of props) {
316
- val = val[prop];
317
- if (!val) {
318
- break;
319
- }
320
- }
321
- if (val === this.meta.disabled[p]) {
322
- this.logicalDisabled = true;
323
- this.clear();
324
- }
325
- }
326
- this.parentChangeSubject.subscribe((value) => {
327
- if (value && value.hasOwnProperty(props[0])) {
328
- let val = this.parent;
329
- for (const prop of props) {
330
- val = val[prop];
331
- if (!val) {
332
- break;
333
- }
334
- }
335
- if (val === this.meta.disabled[p]) {
336
- this.logicalDisabled = true;
337
- this.clear();
338
- }
339
- else {
340
- delete this.logicalDisabled;
341
- }
342
- }
343
- });
344
- }
345
- }
346
- }
347
- if (this.meta.auto && this.meta.auto.search) {
348
- const searchParams = this.meta.auto.search.params;
349
- if (searchParams) {
350
- for (const par of Object.keys(searchParams)) {
351
- const props = searchParams[par].split('.');
352
- const field = props[0];
353
- const prop = props[1];
354
- let parValue = this.parent[field];
355
- if (parValue) {
356
- if (prop) {
357
- parValue = parValue[prop];
358
- }
359
- if (parValue) {
360
- const params = {};
361
- params[par] = parValue;
362
- this.searchAutoSuggestions(params);
363
- }
364
- }
365
- this.parentChangeSubject.subscribe((value) => {
366
- if (value && value.hasOwnProperty(field)) {
367
- if (value[field]) {
368
- if (prop) {
369
- value[field] = value[field][prop];
370
- }
371
- const params = {};
372
- params[par] = value[field];
373
- this.searchAutoSuggestions(params);
374
- }
375
- }
376
- });
377
- }
378
- }
379
- }
380
- }
381
- clearSearchResourceType() {
382
- this.searchResourceType = {};
383
- this.onSearchResourceTypeChanged();
384
- }
385
- onSearchResourceTypeChanged(resourceType) {
386
- if (!resourceType || !resourceType.id) {
387
- this.searchResourceType.resourceType = null;
388
- this.searchResourceTypesScope = (this.metaReference || []).filter(rt => rt.hidden !== true).map(rt => rt.name).join(',');
389
- }
390
- else {
391
- this.searchResourceType.resourceType = resourceType.id;
392
- this.searchResourceTypesScope = resourceType.id;
393
- }
394
- this.buildPlaceholderLabel();
395
- this.focus();
396
- if (!this.model && !this.searchText) { // filter suggestions by type
397
- this.filteredSuggestions = !resourceType ? (this.meta.suggestions || []) : (this.meta.suggestions || []).filter((s) => s.type === resourceType.id);
398
- }
399
- else { // regular search (return scoped results)
400
- if (!this.model) {
401
- this.search();
402
- }
403
- else if (this.searchResults && resourceType) {
404
- this.searchResults = this.searchResults.filter((s) => s.type === resourceType.id);
405
- }
406
- }
407
- delete this.searchError;
408
- }
409
- onSearchTextChanged(value) {
410
- this.searchTextChanged.next(value);
411
- }
412
- search() {
413
- this.searching = true;
414
- // this.activeSuggestionIndex;
415
- if (!this.searchText || this.searchText.length < 2) {
416
- this.searching = false;
417
- delete this.searchResults;
418
- return;
419
- }
420
- const showSearchResults = (results) => {
421
- this.searching = false;
422
- delete this.searchError;
423
- delete this.activeSuggestionIndex;
424
- if (!results || !(results instanceof Array)) {
425
- results = [];
426
- }
427
- if (this.meta.acceptNew && this.meta.acceptNew.type && this.meta.acceptNew.pattern) {
428
- const regex = new RegExp(this.meta.acceptNew.pattern);
429
- if (regex.test(this.searchText)) {
430
- results.unshift({ id: null, label: this.searchText, type: this.meta.acceptNew.type });
431
- }
432
- }
433
- this.searchResults = results.map((r) => {
434
- return { id: r.id, label: r.label, type: r.type || r.resourceType || this.searchResourceType.name, externalLink: r.externalLink };
435
- });
436
- if (!/Vlt-dropdown--expanded/.test(this.dropdown.className)) {
437
- this.showDropdown();
438
- }
439
- };
440
- if (this.meta.search) {
441
- const searchParams = this.meta.search.params || {};
442
- let searchUrl = `/fields/${this.meta.name}/search`;
443
- if (this.meta.search.url) {
444
- searchUrl = this.meta.search.url.replace(/\${\s*([\w\.]+)\s*}/g, (match, key) => {
445
- if (searchParams.hasOwnProperty(key)) {
446
- const props = searchParams[key].split('.');
447
- const field = props[0];
448
- const prop = props[1];
449
- delete searchParams[key]; // if it is URL param, remove it as query param
450
- let parValue = this.parent[field];
451
- if (parValue) {
452
- if (prop) {
453
- parValue = parValue[prop];
454
- }
455
- if (parValue) {
456
- return parValue;
457
- }
458
- }
459
- }
460
- return 'undefined';
461
- });
462
- }
463
- for (const p of Object.keys(searchParams)) {
464
- searchUrl += `${searchUrl.indexOf('?') === -1 ? '?' : '&'}${encodeURIComponent(p)}=${encodeURIComponent(searchParams[p])}`;
465
- }
466
- searchUrl += `${searchUrl.indexOf('?') === -1 ? '?' : '&'}q=${encodeURIComponent(this.searchText)}`;
467
- this.searching = true;
468
- this.resourceService.getByPath(searchUrl).subscribe((results) => {
469
- showSearchResults(results);
470
- }, (error) => {
471
- delete this.searching;
472
- this.searchResults = [];
473
- this.searchError = error.error ? error.error.message || error.error : error.message || error;
474
- if (!/Vlt-dropdown--expanded/.test(this.dropdown.className)) {
475
- this.showDropdown();
476
- }
477
- });
478
- }
479
- else {
480
- if (!this.vr) {
481
- this.vr = this.metaResource.new({
482
- integrationCode: this.integrationCode,
483
- resourceType: null
484
- });
485
- }
486
- this.vr.searchIntegration(this.searchText, this.searchResourceType.name || this.searchResourceTypesScope).subscribe((results) => {
487
- showSearchResults(results);
488
- }, (error) => {
489
- this.searching = false;
490
- this.searchResults = [];
491
- this.searchError = error.error ? error.error.message || error.error : error.message || error;
492
- if (!/Vlt-dropdown--expanded/.test(this.dropdown.className)) {
493
- this.showDropdown();
494
- }
495
- });
496
- }
497
- }
498
- onActivated(ev) {
499
- // ev.preventDefault();
500
- // ev.stopPropagation();
501
- this.input = ev.srcElement;
502
- if (!this.dropdown) {
503
- // this.dropdown = ev.srcElement.parentNode.parentNode;
504
- this.dropdown = this.elementRef.nativeElement.querySelector('.dropdown-wrapper');
505
- }
506
- this.showDropdown();
507
- }
508
- onBlur(ev) {
509
- let internalControl = false;
510
- if (ev.relatedTarget) {
511
- if (!this.elementRef.nativeElement.contains(ev.relatedTarget)) {
512
- this.dismissDropdown();
513
- }
514
- else {
515
- internalControl = true;
516
- }
517
- }
518
- if (this.keyListenerActive && !internalControl) {
519
- this.input.removeEventListener('keydown', this.keydown);
520
- setTimeout(() => {
521
- if (!this.keyListenerActive) {
522
- document.removeEventListener('click', this.clickout);
523
- }
524
- }, 400);
525
- delete this.keyListenerActive;
526
- }
527
- }
528
- removeSelection() {
529
- if (this.model && !this.suggestions.find((s) => (s.id === this.model.id && s.type === this.model.type))) {
530
- this.smartSuggestions.push({
531
- id: this.model.id,
532
- label: this.model.label,
533
- type: this.model.type,
534
- smart: true
535
- });
536
- }
537
- this.metaTracker.emit(this.buildTrackEvent('REMOVE'));
538
- this.clear();
539
- }
540
- onSuggestionSelect(ev, suggestion) {
541
- if (!suggestion) {
542
- return;
543
- }
544
- ev.preventDefault();
545
- ev.stopPropagation();
546
- this.focus();
547
- this.metaTracker.emit(this.buildTrackEvent('SELECT'));
548
- if (this.multiple) {
549
- if (!this.model) {
550
- this.model = [];
551
- }
552
- let existingEntry;
553
- for (const entry of this.model) {
554
- if (suggestion.id && (entry.id === suggestion.id)) {
555
- existingEntry = entry;
556
- break;
557
- }
558
- else if (suggestion.label === entry.label) { // create new (google emails)
559
- existingEntry = entry;
560
- break;
561
- }
562
- }
563
- if (!existingEntry) {
564
- this.model.push(suggestion);
565
- }
566
- this.onModelChange(this.model);
567
- delete this.searchText;
568
- this.searchTextChanged.next();
569
- }
570
- else {
571
- this.model = suggestion;
572
- this.externalLink = suggestion.externalLink;
573
- this.onModelChange(suggestion);
574
- this.searchText = suggestion.label;
575
- this.activeSuggestionIndex = (this.searchResults || this.suggestions).indexOf(suggestion);
576
- }
577
- this.dismissDropdown();
578
- // if (this.isPolymorphic) {
579
- // this.searchResourceType = this.metaReference.find((rt)=> {
580
- // return rt.name === suggestion.type;
581
- // });
582
- // }
583
- }
584
- showDropdown() {
585
- this.dropdownVisible = true;
586
- this.dropdown.classList.add('Vlt-dropdown--expanded');
587
- if (!this.keyListenerActive) {
588
- this.input.addEventListener('keydown', this.keydown);
589
- setTimeout(() => {
590
- document.addEventListener('click', this.clickout);
591
- }, 200);
592
- this.keyListenerActive = true;
593
- }
594
- if (typeof (this.activeSuggestionIndex) === 'undefined') {
595
- if (this.model && (this.searchResults || this.suggestions)) {
596
- for (let suggestionIndex = 0; suggestionIndex < (this.searchResults || this.suggestions).length; suggestionIndex++) {
597
- const item = (this.searchResults || this.suggestions)[suggestionIndex];
598
- if (this.model.id === item.id && this.model.type === item.type) {
599
- this.activeSuggestionIndex = suggestionIndex;
600
- break;
601
- }
602
- }
603
- }
604
- }
605
- this.ensureDropdownIsVisible();
606
- }
607
- dismissDropdown(event) {
608
- this.dropdownVisible = false;
609
- if (event) {
610
- this.focus();
611
- }
612
- if (this.dropdown) {
613
- this.dropdown.classList.remove('Vlt-dropdown--expanded');
614
- }
615
- }
616
- clear() {
617
- this.prevModel = this.model;
618
- delete this.searchText;
619
- delete this.searchResults;
620
- delete this.model;
621
- delete this.activeSuggestionIndex;
622
- this.onModelChange(this.model);
623
- this.onSearchTextChanged(this.searchText);
624
- this.focus();
625
- }
626
- revert() {
627
- this.model = this.prevModel;
628
- delete this.prevModel;
629
- this.onModelChange(this.model);
630
- this.focus();
631
- }
632
- remove(ev, item) {
633
- ev.preventDefault();
634
- ev.stopPropagation();
635
- const optionIndex = this.model.indexOf(item);
636
- if (optionIndex !== -1) {
637
- this.model.splice(optionIndex, 1);
638
- if (!this.model.length) {
639
- delete this.model;
640
- delete this.value;
641
- }
642
- this.onModelChange(this.model);
643
- }
644
- }
645
- openResource(model) {
646
- this.keyListenerActive = true; // suppress dropdown in this case
647
- setTimeout(() => {
648
- this.dismissDropdown();
649
- });
650
- const refDialogComponent = this.viewContainerRef.createComponent(MetaRefDialog);
651
- this.metaTracker.emit(this.buildTrackEvent(model ? 'EDIT' : 'NEW'));
652
- let theme = this.elementRef.nativeElement.dataset.theme;
653
- if (!theme || theme === 'inherit') {
654
- let parentComponent = this.elementRef.nativeElement.closest('vgip-meta-layout');
655
- if (parentComponent) {
656
- theme = parentComponent.dataset.theme;
657
- }
658
- if (!theme || theme === 'inherit') {
659
- parentComponent = this.elementRef.nativeElement.closest('vgip-meta-resource');
660
- if (parentComponent) {
661
- theme = parentComponent.dataset.theme;
662
- }
663
- }
664
- }
665
- this.referenceService.openDialog(refDialogComponent, this.metaResource, this.integrationCode, (this.metaReference instanceof Array) ? this.metaReference.filter(rt => rt.hidden !== true) : this.metaReference, model, null, this.searchResourceType.resourceType, theme).subscribe((result) => {
666
- if (result) {
667
- this.parent[this.meta.name] = result;
668
- this.onChange.emit(result);
669
- const existingSuggestion = (this.meta.suggestions || []).find((s) => (s.id === result.id && s.type === result.type));
670
- if (existingSuggestion) {
671
- existingSuggestion.label = result.label;
672
- }
673
- else {
674
- if (!this.meta.suggestions) {
675
- this.meta.suggestions = [];
676
- }
677
- this.meta.suggestions.unshift(result);
678
- }
679
- this.metaTracker.emit(this.buildTrackEvent(model ? 'UPDATE' : 'CREATE', result.type || result.resourceType));
680
- }
681
- else {
682
- this.metaTracker.emit(this.buildTrackEvent(model ? 'CANCEL_EDIT' : 'CANCEL_UPDATE'));
683
- }
684
- });
685
- }
686
- ensureDropdownIsVisible() {
687
- setTimeout(() => {
688
- const holder = this.dropdown.closest('.Vlt-card__content');
689
- if (holder) {
690
- const el = this.elementRef.nativeElement.querySelector('.Vlt-dropdown__panel');
691
- const elRect = el.getBoundingClientRect();
692
- const holderRect = holder.getBoundingClientRect();
693
- if (holderRect.top + holderRect.height < elRect.top + elRect.height) {
694
- el.scrollIntoView({ block: 'end' });
695
- }
696
- }
697
- }, 400);
698
- }
699
- ensureDropdownOptionIsVisible() {
700
- if (!this.dropdownScrollContainer) {
701
- this.dropdownScrollContainer = this.dropdown.querySelector('.Vlt-dropdown__scroll');
702
- }
703
- if (this.dropdownScrollContainer && typeof (this.activeSuggestionIndex) === 'number') {
704
- const scrollTop = 44 * this.activeSuggestionIndex;
705
- const scrollBottom = 44 * (this.activeSuggestionIndex - 7);
706
- if (scrollTop < this.dropdownScrollContainer.scrollTop) {
707
- this.dropdownScrollContainer.scrollTop = scrollTop;
708
- }
709
- else if (scrollBottom > this.dropdownScrollContainer.scrollTop) {
710
- this.dropdownScrollContainer.scrollTop = scrollBottom;
711
- }
712
- }
713
- }
714
- buildTrackEvent(action, value) {
715
- const e = {
716
- integration: this.integrationCode,
717
- resource: this.model ? (this.model.type || this.model.resourceType) : this.searchResourceType.resourceType,
718
- field: this.meta.name,
719
- action
720
- };
721
- if (this.meta.$isContactable) {
722
- e.isContactable = true;
723
- }
724
- if (typeof (value) !== 'undefined') {
725
- e.value = value;
726
- }
727
- return e;
728
- }
729
- buildPlaceholderLabel() {
730
- this.placeHolderLabel = this.meta.label;
731
- if (this.multiple && !this.isPolymorphic) {
732
- this.placeHolderLabel = '+Add ';
733
- }
734
- else {
735
- this.placeHolderLabel = (this.isSearchable && (this.multiple || !this.isPolymorphic)) ? 'Search ' : '';
736
- }
737
- this.placeHolderLabel += this.searchResourceType.resourceType ? this.searchResourceType.resourceType : this.searchResourceTypesScope;
738
- }
739
- buildExternalLink() {
740
- if (this.model) {
741
- if (this.model.externalLink) {
742
- this.externalLink = this.model.externalLink;
743
- }
744
- else if (this.metaContext.profiles[this.integrationCode.toUpperCase()]) {
745
- delete this.externalLink;
746
- this.metaMsgService.sendMessage(this.integrationCode.toUpperCase(), {
747
- action: 'buildExternalLink',
748
- integrationCode: this.integrationCode,
749
- ref: this.model,
750
- profile: this.metaContext.profiles[this.integrationCode.toUpperCase()]
751
- }, (response) => {
752
- if (!response.error) {
753
- this.externalLink = response.externalLink;
754
- }
755
- else {
756
- console.warn('No external link support for', this.integrationCode, this.model.resourceType || this.model.type);
757
- }
758
- });
759
- }
760
- }
761
- else {
762
- delete this.externalLink;
763
- }
764
- }
765
- searchAutoSuggestions(params) {
766
- let searchUrl = `/suggestions/${this.meta.name}/search`;
767
- if (this.meta.auto && this.meta.auto.search) {
768
- if (this.meta.auto.search.url) {
769
- searchUrl = this.meta.auto.search.url.replace(/\${\s*([\w\.]+)\s*}/g, (match, key) => {
770
- if (params.hasOwnProperty(key)) {
771
- const val = params[key];
772
- delete params[key];
773
- return val;
774
- }
775
- return '';
776
- });
777
- }
778
- for (const p of Object.keys(params)) {
779
- searchUrl += `${searchUrl.indexOf('?') === -1 ? '?' : '&'}${encodeURIComponent(p)}=${encodeURIComponent(params[p])}`;
780
- }
781
- this.searching = true;
782
- this.resourceService.getByPath(searchUrl).subscribe((result) => {
783
- delete this.searching;
784
- if (result) {
785
- let suggestions;
786
- suggestions = result;
787
- if (this.meta.auto.search.extract) {
788
- suggestions = result[this.meta.auto.search.extract];
789
- }
790
- if (suggestions instanceof Array !== true) {
791
- suggestions = [suggestions];
792
- }
793
- const asyncSuggestions = [];
794
- suggestions.forEach((s) => {
795
- if (s && s.id && s.type) { // TOOD check the type is acceptable
796
- asyncSuggestions.push({
797
- id: s.id,
798
- label: s.label || `${s.type}#${s.id}`,
799
- type: s.type
800
- });
801
- }
802
- });
803
- if (asyncSuggestions.length) {
804
- if (asyncSuggestions.length === 1) {
805
- this.parent[this.meta.name] = asyncSuggestions[0];
806
- }
807
- else {
808
- delete this.asyncSuggestions;
809
- }
810
- }
811
- this.asyncSuggestions = asyncSuggestions;
812
- }
813
- }, (err) => {
814
- delete this.searching;
815
- });
816
- }
817
- }
818
- }
819
- FieldReference.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: FieldReference, deps: [{ token: i1.MetaReferenceService }, { token: i2.MetaResourceService }, { token: i3.MetaMsgService }, { token: i4.MetaContextService }, { token: i5.MetaTrackerService }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
820
- FieldReference.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: FieldReference, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class='vgip-meta-field-preview' *ngIf='preview && model && (!multiple || (multiple && model.length))'>\n <div class='vgip-meta-field-label'>{{meta.label || meta.name}}</div>\n <div *ngIf='!multiple' class='vgip-meta-field-value __gu'>\n <svg class=\"Vlt-icon Vlt-icon--smaller\" style='margin-top: -3px;'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n {{model.label || model.id}} <span class='Vlt-grey'>({{model.type}})</span>\n </div>\n <div *ngIf='multiple' class='vgip-meta-field-value __gu'>\n <span *ngFor='let m of (model || [])' class='Vlt-badge Vlt-badge--app'>\n {{m.label || m.id || m}} <span class='Vlt-grey-dark' *ngIf='isPolymorphic'>({{m.type}})</span>\n </span>\n </div>\n <a [href]='externalLink || model.externalLink' target='_blank' rel='noopener' *ngIf='externalLink && (model && !multiple)' class=\"Vlt-composite__append--icon preview\" aria-label='Open external'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-open\"/></svg>\n </div>\n </a>\n</div>\n<div *ngIf='!preview' class=\"meta-field-reference Vlt-form__element Vlt-form__element--big\" [ngClass]=\"{ 'Vlt-form__element--error': (searchError && keyListenerActive) || (f.invalid && ((f | metaModel)._parent.submitted || (ft | metaModel ).touched)), 'multiple': multiple, 'has-value': model, active: keyListenerActive }\">\n <div *ngIf='multiple' class='items-container' [ngClass]='{ creatable: isCreatable }'>\n <div *ngIf='model' class='badges-container keep-focus' (click)='focus()' style='width: 100%;'>\n <div *ngFor='let item of model' class=\"Vlt-badge Vlt-badge--app Vlt-badge--large keep-focus\" [ngClass]=\"{ grid: (item.label || item.id || '').length > 56}\">\n <span class='Vlt-truncate'>{{item.label || item.id || item }} <span *ngIf='isPolymorphic' class='Vlt-grey-dark' style='font-weight: normal;'>({{item.type}})</span></span>\n <button class=\"Vlt-badge__dismiss keep-focus\" (click)='remove($event, item)' style='position: absolute; right: 12px; top: 8px;' aria-label='Remove'></button>\n </div>\n </div>\n </div>\n <div class=\"Vlt-composite\">\n <div class='dropdown-wrapper Vlt-dropdown' style='width: 100%; position: absolute; top: 48px;'>\n <div class=\"Vlt-dropdown__panel\">\n <div *ngIf='searchError'>\n <div class=\"Vlt-callout Vlt-callout--critical keep-focus\">\n <i></i>\n <div class=\"Vlt-callout__content\">{{searchError}}</div>\n </div>\n </div>\n <div *ngIf='!searchError && (suggestions.length || searchResults)' [ngClass]=\"{ suggestions: !searchResults}\" class=\"Vlt-dropdown__panel__content Vlt-dropdown__panel__content--scroll-area\" style='padding: 0;'>\n <div class=\"Vlt-dropdown__block\"></div>\n <div *ngIf='!searchResults' class=\"Vlt-dropdown__scroll\">\n <div [ngClass]=\"{ 'Vlt-dropdown__link--selected': activeSuggestionIndex === i, smart: suggestion.smart }\" (click)='onSuggestionSelect($event, suggestion)' *ngFor='let suggestion of suggestions; let i = index' class=\"Vlt-dropdown__link has-type\">\n <svg class='Vlt-icon Vlt-icon--small'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n <div class='__gu' [title]='suggestion.label'>{{ suggestion.label }}</div>\n <small class='Vlt-grey-dark' style='text-transform: capitalize;'>{{suggestion.type}}</small>\n </div>\n </div>\n <div *ngIf='searchResults' class=\"Vlt-dropdown__scroll\">\n <div *ngIf='!searchResults.length' class='Vlt-dropdown__block'> No records matching '<b style='pointer-events: none;'>{{searchText}}</b>' were found.</div>\n <div [ngClass]=\"{ 'Vlt-dropdown__link--selected': activeSuggestionIndex === i }\" (click)='onSuggestionSelect($event, suggestion)' *ngFor='let suggestion of searchResults; let i = index' class=\"Vlt-dropdown__link has-type\">\n <svg class='Vlt-icon Vlt-icon--small'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n <div class='__gu' [title]='suggestion.label'>{{ suggestion.label }}</div>\n <small class='Vlt-grey-dark' style='text-transform: capitalize;'>{{suggestion.type}}</small>\n </div>\n </div>\n <!-- <div *ngIf='searchResults' class=\"Vlt-dropdown__block\" style='text-align: right; padding-top: 0;'>\n <small>\n {{ searchResults ? searchResults.length+' results' : 'Suggestions' }} <span style='font-style: italic; font-weight: normal;' *ngIf='searchResults'>~{{ model ? 'last search' : searchText}}</span>\n </small>\n </div> -->\n <div class=\"Vlt-dropdown__block\"></div>\n </div>\n </div>\n </div>\n <div class=\"Vlt-composite__prepend\" *ngIf='isPolymorphic && showTypes && (multiple || !model || (dropdownVisible && ((suggestions || searchResults || []).length || searchResourceType.resourceType)))'>\n <div class=\"search-scope\" [ngClass]=\"{ 'has-value': searchResourceType.resourceType }\">\n <vgip-meta-field class='shown' [meta]='searchResourceTypeMeta' [parent]='searchResourceType' (onChange)='onSearchResourceTypeChanged($event)' (onLeave)='onBlur($event)' [integrationCode]='integrationCode' theme='inherit'></vgip-meta-field>\n <svg class='Vlt-icon Vlt-grey Vlt-icon--smaller visible-mobile mobile-icon' style='position: absolute; top: 15px; left: 14px; pointer-events: none;'>\n <use xlink:href=\"volta/volta-icons.svg#Vlt-icon-menu\"/>\n </svg>\n <label class='mobile-label hidden-mobile hidden-desktop'>Search</label>\n </div>\n </div>\n <div *ngIf='!(isPolymorphic && showTypes && (multiple || !model || dropdownVisible))'><!-- required by css --></div>\n <div class=\"Vlt-composite__wrapper Vlt-input\" style='overflow: hidden;' [ngClass]=\"{ 'has-append-button': hasAppendButton && !disabled }\">\n <label class='wrapper'>\n <div class=\"Vlt-composite__prepend Vlt-composite__prepend--icon\" style='top: 0; padding-top: 15px;'>\n <div class=\"Vlt-composite__icon\">\n <svg *ngIf='isSearchable && (!model || multiple)' class='Vlt-grey'><use attr.xlink:href=\"volta/volta-icons.svg#Vlt-icon-{{ multiple ? 'stack' : 'search'}}\"/></svg>\n <svg *ngIf='!isSearchable || (model && !multiple)' [ngStyle]=\"{fill: integrationIcon === 'Brand-icon-vonage' ? 'var(--vgip-meta-input-color)' : ''}\"><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n </div>\n <div *ngIf='suggestions.length' class=\"Vlt-badge Vlt-badge--small Vlt-badge--purple\" style='padding: 0px 4px; position: absolute; top: 26px; left: 4px; pointer-events: none; min-width: 14px;'>{{suggestions.length}}</div>\n </div>\n <input class='model' type='hidden' [required]='validations.required' [(ngModel)]='model' #f='ngModel' [name]='name' />\n <input class='main' [readonly]='!isSearchable || (model && !multiple)' [ngModel]='searchText' #ft='ngModel' (ngModelChange)='onSearchTextChanged($event)' [ngModelOptions]=\"{standalone: true}\" type=\"text\" placeholder=\"{{ placeHolderLabel || ' ' }}\" [ngClass]='{ ext: externalLink }' (click)='onActivated($event)' (focus)='onActivated($event)' (blur)='onBlur($event)' [disabled]='disabled' [title]=\"model ? model.label : ''\"/>\n <label class='Vlt-truncate hidden-mobile' style='padding-left: 25px; padding-right: 42px;'>{{ (multiple && isPolymorphic) ? '+Add ' : ((model || !isPolymorphic) ? meta.label : ( meta.searchLabel || 'Search')) }}<span *ngIf='validations.required' class='Vlt-red'>*</span>&nbsp;<span style='color: var(--vgip-meta-input-color); text-transform: capitalize;' *ngIf='model'>({{model.type || model.resourceType || model.length}})</span></label>\n <label class='Vlt-truncate hidden-desktop' style='padding-left: 25px; padding-right: 42px;'>{{meta.label || meta.name}}<span *ngIf='validations.required' class='Vlt-red'>*</span>&nbsp;<span style='color: var(--vgip-meta-input-color); text-transform: capitalize;' *ngIf='model'>({{model.type || model.resourceType || model.length}})</span></label>\n </label>\n <div *ngIf='searching' class='search-progress'>\n <div class=\"container\">\n <div class=\"bar Vlt-bg-purple\"></div>\n </div>\n </div>\n <div class='Vlt-composite__append right-actions'>\n <!-- <div *ngIf='prevModel && !model' class=\"Vlt-composite__append--icon\" (click)='revert()'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-reply\"/></svg>\n </div>\n </div> -->\n <div *ngIf='model && !multiple' class=\"Vlt-composite__append--icon\" (click)='removeSelection()'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/></svg>\n </div>\n </div>\n <a [href]='externalLink || model.externalLink' target='_blank' rel='noopener' *ngIf='externalLink && (model && !multiple)' class=\"Vlt-composite__append--icon\" aria-label='Open external'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-open\"/></svg>\n </div>\n </a>\n </div>\n </div>\n <!-- <span *ngIf='hasCreatables'>\n <button type='button' *ngIf='!model || multiple' (click)='openResource()' class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--icon Vlt-btn--large\" style='margin-left: 12px;'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>\n </button>\n <button type='button' *ngIf='model && !multiple' (click)='openResource(model)' class=\"Vlt-btn Vlt-btn--primary Vlt-btn--icon Vlt-btn--large\" style='margin-left: 12px;'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-edit\"/></svg>\n </button>\n </span> -->\n <div *ngIf='hasAppendButton && !disabled' class=\"Vlt-composite__append\">\n <button (focus)='onActivated($event)' (blur)='onBlur($event)' type='button' *ngIf='!model || multiple' (click)='openResource()' class=\"Vlt-btn Vlt-btn--white Vlt-btn--icon\" aria-label='Add new'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>\n </button>\n <button (focus)='onActivated($event)' (blur)='onBlur($event)' type='button' *ngIf='model && !multiple' (click)='openResource(model)' class=\"Vlt-btn Vlt-btn--white Vlt-btn--icon\" aria-label='Edit'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-edit\"/></svg>\n </button>\n </div>\n </div>\n <small *ngIf='f.invalid && ((f | metaModel)._parent.submitted || ((ft | metaModel).touched && keyListenerActive))' class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required</span>\n <span *ngIf=\"f.errors.pattern\">Should match '{{validations.pattern}}' pattern</span>\n <span *ngIf=\"f.errors.custom\">{{f.errors.custom}}&nbsp;</span>\n </small>\n <small *ngIf='meta.helpText || meta.hint' class=\"Vlt-form__element__hint\">{{meta.helpText || meta.hint}}</small>\n</div>\n", styles: [".Vlt-form__element--big .Vlt-input input:placeholder-shown:not(:focus)~label.Vlt-truncate{font-size:1.6rem;margin-top:-.8rem;top:50%}.Vlt-form__element--big ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-right:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.Vlt-form__element--big:hover .items-container,.Vlt-form__element--big:hover .main,.Vlt-form__element--big:hover .Vlt-composite__append button,.Vlt-form__element--big:hover ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone,.Vlt-form__element--big.active .items-container,.Vlt-form__element--big.active .main,.Vlt-form__element--big.active .Vlt-composite__append button,.Vlt-form__element--big.active ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.Vlt-form__element--error .items-container,.Vlt-form__element--big.Vlt-form__element--error .main,.Vlt-form__element--big.Vlt-form__element--error .Vlt-composite__append button,.Vlt-form__element--big.Vlt-form__element--error ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:#f25a6b}.Vlt-form__element--big.multiple .Vlt-composite.Vlt-dropdown{margin-top:3px}.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .items-container,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .main,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .Vlt-composite__append button,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .items-container,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .main,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .Vlt-composite__append button,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.multiple .items-container{background-color:var(--vgip-meta-input-bg-color);border:1px solid var(--vgip-meta-input-border-color);border-bottom:0;border-top-left-radius:6px;border-top-right-radius:6px}.Vlt-form__element--big.multiple .items-container .badges-container{overflow:auto;padding:6px 4px 3px 6px}.Vlt-form__element--big.multiple .items-container .badges-container .Vlt-badge{margin-bottom:3px;margin-left:0;margin-right:3px;overflow:hidden;max-width:100%;position:relative;padding-right:30px}.Vlt-form__element--big.multiple .items-container .badges-container .Vlt-badge.grid{display:grid}.Vlt-form__element--big.multiple:not(.has-value) .items-container{border:0}.Vlt-form__element--big.multiple.has-value .main,.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button,.Vlt-form__element--big.multiple.has-value ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-top-left-radius:0;border-top-right-radius:0;height:48px}.Vlt-form__element--big.multiple.has-value .main:not(.Vlt-btn--icon),.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button:not(.Vlt-btn--icon),.Vlt-form__element--big.multiple.has-value ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone:not(.Vlt-btn--icon){border-top:0}.Vlt-form__element--big.multiple.has-value .Vlt-composite__prepend ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-top-right-radius:6px}.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button{border-top-left-radius:6px;border-top:0}.Vlt-composite__prepend{z-index:initial}.Vlt-composite__prepend--icon{top:0;padding-top:15px;left:3px}.Vlt-input.has-append-button .Vlt-composite__append.right-actions{right:0}.Vlt-input.has-append-button .Vlt-composite__append.right-actions .Vlt-composite__append--icon:last-child{width:36px}.Vlt-composite__append.right-actions{position:absolute;top:5px;right:5px;cursor:pointer}.Vlt-composite__append.right-actions .Vlt-composite__append--icon{outline:none;position:initial;display:inline-block}.Vlt-composite__append.right-actions .Vlt-composite__append--icon svg{height:14px;width:14px}.Vlt-composite__append.right-actions .Vlt-composite__append--icon:hover svg,.Vlt-composite__append.right-actions .Vlt-composite__append--icon:focus svg{fill:var(--vgip-meta-input-accent-color)}.Vlt-composite__append--icon.preview{bottom:initial;padding:0 2px}.Vlt-composite__append button{height:48px;padding-right:16px;background:var(--vgip-meta-input-bg-color);border-color:var(--vgip-meta-input-border-color);padding-left:16px;border-left:0}.Vlt-composite__append button:hover{background:var(--vgip-meta-input-action-hover-bg-color)}.Vlt-composite__append button svg{margin:-2px 0 0;fill:var(--vgip-meta-input-accent-color)}.Vlt-input input{padding-left:38px;text-overflow:ellipsis;padding-right:36px}.Vlt-input input.ext{padding-right:72px}.Vlt-composite__wrapper.has-append-button input.main{border-top-right-radius:0;border-bottom-right-radius:0;border-right:0}.Vlt-input input{background:var(--vgip-meta-input-bg-color);border-color:var(--vgip-meta-input-border-color);font-weight:700}.Vlt-dropdown__panel{max-width:100%;width:100%;min-width:280px}.Vlt-dropdown__panel .Vlt-dropdown__link.smart{font-weight:700;background:var(--vgip-meta-dropdown-bg-color)}.Vlt-dropdown__panel .Vlt-dropdown__link.smart.hidden{display:none}.Vlt-dropdown__panel .Vlt-dropdown__link.bold:after{background-color:#e1e2e6;content:\"\";height:1px;left:0;position:absolute;right:0;bottom:0}.Vlt-dropdown__panel .Vlt-dropdown__link--selected{background:rgba(44,45,48,.05)}.Vlt-dropdown__panel .Vlt-dropdown__link>div{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.Vlt-dropdown__panel .Vlt-dropdown__link>svg{margin-right:8px}.vgip-meta-field-preview .Vlt-badge{margin:1px 3px 1px 0;overflow:hidden;max-width:100%}:host .search-scope{width:130px}:host .search-scope ::ng-deep .Vlt-form__element.has-value .Vlt-select:after{display:none}:host .search-scope ::ng-deep .Vlt-form__element .right-actions{right:12px}:host .search-scope ::ng-deep .Vlt-form__element label.Vlt-truncate{padding-right:48px}:host .search-scope .mobile-icon{display:none}@media only screen and (max-width: 575px){:host .search-scope{width:60px}:host .search-scope:not(.has-value) .mobile-icon{display:block}:host .search-scope.has-value .mobile-label{display:block}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big .Vlt-composite__append{display:none}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big .Vlt-select:after{margin-right:-7px}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big label.Vlt-truncate{visibility:hidden}}:host .search-scope ::ng-deep vgip-meta-field .Vlt-input input.main.standalone{padding-right:initial;background:var(--vgip-meta-input-accent-bg-color);border-color:var(--vgip-meta-input-border-color)}:host .search-scope ::ng-deep vgip-meta-field .Vlt-form__element{padding:0}:host .search-scope ::ng-deep vgip-meta-field .Vlt-form__element .Vlt-dropdown__panel{width:initial}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.MetaField, selector: "vgip-meta-field", inputs: ["meta", "parent", "integrationCode", "resourceType", "index", "scope", "preview", "theme"], outputs: ["onChange", "onLeave"] }, { kind: "pipe", type: i9.MetaModelPipe, name: "metaModel" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] });
821
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: FieldReference, decorators: [{
822
- type: Component,
823
- args: [{ viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div class='vgip-meta-field-preview' *ngIf='preview && model && (!multiple || (multiple && model.length))'>\n <div class='vgip-meta-field-label'>{{meta.label || meta.name}}</div>\n <div *ngIf='!multiple' class='vgip-meta-field-value __gu'>\n <svg class=\"Vlt-icon Vlt-icon--smaller\" style='margin-top: -3px;'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n {{model.label || model.id}} <span class='Vlt-grey'>({{model.type}})</span>\n </div>\n <div *ngIf='multiple' class='vgip-meta-field-value __gu'>\n <span *ngFor='let m of (model || [])' class='Vlt-badge Vlt-badge--app'>\n {{m.label || m.id || m}} <span class='Vlt-grey-dark' *ngIf='isPolymorphic'>({{m.type}})</span>\n </span>\n </div>\n <a [href]='externalLink || model.externalLink' target='_blank' rel='noopener' *ngIf='externalLink && (model && !multiple)' class=\"Vlt-composite__append--icon preview\" aria-label='Open external'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-open\"/></svg>\n </div>\n </a>\n</div>\n<div *ngIf='!preview' class=\"meta-field-reference Vlt-form__element Vlt-form__element--big\" [ngClass]=\"{ 'Vlt-form__element--error': (searchError && keyListenerActive) || (f.invalid && ((f | metaModel)._parent.submitted || (ft | metaModel ).touched)), 'multiple': multiple, 'has-value': model, active: keyListenerActive }\">\n <div *ngIf='multiple' class='items-container' [ngClass]='{ creatable: isCreatable }'>\n <div *ngIf='model' class='badges-container keep-focus' (click)='focus()' style='width: 100%;'>\n <div *ngFor='let item of model' class=\"Vlt-badge Vlt-badge--app Vlt-badge--large keep-focus\" [ngClass]=\"{ grid: (item.label || item.id || '').length > 56}\">\n <span class='Vlt-truncate'>{{item.label || item.id || item }} <span *ngIf='isPolymorphic' class='Vlt-grey-dark' style='font-weight: normal;'>({{item.type}})</span></span>\n <button class=\"Vlt-badge__dismiss keep-focus\" (click)='remove($event, item)' style='position: absolute; right: 12px; top: 8px;' aria-label='Remove'></button>\n </div>\n </div>\n </div>\n <div class=\"Vlt-composite\">\n <div class='dropdown-wrapper Vlt-dropdown' style='width: 100%; position: absolute; top: 48px;'>\n <div class=\"Vlt-dropdown__panel\">\n <div *ngIf='searchError'>\n <div class=\"Vlt-callout Vlt-callout--critical keep-focus\">\n <i></i>\n <div class=\"Vlt-callout__content\">{{searchError}}</div>\n </div>\n </div>\n <div *ngIf='!searchError && (suggestions.length || searchResults)' [ngClass]=\"{ suggestions: !searchResults}\" class=\"Vlt-dropdown__panel__content Vlt-dropdown__panel__content--scroll-area\" style='padding: 0;'>\n <div class=\"Vlt-dropdown__block\"></div>\n <div *ngIf='!searchResults' class=\"Vlt-dropdown__scroll\">\n <div [ngClass]=\"{ 'Vlt-dropdown__link--selected': activeSuggestionIndex === i, smart: suggestion.smart }\" (click)='onSuggestionSelect($event, suggestion)' *ngFor='let suggestion of suggestions; let i = index' class=\"Vlt-dropdown__link has-type\">\n <svg class='Vlt-icon Vlt-icon--small'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n <div class='__gu' [title]='suggestion.label'>{{ suggestion.label }}</div>\n <small class='Vlt-grey-dark' style='text-transform: capitalize;'>{{suggestion.type}}</small>\n </div>\n </div>\n <div *ngIf='searchResults' class=\"Vlt-dropdown__scroll\">\n <div *ngIf='!searchResults.length' class='Vlt-dropdown__block'> No records matching '<b style='pointer-events: none;'>{{searchText}}</b>' were found.</div>\n <div [ngClass]=\"{ 'Vlt-dropdown__link--selected': activeSuggestionIndex === i }\" (click)='onSuggestionSelect($event, suggestion)' *ngFor='let suggestion of searchResults; let i = index' class=\"Vlt-dropdown__link has-type\">\n <svg class='Vlt-icon Vlt-icon--small'><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n <div class='__gu' [title]='suggestion.label'>{{ suggestion.label }}</div>\n <small class='Vlt-grey-dark' style='text-transform: capitalize;'>{{suggestion.type}}</small>\n </div>\n </div>\n <!-- <div *ngIf='searchResults' class=\"Vlt-dropdown__block\" style='text-align: right; padding-top: 0;'>\n <small>\n {{ searchResults ? searchResults.length+' results' : 'Suggestions' }} <span style='font-style: italic; font-weight: normal;' *ngIf='searchResults'>~{{ model ? 'last search' : searchText}}</span>\n </small>\n </div> -->\n <div class=\"Vlt-dropdown__block\"></div>\n </div>\n </div>\n </div>\n <div class=\"Vlt-composite__prepend\" *ngIf='isPolymorphic && showTypes && (multiple || !model || (dropdownVisible && ((suggestions || searchResults || []).length || searchResourceType.resourceType)))'>\n <div class=\"search-scope\" [ngClass]=\"{ 'has-value': searchResourceType.resourceType }\">\n <vgip-meta-field class='shown' [meta]='searchResourceTypeMeta' [parent]='searchResourceType' (onChange)='onSearchResourceTypeChanged($event)' (onLeave)='onBlur($event)' [integrationCode]='integrationCode' theme='inherit'></vgip-meta-field>\n <svg class='Vlt-icon Vlt-grey Vlt-icon--smaller visible-mobile mobile-icon' style='position: absolute; top: 15px; left: 14px; pointer-events: none;'>\n <use xlink:href=\"volta/volta-icons.svg#Vlt-icon-menu\"/>\n </svg>\n <label class='mobile-label hidden-mobile hidden-desktop'>Search</label>\n </div>\n </div>\n <div *ngIf='!(isPolymorphic && showTypes && (multiple || !model || dropdownVisible))'><!-- required by css --></div>\n <div class=\"Vlt-composite__wrapper Vlt-input\" style='overflow: hidden;' [ngClass]=\"{ 'has-append-button': hasAppendButton && !disabled }\">\n <label class='wrapper'>\n <div class=\"Vlt-composite__prepend Vlt-composite__prepend--icon\" style='top: 0; padding-top: 15px;'>\n <div class=\"Vlt-composite__icon\">\n <svg *ngIf='isSearchable && (!model || multiple)' class='Vlt-grey'><use attr.xlink:href=\"volta/volta-icons.svg#Vlt-icon-{{ multiple ? 'stack' : 'search'}}\"/></svg>\n <svg *ngIf='!isSearchable || (model && !multiple)' [ngStyle]=\"{fill: integrationIcon === 'Brand-icon-vonage' ? 'var(--vgip-meta-input-color)' : ''}\"><use attr.xlink:href=\"volta/volta-brand-icons.svg#{{integrationIcon}}\"/></svg>\n </div>\n <div *ngIf='suggestions.length' class=\"Vlt-badge Vlt-badge--small Vlt-badge--purple\" style='padding: 0px 4px; position: absolute; top: 26px; left: 4px; pointer-events: none; min-width: 14px;'>{{suggestions.length}}</div>\n </div>\n <input class='model' type='hidden' [required]='validations.required' [(ngModel)]='model' #f='ngModel' [name]='name' />\n <input class='main' [readonly]='!isSearchable || (model && !multiple)' [ngModel]='searchText' #ft='ngModel' (ngModelChange)='onSearchTextChanged($event)' [ngModelOptions]=\"{standalone: true}\" type=\"text\" placeholder=\"{{ placeHolderLabel || ' ' }}\" [ngClass]='{ ext: externalLink }' (click)='onActivated($event)' (focus)='onActivated($event)' (blur)='onBlur($event)' [disabled]='disabled' [title]=\"model ? model.label : ''\"/>\n <label class='Vlt-truncate hidden-mobile' style='padding-left: 25px; padding-right: 42px;'>{{ (multiple && isPolymorphic) ? '+Add ' : ((model || !isPolymorphic) ? meta.label : ( meta.searchLabel || 'Search')) }}<span *ngIf='validations.required' class='Vlt-red'>*</span>&nbsp;<span style='color: var(--vgip-meta-input-color); text-transform: capitalize;' *ngIf='model'>({{model.type || model.resourceType || model.length}})</span></label>\n <label class='Vlt-truncate hidden-desktop' style='padding-left: 25px; padding-right: 42px;'>{{meta.label || meta.name}}<span *ngIf='validations.required' class='Vlt-red'>*</span>&nbsp;<span style='color: var(--vgip-meta-input-color); text-transform: capitalize;' *ngIf='model'>({{model.type || model.resourceType || model.length}})</span></label>\n </label>\n <div *ngIf='searching' class='search-progress'>\n <div class=\"container\">\n <div class=\"bar Vlt-bg-purple\"></div>\n </div>\n </div>\n <div class='Vlt-composite__append right-actions'>\n <!-- <div *ngIf='prevModel && !model' class=\"Vlt-composite__append--icon\" (click)='revert()'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-reply\"/></svg>\n </div>\n </div> -->\n <div *ngIf='model && !multiple' class=\"Vlt-composite__append--icon\" (click)='removeSelection()'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-cross\"/></svg>\n </div>\n </div>\n <a [href]='externalLink || model.externalLink' target='_blank' rel='noopener' *ngIf='externalLink && (model && !multiple)' class=\"Vlt-composite__append--icon\" aria-label='Open external'>\n <div class=\"Vlt-composite__icon\">\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-open\"/></svg>\n </div>\n </a>\n </div>\n </div>\n <!-- <span *ngIf='hasCreatables'>\n <button type='button' *ngIf='!model || multiple' (click)='openResource()' class=\"Vlt-btn Vlt-btn--secondary Vlt-btn--icon Vlt-btn--large\" style='margin-left: 12px;'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>\n </button>\n <button type='button' *ngIf='model && !multiple' (click)='openResource(model)' class=\"Vlt-btn Vlt-btn--primary Vlt-btn--icon Vlt-btn--large\" style='margin-left: 12px;'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-edit\"/></svg>\n </button>\n </span> -->\n <div *ngIf='hasAppendButton && !disabled' class=\"Vlt-composite__append\">\n <button (focus)='onActivated($event)' (blur)='onBlur($event)' type='button' *ngIf='!model || multiple' (click)='openResource()' class=\"Vlt-btn Vlt-btn--white Vlt-btn--icon\" aria-label='Add new'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-plus\"/></svg>\n </button>\n <button (focus)='onActivated($event)' (blur)='onBlur($event)' type='button' *ngIf='model && !multiple' (click)='openResource(model)' class=\"Vlt-btn Vlt-btn--white Vlt-btn--icon\" aria-label='Edit'>\n <svg><use xlink:href=\"volta/volta-icons.svg#Vlt-icon-edit\"/></svg>\n </button>\n </div>\n </div>\n <small *ngIf='f.invalid && ((f | metaModel)._parent.submitted || ((ft | metaModel).touched && keyListenerActive))' class=\"Vlt-form__element__error\">\n <span *ngIf=\"f.errors.required\">Required</span>\n <span *ngIf=\"f.errors.pattern\">Should match '{{validations.pattern}}' pattern</span>\n <span *ngIf=\"f.errors.custom\">{{f.errors.custom}}&nbsp;</span>\n </small>\n <small *ngIf='meta.helpText || meta.hint' class=\"Vlt-form__element__hint\">{{meta.helpText || meta.hint}}</small>\n</div>\n", styles: [".Vlt-form__element--big .Vlt-input input:placeholder-shown:not(:focus)~label.Vlt-truncate{font-size:1.6rem;margin-top:-.8rem;top:50%}.Vlt-form__element--big ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-right:0;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.Vlt-form__element--big:hover .items-container,.Vlt-form__element--big:hover .main,.Vlt-form__element--big:hover .Vlt-composite__append button,.Vlt-form__element--big:hover ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone,.Vlt-form__element--big.active .items-container,.Vlt-form__element--big.active .main,.Vlt-form__element--big.active .Vlt-composite__append button,.Vlt-form__element--big.active ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.Vlt-form__element--error .items-container,.Vlt-form__element--big.Vlt-form__element--error .main,.Vlt-form__element--big.Vlt-form__element--error .Vlt-composite__append button,.Vlt-form__element--big.Vlt-form__element--error ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:#f25a6b}.Vlt-form__element--big.multiple .Vlt-composite.Vlt-dropdown{margin-top:3px}.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .items-container,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .main,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) .Vlt-composite__append button,.Vlt-form__element--big.multiple:hover:not(.Vlt-form__element--error) ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .items-container,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .main,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) .Vlt-composite__append button,.Vlt-form__element--big.multiple.active:not(.Vlt-form__element--error) ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-color:var(--vgip-meta-input-active-border-color)}.Vlt-form__element--big.multiple .items-container{background-color:var(--vgip-meta-input-bg-color);border:1px solid var(--vgip-meta-input-border-color);border-bottom:0;border-top-left-radius:6px;border-top-right-radius:6px}.Vlt-form__element--big.multiple .items-container .badges-container{overflow:auto;padding:6px 4px 3px 6px}.Vlt-form__element--big.multiple .items-container .badges-container .Vlt-badge{margin-bottom:3px;margin-left:0;margin-right:3px;overflow:hidden;max-width:100%;position:relative;padding-right:30px}.Vlt-form__element--big.multiple .items-container .badges-container .Vlt-badge.grid{display:grid}.Vlt-form__element--big.multiple:not(.has-value) .items-container{border:0}.Vlt-form__element--big.multiple.has-value .main,.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button,.Vlt-form__element--big.multiple.has-value ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-top-left-radius:0;border-top-right-radius:0;height:48px}.Vlt-form__element--big.multiple.has-value .main:not(.Vlt-btn--icon),.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button:not(.Vlt-btn--icon),.Vlt-form__element--big.multiple.has-value ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone:not(.Vlt-btn--icon){border-top:0}.Vlt-form__element--big.multiple.has-value .Vlt-composite__prepend ::ng-deep .search-scope vgip-meta-field .Vlt-input input.main.standalone{border-top-right-radius:6px}.Vlt-form__element--big.multiple.has-value .Vlt-composite__append button{border-top-left-radius:6px;border-top:0}.Vlt-composite__prepend{z-index:initial}.Vlt-composite__prepend--icon{top:0;padding-top:15px;left:3px}.Vlt-input.has-append-button .Vlt-composite__append.right-actions{right:0}.Vlt-input.has-append-button .Vlt-composite__append.right-actions .Vlt-composite__append--icon:last-child{width:36px}.Vlt-composite__append.right-actions{position:absolute;top:5px;right:5px;cursor:pointer}.Vlt-composite__append.right-actions .Vlt-composite__append--icon{outline:none;position:initial;display:inline-block}.Vlt-composite__append.right-actions .Vlt-composite__append--icon svg{height:14px;width:14px}.Vlt-composite__append.right-actions .Vlt-composite__append--icon:hover svg,.Vlt-composite__append.right-actions .Vlt-composite__append--icon:focus svg{fill:var(--vgip-meta-input-accent-color)}.Vlt-composite__append--icon.preview{bottom:initial;padding:0 2px}.Vlt-composite__append button{height:48px;padding-right:16px;background:var(--vgip-meta-input-bg-color);border-color:var(--vgip-meta-input-border-color);padding-left:16px;border-left:0}.Vlt-composite__append button:hover{background:var(--vgip-meta-input-action-hover-bg-color)}.Vlt-composite__append button svg{margin:-2px 0 0;fill:var(--vgip-meta-input-accent-color)}.Vlt-input input{padding-left:38px;text-overflow:ellipsis;padding-right:36px}.Vlt-input input.ext{padding-right:72px}.Vlt-composite__wrapper.has-append-button input.main{border-top-right-radius:0;border-bottom-right-radius:0;border-right:0}.Vlt-input input{background:var(--vgip-meta-input-bg-color);border-color:var(--vgip-meta-input-border-color);font-weight:700}.Vlt-dropdown__panel{max-width:100%;width:100%;min-width:280px}.Vlt-dropdown__panel .Vlt-dropdown__link.smart{font-weight:700;background:var(--vgip-meta-dropdown-bg-color)}.Vlt-dropdown__panel .Vlt-dropdown__link.smart.hidden{display:none}.Vlt-dropdown__panel .Vlt-dropdown__link.bold:after{background-color:#e1e2e6;content:\"\";height:1px;left:0;position:absolute;right:0;bottom:0}.Vlt-dropdown__panel .Vlt-dropdown__link--selected{background:rgba(44,45,48,.05)}.Vlt-dropdown__panel .Vlt-dropdown__link>div{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.Vlt-dropdown__panel .Vlt-dropdown__link>svg{margin-right:8px}.vgip-meta-field-preview .Vlt-badge{margin:1px 3px 1px 0;overflow:hidden;max-width:100%}:host .search-scope{width:130px}:host .search-scope ::ng-deep .Vlt-form__element.has-value .Vlt-select:after{display:none}:host .search-scope ::ng-deep .Vlt-form__element .right-actions{right:12px}:host .search-scope ::ng-deep .Vlt-form__element label.Vlt-truncate{padding-right:48px}:host .search-scope .mobile-icon{display:none}@media only screen and (max-width: 575px){:host .search-scope{width:60px}:host .search-scope:not(.has-value) .mobile-icon{display:block}:host .search-scope.has-value .mobile-label{display:block}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big .Vlt-composite__append{display:none}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big .Vlt-select:after{margin-right:-7px}:host .search-scope ::ng-deep .Vlt-form__element.Vlt-form__element--big label.Vlt-truncate{visibility:hidden}}:host .search-scope ::ng-deep vgip-meta-field .Vlt-input input.main.standalone{padding-right:initial;background:var(--vgip-meta-input-accent-bg-color);border-color:var(--vgip-meta-input-border-color)}:host .search-scope ::ng-deep vgip-meta-field .Vlt-form__element{padding:0}:host .search-scope ::ng-deep vgip-meta-field .Vlt-form__element .Vlt-dropdown__panel{width:initial}\n"] }]
824
- }], ctorParameters: function () { return [{ type: i1.MetaReferenceService }, { type: i2.MetaResourceService }, { type: i3.MetaMsgService }, { type: i4.MetaContextService }, { type: i5.MetaTrackerService }, { type: i0.ViewContainerRef }]; } });
825
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhLXVpL3NyYy9saWIvZmllbGRSZWZlcmVuY2UvaW5kZXgudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZXRhLXVpL3NyYy9saWIvZmllbGRSZWZlcmVuY2Uvdmlldy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7Ozs7QUFVN0MsTUFBTSxPQUFPLGNBQWUsU0FBUSxhQUFhO0lBZ0MvQyxZQUNVLGdCQUFzQyxFQUN0QyxZQUFpQyxFQUNqQyxjQUE4QixFQUM5QixXQUErQixFQUMvQixXQUErQixFQUMvQixnQkFBa0M7UUFFMUMsS0FBSyxFQUFFLENBQUM7UUFQQSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXNCO1FBQ3RDLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUNqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQy9CLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBakM1Qyx1QkFBa0IsR0FBUSxFQUFFLENBQUM7UUFNN0Isc0JBQWlCLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7UUFDM0QsZ0JBQVcsR0FBRyxLQUFLLENB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Q0FBQzt5QkFDOUI7cUJBQ0Y7b0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO2lCQUMxQztZQUNILENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNULE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7MkdBdjBCVSxjQUFjOytGQUFkLGNBQWMsMkVDakIzQixnaldBb0lBLGltUkRySGlCLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDOzJGQUV4RCxjQUFjO2tCQUwxQixTQUFTO29DQUdPLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpZWxkQWJzdHJhY3QgfSBmcm9tICcuLi9maWVsZEFic3RyYWN0JztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1ldGFSZWZlcmVuY2VTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbWV0YVJlZmVyZW5jZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWV0YVJlc291cmNlU2VydmljZSwgSU1ldGFSZXNvdXJjZUNvbmZpZyB9IGZyb20gJy4uL3NlcnZpY2VzL21ldGFSZXNvdXJjZSc7XG5pbXBvcnQgeyBNZXRhUmVmRGlhbG9nIH0gZnJvbSAnLi4vcmVmRGlhbG9nJztcbmltcG9ydCB7IE1ldGFNc2dTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbWV0YU1zZyc7XG5pbXBvcnQgeyBNZXRhQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9tZXRhQ29udGV4dCc7XG5pbXBvcnQgeyBJTWV0YVRyYWNrZXJFdmVudCwgTWV0YVRyYWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbWV0YVRyYWNrZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICcuL3ZpZXcuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0eWxlLnNjc3MnXSxcbiAgdmlld1Byb3ZpZGVyczogW3sgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XVxufSlcbmV4cG9ydCBjbGFzcyBGaWVsZFJlZmVyZW5jZSBleHRlbmRzIEZpZWxkQWJzdHJhY3QgaW1wbGVtZW50cyBPbkluaXQge1xuICBpbnB1dDogYW55O1xuICBkcm9wZG93bjogSFRNTEVsZW1lbnQ7XG4gIGRyb3Bkb3duU2Nyb2xsQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgc2VhcmNoaW5nOiBib29sZWFuO1xuICBzZWFyY2hSZXNvdXJjZVR5cGU6IGFueSA9IHt9O1xuICBzZWFyY2hUZXh0OiBzdHJpbmc7XG4gIHNlYXJjaFJlc3VsdHM6IEFycmF5PGFueT47XG4gIHNlYXJjaEVycm9yOiBhbnk7XG4gIGFjdGl2ZVN1Z2dlc3Rpb25JbmRleDogbnVtYmVyO1xuICBzZWFyY2hSZXNvdXJjZVR5cGVzU2NvcGU6IHN0cmluZztcbiAgc2VhcmNoVGV4dENoYW5nZWQ6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgaXNDcmVhdGFibGUgPSBmYWxzZTtcbiAgdmFsdWU6IGFueTtcbiAgaXNQb2x5bW9ycGhpYzogYm9vbGVhbjtcbiAgaXNTZWFyY2hhYmxlOiBib29sZWFuO1xuICBtdWx0aXBsZTogYm9vbGVhbjtcbiAgdnI6IE1ldGFSZXNvdXJjZVNlcnZpY2U7XG4gIGV4dGVybmFsTGluazogc3RyaW5nO1xuICBkcm9wZG93blZpc2libGUgPSBmYWxzZTtcbiAgc2VhcmNoUmVzb3VyY2VUeXBlTWV0YTogYW55ID0ge1xuICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgIG5hbWU6ICdyZXNvdXJjZVR5cGUnLFxuICAgIGxhYmVsOiAnVHlwZScsXG4gICAgb3B0aW9uczogW10sIC8vIHsgbGFiZWw6ICctLSBBbGwgdHlwZXMgLS0nIH1dLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbiAgfTtcbiAgZmlsdGVyZWRTdWdnZXN0aW9uczogQXJyYXk8YW55PiA9IFtdO1xuICBwbGFjZUhvbGRlckxhYmVsOiBzdHJpbmc7XG4gIGFzeW5jU3VnZ2VzdGlvbnM6IEFycmF5PGFueT47XG4gIHNtYXJ0U3VnZ2VzdGlvbnM6IEFycmF5PGFueT4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlZmVyZW5jZVNlcnZpY2U6IE1ldGFSZWZlcmVuY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWV0YVJlc291cmNlOiBNZXRhUmVzb3VyY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWV0YU1zZ1NlcnZpY2U6IE1ldGFNc2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWV0YUNvbnRleHQ6IE1ldGFDb250ZXh0U2VydmljZSxcbiAgICBwcml2YXRlIG1ldGFUcmFja2VyOiBNZXRhVHJhY2tlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgY29uc3Qgc3VwZXJEaXNhYmxlZCA9IHRoaXMubG9naWNhbERpc2FibGVkIHx8IHRoaXMudmFsaWRhdGlvbnMuZGlzYWJsZWQgfHwgdGhpcy5tZXRhLmRpc2FibGVkID09PSB0cnVlXG4gICAgICB8fCAodGhpcy5tZXRhLnVwZGF0YWJsZSA9PT0gZmFsc2UgJiYgdGhpcy5pc1BlcnNpc3RlZFBhcmVudCk7XG4gICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGVNZXRhLmRpc2FibGVkID0gc3VwZXJEaXNhYmxlZDtcbiAgICByZXR1cm4gc3VwZXJEaXNhYmxlZDtcbiAgfVxuXG4gIGdldCBzaG93VHlwZXMoKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgKHRoaXMubWV0YS5zaG93VHlwZXMpICE9PSAndW5kZWZpbmVkJykgPyB0aGlzLm1ldGEuc2hvd1R5cGVzIDogdHJ1ZTtcbiAgfVxuXG4gIGdldCBzdWdnZXN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5zbWFydFN1Z2dlc3Rpb25zLmNvbmNhdChcbiAgICAgICF0aGlzLnNlYXJjaFJlc291cmNlVHlwZS5yZXNvdXJjZVR5cGUgP1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAodGhpcy5hc3luY1N1Z2dlc3Rpb25zIHx8IHRoaXMubWV0YS5zdWdnZXN0aW9ucyB8fCBbXSkgOiAodGhpcy5hc3luY1N1Z2dlc3Rpb25zIHx8IHRoaXMubWV0YS5zdWdnZXN0aW9ucyB8fCBbXSkuZmlsdGVyKChzKSA9PiBzLnR5cGUgPT09IHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlLnJlc291cmNlVHlwZSlcbiAgICApO1xuICB9XG5cbiAgZ2V0IGhhc0FwcGVuZEJ1dHRvbigpIHtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgdGhpcy5tb2RlbCkge1xuICAgICAgaWYgKHRoaXMuaXNQb2x5bW9ycGhpYykge1xuICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiB0aGlzLm1ldGFSZWZlcmVuY2UpIHtcbiAgICAgICAgICBpZiAoKHJlZi5uYW1lIHx8IHJlZi5yZXNvdXJjZVR5cGUpID09PSAodGhpcy5tb2RlbC50eXBlIHx8IHRoaXMubW9kZWwucmVzb3VyY2VUeXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlZi51cGRhdGFibGUgfHwgKHJlZi5jcmVhdGFibGUgJiYgcmVmLnVwZGF0YWJsZSAhPT0gZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YVJlZmVyZW5jZS51cGRhdGFibGUgfHwgKHRoaXMubWV0YVJlZmVyZW5jZS5jcmVhdGFibGUgJiYgdGhpcy5tZXRhUmVmZXJlbmNlLnVwZGF0YWJsZSAhPT0gZmFsc2UpOyAvLyBWR0lTLTY5MTFcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMubWV0YVJlZmVyZW5jZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlc1Njb3BlID0gdGhpcy5tZXRhUmVmZXJlbmNlLm1hcChydCA9PiBydC5uYW1lKS5qb2luKCcsJyk7XG4gICAgICAvLyB9LCAwKTtcbiAgICAgIGZvciAoY29uc3QgcnQgb2YgdGhpcy5tZXRhUmVmZXJlbmNlKSB7XG4gICAgICAgIGlmIChydC5oaWRkZW4gIT09IGZhbHNlICYmIHJ0LmNyZWF0YWJsZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGFSZWZlcmVuY2UuY3JlYXRhYmxlO1xuICAgIH1cbiAgfVxuXG4gIGdldCByZXNvdXJjZVNlcnZpY2UoKSB7XG4gICAgaWYgKCF0aGlzLm1ldGFSZXNvdXJjZVNlcnZpY2UpIHtcbiAgICAgIGNvbnN0IG1ldGFSZXNvdXJjZUNvbmZpZzogSU1ldGFSZXNvdXJjZUNvbmZpZyA9IHtcbiAgICAgICAgaW50ZWdyYXRpb25Db2RlOiB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgICAgcmVzb3VyY2VUeXBlOiB0aGlzLnJlc291cmNlVHlwZVxuICAgICAgfTtcbiAgICAgIHRoaXMubWV0YVJlc291cmNlU2VydmljZSA9IHRoaXMubWV0YVJlc291cmNlLm5ldyhtZXRhUmVzb3VyY2VDb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXRhUmVzb3VyY2VTZXJ2aWNlO1xuICB9XG5cbiAgZ2V0IG1ldGFSZWZlcmVuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YS5yZWZlcmVuY2UgfHwge307XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm11bHRpcGxlID0gKHRoaXMubWV0YS50eXBlID09PSAnbXVsdGlyZWZlcmVuY2UnKSB8fCB0aGlzLm1ldGEubXVsdGlwbGU7XG4gICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGVNZXRhLmxhYmVsID0gdGhpcy5tZXRhLmxhYmVsO1xuICAgIGlmICghdGhpcy5tZXRhLnZhbHVlVHlwZSkge1xuICAgICAgLy8gdGhpcy5tZXRhLnZhbHVlVHlwZSA9ICdvYmplY3QnO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMubWV0YSwgJ3ZhbHVlVHlwZScsIHtcbiAgICAgICAgdmFsdWU6ICdvYmplY3QnXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWV0YVJlZmVyZW5jZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICB0aGlzLmlzUG9seW1vcnBoaWMgPSB0cnVlO1xuICAgICAgdGhpcy5pc1NlYXJjaGFibGUgPSB0cnVlO1xuICAgICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGVzU2NvcGUgPSB0aGlzLm1ldGFSZWZlcmVuY2UuZmlsdGVyKHJ0ID0+IHJ0LmhpZGRlbiAhPT0gdHJ1ZSkubWFwKHJ0ID0+IHJ0Lm5hbWUpLmpvaW4oJywnKTtcbiAgICAgIGZvciAoY29uc3QgcnQgb2YgdGhpcy5tZXRhUmVmZXJlbmNlKSB7XG4gICAgICAgIGlmIChydC5jcmVhdGFibGUpIHtcbiAgICAgICAgICB0aGlzLmlzQ3JlYXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICBpZiAodHlwZW9mIChydC5zZWFyY2hhYmxlKSAhPT0gJ3VuZGVmaW5lZCcgJiYgIXJ0LnNlYXJjaGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuaXNTZWFyY2hhYmxlID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLm1ldGFSZWZlcmVuY2UuZm9yRWFjaCgocikgPT4ge1xuICAgICAgICBpZiAoIXIuaGlkZGVuKSB7XG4gICAgICAgICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGVNZXRhLm9wdGlvbnMucHVzaCh7IGlkOiByLm5hbWUsIGxhYmVsOiByLmxhYmVsIHx8IHIubmFtZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNTZWFyY2hhYmxlID0gdHlwZW9mICh0aGlzLm1ldGFSZWZlcmVuY2Uuc2VhcmNoYWJsZSkgPT09ICd1bmRlZmluZWQnIHx8IHRoaXMubWV0YVJlZmVyZW5jZS5zZWFyY2hhYmxlO1xuICAgICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUgPSB0aGlzLm1ldGFSZWZlcmVuY2U7XG4gICAgICB0aGlzLnNlYXJjaFJlc291cmNlVHlwZXNTY29wZSA9IHRoaXMubWV0YVJlZmVyZW5jZS5uYW1lIHx8IHRoaXMubWV0YVJlZmVyZW5jZS5yZXNvdXJjZVR5cGU7XG4gICAgICB0aGlzLmlzQ3JlYXRhYmxlID0gdGhpcy5tZXRhUmVmZXJlbmNlLmNyZWF0YWJsZTtcbiAgICB9XG4gICAgdGhpcy5idWlsZFBsYWNlaG9sZGVyTGFiZWwoKTtcbiAgICB0aGlzLnNlYXJjaFRleHRDaGFuZ2VkLnBpcGUoZGVib3VuY2VUaW1lKDMwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gdmFsdWU7XG4gICAgICB0aGlzLnNlYXJjaCgpO1xuICAgIH0pO1xuICAgIGNvbnN0IG9yaWdWYWx1ZSA9IHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXTtcblxuICAgIC8vIHRoaXMuc3VnZ2VzdGlvbnMgPSB0aGlzLm1ldGEuc3VnZ2VzdGlvbnM7IC8vIFRPRE8gZmlsdGVyIGJ5IGRlZmF1bHQgdHlwZVxuICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzLnN1Z2dlc3Rpb25zJywgdGhpcy5zdWdnZXN0aW9ucyk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5wYXJlbnQsIHRoaXMubWV0YS5uYW1lLCB7XG4gICAgICBzZXQ6ICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMubW9kZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsID0gW107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiAodikgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGlkOiB2LFxuICAgICAgICAgICAgICAgICAgbGFiZWw6IHYsXG4gICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLm1ldGFSZWZlcmVuY2UubmFtZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gbnVsbDsgLy8gcHJvdGVjdCB3aGVuIHZhbHVlIGZyb20gc2VydmVyIGlzIG5vdCBhcnJheVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHtcbiAgICAgICAgICAgICAgaWQ6IHZhbHVlLFxuICAgICAgICAgICAgICBsYWJlbDogdmFsdWUsIC8vIGNvdWxkIGJlIGZvdW5kIHdpdGggZXh0cmEgY2FsbFxuICAgICAgICAgICAgICB0eXBlOiB0aGlzLm1ldGFSZWZlcmVuY2UubmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gdmFsdWUgP1xuICAgICAgICAgICAgKCghdmFsdWUubGFiZWwgfHwgdmFsdWUubGFiZWwgPT09ICcgJykgPyBgTi9BICgke3ZhbHVlLnR5cGV9IyR7dmFsdWUuaWR9KWAgOiB2YWx1ZS5sYWJlbCB8fCB2YWx1ZSkgOlxuICAgICAgICAgICAgJyc7XG4gICAgICAgICAgLy8gaWYgKHRoaXMuaXNQb2x5bW9ycGhpYyAmJiB0aGlzLm1vZGVsKSB7IC8vVE9ETyBzaG93IG9yIG5vdD9cbiAgICAgICAgICAvLyAgIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlID0gdGhpcy5tZXRhUmVmZXJlbmNlLmZpbmQoKHJ0KT0+IHtcbiAgICAgICAgICAvLyAgICAgcmV0dXJuIHJ0Lm5hbWUgPT09IHRoaXMubW9kZWwudHlwZTtcbiAgICAgICAgICAvLyAgIH0pO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vZGVsID0gdmFsdWU7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1vZGVsVG9WYWx1ZSh2YWx1ZSwgdGhpcy5tZXRhLnZhbHVlVHlwZSB8fCAnb2JqZWN0Jyk7XG4gICAgICAgICAgdGhpcy5idWlsZEV4dGVybmFsTGluaygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSAhdGhpcy5tb2RlbCA/IHRoaXMubW9kZWwgOiB0aGlzLm1vZGVsLm1hcCgobSkgPT4gdGhpcy5tb2RlbFRvVmFsdWUobSwgdGhpcy5tZXRhLnZhbHVlVHlwZSB8fCAnb2JqZWN0JykpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWV0YS4kb3B0aW9uYWwgPSB0aGlzLmlzT3B0aW9uYWw7XG4gICAgICB9LFxuICAgICAgZ2V0OiAoKSA9PiB0aGlzLnZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdGhpcy5zZW5kVG9TZXJ2ZXIsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBpZiAob3JpZ1ZhbHVlKSB7XG4gICAgICB0aGlzLnBhcmVudFt0aGlzLm1ldGEubmFtZV0gPSBvcmlnVmFsdWU7XG4gICAgfVxuICAgIGlmICghdGhpcy5tb2RlbCAmJiB0aGlzLmRlZmF1bHQpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5kZWZhdWx0Lmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgZHYgb2YgdGhpcy5kZWZhdWx0KSB7XG4gICAgICAgICAgICBpZiAoKGR2LmlkIHx8IGR2LnZhbHVlKSAmJiBkdi50eXBlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW06IGFueSA9IHtcbiAgICAgICAgICAgICAgICBpZDogZHYuaWQgfHwgZHYudmFsdWUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGR2LmxhYmVsIHx8IGR2LmlkIHx8IGR2LnZhbHVlLFxuICAgICAgICAgICAgICAgIHR5cGU6IGR2LnR5cGVcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgaWYgKGR2LmV4dGVybmFsTGluaykge1xuICAgICAgICAgICAgICAgIGl0ZW0uZXh0ZXJuYWxMaW5rID0gZHYuZXh0ZXJuYWxMaW5rO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHQuaWQgJiYgdGhpcy5kZWZhdWx0LmxhYmVsICYmIHRoaXMuZGVmYXVsdC50eXBlKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVtOiBhbnkgPSB7XG4gICAgICAgICAgICAgIGlkOiB0aGlzLmRlZmF1bHQuaWQgfHwgdGhpcy5kZWZhdWx0LnZhbHVlLFxuICAgICAgICAgICAgICBsYWJlbDogdGhpcy5kZWZhdWx0LmxhYmVsIHx8IHRoaXMuZGVmYXVsdC5pZCB8fCB0aGlzLmRlZmF1bHQudmFsdWUsXG4gICAgICAgICAgICAgIHR5cGU6IHRoaXMuZGVmYXVsdC50eXBlLFxuICAgICAgICAgICAgICBzbWFydDogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHQuZXh0ZXJuYWxMaW5rKSB7XG4gICAgICAgICAgICAgIGl0ZW0uZXh0ZXJuYWxMaW5rID0gdGhpcy5kZWZhdWx0LmV4dGVybmFsTGluaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IGl0ZW07XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCchISFkZWZhdWx0IHZhbHVlIGlzIG5vdCB2YWxpZCBmb3JtYXQnLCB0aGlzLm1ldGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiAodGhpcy5tZXRhLmRpc2FibGVkKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mICh0aGlzLm1ldGEuZGlzYWJsZWQpID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgT2JqZWN0LmtleXModGhpcy5tZXRhLmRpc2FibGVkKSkge1xuICAgICAgICAgIGNvbnN0IHByb3BzID0gcC5zcGxpdCgnLicpO1xuICAgICAgICAgIGlmICh0eXBlb2YgKHRoaXMucGFyZW50W3Byb3BzWzBdXSkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBsZXQgdmFsID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgICAgICAgICAgdmFsID0gdmFsW3Byb3BdO1xuICAgICAgICAgICAgICBpZiAoIXZhbCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsID09PSB0aGlzLm1ldGEuZGlzYWJsZWRbcF0pIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2dpY2FsRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucGFyZW50Q2hhbmdlU3ViamVjdC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUuaGFzT3duUHJvcGVydHkocHJvcHNbMF0pKSB7XG4gICAgICAgICAgICAgIGxldCB2YWwgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICAgICAgICAgICAgdmFsID0gdmFsW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICghdmFsKSB7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gdGhpcy5tZXRhLmRpc2FibGVkW3BdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpY2FsRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5sb2dpY2FsRGlzYWJsZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm1ldGEuYXV0byAmJiB0aGlzLm1ldGEuYXV0by5zZWFyY2gpIHtcbiAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHRoaXMubWV0YS5hdXRvLnNlYXJjaC5wYXJhbXM7XG4gICAgICBpZiAoc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFyIG9mIE9iamVjdC5rZXlzKHNlYXJjaFBhcmFtcykpIHtcbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHNlYXJjaFBhcmFtc1twYXJdLnNwbGl0KCcuJyk7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSBwcm9wc1swXTtcbiAgICAgICAgICBjb25zdCBwcm9wID0gcHJvcHNbMV07XG4gICAgICAgICAgbGV0IHBhclZhbHVlID0gdGhpcy5wYXJlbnRbZmllbGRdO1xuICAgICAgICAgIGlmIChwYXJWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgICAgICAgcGFyVmFsdWUgPSBwYXJWYWx1ZVtwcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJWYWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgICAgcGFyYW1zW3Bhcl0gPSBwYXJWYWx1ZTtcbiAgICAgICAgICAgICAgdGhpcy5zZWFyY2hBdXRvU3VnZ2VzdGlvbnMocGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wYXJlbnRDaGFuZ2VTdWJqZWN0LnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIHtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlW2ZpZWxkXSkge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZVtmaWVsZF0gPSB2YWx1ZVtmaWVsZF1bcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgICAgIHBhcmFtc1twYXJdID0gdmFsdWVbZmllbGRdO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoQXV0b1N1Z2dlc3Rpb25zKHBhcmFtcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNsZWFyU2VhcmNoUmVzb3VyY2VUeXBlKCkge1xuICAgIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlID0ge307XG4gICAgdGhpcy5vblNlYXJjaFJlc291cmNlVHlwZUNoYW5nZWQoKTtcbiAgfVxuXG4gIG9uU2VhcmNoUmVzb3VyY2VUeXBlQ2hhbmdlZChyZXNvdXJjZVR5cGU/KSB7XG4gICAgaWYgKCFyZXNvdXJjZVR5cGUgfHwgIXJlc291cmNlVHlwZS5pZCkge1xuICAgICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUucmVzb3VyY2VUeXBlID0gbnVsbDtcbiAgICAgIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlc1Njb3BlID0gKHRoaXMubWV0YVJlZmVyZW5jZSB8fCBbXSkuZmlsdGVyKHJ0ID0+IHJ0LmhpZGRlbiAhPT0gdHJ1ZSkubWFwKHJ0ID0+IHJ0Lm5hbWUpLmpvaW4oJywnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUucmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlLmlkO1xuICAgICAgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGVzU2NvcGUgPSByZXNvdXJjZVR5cGUuaWQ7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRQbGFjZWhvbGRlckxhYmVsKCk7XG4gICAgdGhpcy5mb2N1cygpO1xuICAgIGlmICghdGhpcy5tb2RlbCAmJiAhdGhpcy5zZWFyY2hUZXh0KSB7IC8vIGZpbHRlciBzdWdnZXN0aW9ucyBieSB0eXBlXG4gICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMgPSAhcmVzb3VyY2VUeXBlID8gKHRoaXMubWV0YS5zdWdnZXN0aW9ucyB8fCBbXSkgOiAodGhpcy5tZXRhLnN1Z2dlc3Rpb25zIHx8IFtdKS5maWx0ZXIoXG4gICAgICAgIChzKSA9PiBzLnR5cGUgPT09IHJlc291cmNlVHlwZS5pZFxuICAgICAgKTtcbiAgICB9IGVsc2UgeyAvLyByZWd1bGFyIHNlYXJjaCAocmV0dXJuIHNjb3BlZCByZXN1bHRzKVxuICAgICAgaWYgKCF0aGlzLm1vZGVsKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VhcmNoUmVzdWx0cyAmJiByZXNvdXJjZVR5cGUpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzID0gdGhpcy5zZWFyY2hSZXN1bHRzLmZpbHRlcigocykgPT4gcy50eXBlID09PSByZXNvdXJjZVR5cGUuaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBkZWxldGUgdGhpcy5zZWFyY2hFcnJvcjtcbiAgfVxuXG4gIG9uU2VhcmNoVGV4dENoYW5nZWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2VhcmNoVGV4dENoYW5nZWQubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBzZWFyY2goKSB7XG4gICAgdGhpcy5zZWFyY2hpbmcgPSB0cnVlO1xuICAgIC8vIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4O1xuICAgIGlmICghdGhpcy5zZWFyY2hUZXh0IHx8IHRoaXMuc2VhcmNoVGV4dC5sZW5ndGggPCAyKSB7XG4gICAgICB0aGlzLnNlYXJjaGluZyA9IGZhbHNlO1xuICAgICAgZGVsZXRlIHRoaXMuc2VhcmNoUmVzdWx0cztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2hvd1NlYXJjaFJlc3VsdHMgPSAocmVzdWx0cykgPT4ge1xuICAgICAgdGhpcy5zZWFyY2hpbmcgPSBmYWxzZTtcbiAgICAgIGRlbGV0ZSB0aGlzLnNlYXJjaEVycm9yO1xuICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4O1xuICAgICAgaWYgKCFyZXN1bHRzIHx8ICEocmVzdWx0cyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICByZXN1bHRzID0gW107XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tZXRhLmFjY2VwdE5ldyAmJiB0aGlzLm1ldGEuYWNjZXB0TmV3LnR5cGUgJiYgdGhpcy5tZXRhLmFjY2VwdE5ldy5wYXR0ZXJuKSB7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLm1ldGEuYWNjZXB0TmV3LnBhdHRlcm4pO1xuICAgICAgICBpZiAocmVnZXgudGVzdCh0aGlzLnNlYXJjaFRleHQpKSB7XG4gICAgICAgICAgcmVzdWx0cy51bnNoaWZ0KHsgaWQ6IG51bGwsIGxhYmVsOiB0aGlzLnNlYXJjaFRleHQsIHR5cGU6IHRoaXMubWV0YS5hY2NlcHROZXcudHlwZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzID0gcmVzdWx0cy5tYXAoKHIpID0+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBhcnJvdy1ib2R5LXN0eWxlXG4gICAgICAgIHJldHVybiB7IGlkOiByLmlkLCBsYWJlbDogci5sYWJlbCwgdHlwZTogci50eXBlIHx8IHIucmVzb3VyY2VUeXBlIHx8IHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlLm5hbWUsIGV4dGVybmFsTGluazogci5leHRlcm5hbExpbmsgfTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCEvVmx0LWRyb3Bkb3duLS1leHBhbmRlZC8udGVzdCh0aGlzLmRyb3Bkb3duLmNsYXNzTmFtZSkpIHtcbiAgICAgICAgdGhpcy5zaG93RHJvcGRvd24oKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHRoaXMubWV0YS5zZWFyY2gpIHtcbiAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHRoaXMubWV0YS5zZWFyY2gucGFyYW1zIHx8IHt9O1xuICAgICAgbGV0IHNlYXJjaFVybCA9IGAvZmllbGRzLyR7dGhpcy5tZXRhLm5hbWV9L3NlYXJjaGA7XG4gICAgICBpZiAodGhpcy5tZXRhLnNlYXJjaC51cmwpIHtcbiAgICAgICAgc2VhcmNoVXJsID0gdGhpcy5tZXRhLnNlYXJjaC51cmwucmVwbGFjZSgvXFwke1xccyooW1xcd1xcLl0rKVxccyp9L2csIChtYXRjaCwga2V5KSA9PiB7XG4gICAgICAgICAgaWYgKHNlYXJjaFBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHNlYXJjaFBhcmFtc1trZXldLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHByb3BzWzBdO1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzWzFdO1xuICAgICAgICAgICAgZGVsZXRlIHNlYXJjaFBhcmFtc1trZXldOyAvLyBpZiBpdCBpcyBVUkwgcGFyYW0sIHJlbW92ZSBpdCBhcyBxdWVyeSBwYXJhbVxuICAgICAgICAgICAgbGV0IHBhclZhbHVlID0gdGhpcy5wYXJlbnRbZmllbGRdO1xuICAgICAgICAgICAgaWYgKHBhclZhbHVlKSB7XG4gICAgICAgICAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgICAgICAgICAgcGFyVmFsdWUgPSBwYXJWYWx1ZVtwcm9wXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocGFyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyVmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcCBvZiBPYmplY3Qua2V5cyhzZWFyY2hQYXJhbXMpKSB7XG4gICAgICAgIHNlYXJjaFVybCArPSBgJHtzZWFyY2hVcmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJ30ke2VuY29kZVVSSUNvbXBvbmVudChwKX09JHtlbmNvZGVVUklDb21wb25lbnQoc2VhcmNoUGFyYW1zW3BdKX1gO1xuICAgICAgfVxuICAgICAgc2VhcmNoVXJsICs9IGAke3NlYXJjaFVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnfXE9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5zZWFyY2hUZXh0KX1gO1xuICAgICAgdGhpcy5zZWFyY2hpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5yZXNvdXJjZVNlcnZpY2UuZ2V0QnlQYXRoKHNlYXJjaFVybCkuc3Vic2NyaWJlKChyZXN1bHRzKSA9PiB7XG4gICAgICAgIHNob3dTZWFyY2hSZXN1bHRzKHJlc3VsdHMpO1xuICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlYXJjaGluZztcbiAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRzID0gW107XG4gICAgICAgIHRoaXMuc2VhcmNoRXJyb3IgPSBlcnJvci5lcnJvciA/IGVycm9yLmVycm9yLm1lc3NhZ2UgfHwgZXJyb3IuZXJyb3IgOiBlcnJvci5tZXNzYWdlIHx8IGVycm9yO1xuICAgICAgICBpZiAoIS9WbHQtZHJvcGRvd24tLWV4cGFuZGVkLy50ZXN0KHRoaXMuZHJvcGRvd24uY2xhc3NOYW1lKSkge1xuICAgICAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMudnIpIHtcbiAgICAgICAgdGhpcy52ciA9IHRoaXMubWV0YVJlc291cmNlLm5ldyh7XG4gICAgICAgICAgaW50ZWdyYXRpb25Db2RlOiB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgICAgICByZXNvdXJjZVR5cGU6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLnZyLnNlYXJjaEludGVncmF0aW9uKFxuICAgICAgICB0aGlzLnNlYXJjaFRleHQsXG4gICAgICAgIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlLm5hbWUgfHwgdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGVzU2NvcGVcbiAgICAgICkuc3Vic2NyaWJlKChyZXN1bHRzOiBBcnJheTxhbnk+KSA9PiB7XG4gICAgICAgIHNob3dTZWFyY2hSZXN1bHRzKHJlc3VsdHMpO1xuICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0cyA9IFtdO1xuICAgICAgICB0aGlzLnNlYXJjaEVycm9yID0gZXJyb3IuZXJyb3IgPyBlcnJvci5lcnJvci5tZXNzYWdlIHx8IGVycm9yLmVycm9yIDogZXJyb3IubWVzc2FnZSB8fCBlcnJvcjtcbiAgICAgICAgaWYgKCEvVmx0LWRyb3Bkb3duLS1leHBhbmRlZC8udGVzdCh0aGlzLmRyb3Bkb3duLmNsYXNzTmFtZSkpIHtcbiAgICAgICAgICB0aGlzLnNob3dEcm9wZG93bigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvbkFjdGl2YXRlZChldikge1xuICAgIC8vIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgLy8gZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pbnB1dCA9IGV2LnNyY0VsZW1lbnQ7XG4gICAgaWYgKCF0aGlzLmRyb3Bkb3duKSB7XG4gICAgICAvLyB0aGlzLmRyb3Bkb3duID0gZXYuc3JjRWxlbWVudC5wYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICB0aGlzLmRyb3Bkb3duID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmRyb3Bkb3duLXdyYXBwZXInKTtcbiAgICB9XG4gICAgdGhpcy5zaG93RHJvcGRvd24oKTtcbiAgfVxuXG4gIG9uQmx1cihldikge1xuICAgIGxldCBpbnRlcm5hbENvbnRyb2wgPSBmYWxzZTtcbiAgICBpZiAoZXYucmVsYXRlZFRhcmdldCkge1xuICAgICAgaWYgKCF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldi5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICB0aGlzLmRpc21pc3NEcm9wZG93bigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZXJuYWxDb250cm9sID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMua2V5TGlzdGVuZXJBY3RpdmUgJiYgIWludGVybmFsQ29udHJvbCkge1xuICAgICAgdGhpcy5pbnB1dC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMua2V5TGlzdGVuZXJBY3RpdmUpIHtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2xpY2tvdXQpO1xuICAgICAgICB9XG4gICAgICB9LCA0MDApO1xuICAgICAgZGVsZXRlIHRoaXMua2V5TGlzdGVuZXJBY3RpdmU7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlU2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLm1vZGVsICYmICF0aGlzLnN1Z2dlc3Rpb25zLmZpbmQoKHMpID0+IChzLmlkID09PSB0aGlzLm1vZGVsLmlkICYmIHMudHlwZSA9PT0gdGhpcy5tb2RlbC50eXBlKSkpIHtcbiAgICAgIHRoaXMuc21hcnRTdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgaWQ6IHRoaXMubW9kZWwuaWQsXG4gICAgICAgIGxhYmVsOiB0aGlzLm1vZGVsLmxhYmVsLFxuICAgICAgICB0eXBlOiB0aGlzLm1vZGVsLnR5cGUsXG4gICAgICAgIHNtYXJ0OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5tZXRhVHJhY2tlci5lbWl0KHRoaXMuYnVpbGRUcmFja0V2ZW50KCdSRU1PVkUnKSk7XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgb25TdWdnZXN0aW9uU2VsZWN0KGV2LCBzdWdnZXN0aW9uKSB7XG4gICAgaWYgKCFzdWdnZXN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5mb2N1cygpO1xuICAgIHRoaXMubWV0YVRyYWNrZXIuZW1pdCh0aGlzLmJ1aWxkVHJhY2tFdmVudCgnU0VMRUNUJykpO1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICBpZiAoIXRoaXMubW9kZWwpIHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IFtdO1xuICAgICAgfVxuICAgICAgbGV0IGV4aXN0aW5nRW50cnk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMubW9kZWwpIHtcbiAgICAgICAgaWYgKHN1Z2dlc3Rpb24uaWQgJiYgKGVudHJ5LmlkID09PSBzdWdnZXN0aW9uLmlkKSkge1xuICAgICAgICAgIGV4aXN0aW5nRW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChzdWdnZXN0aW9uLmxhYmVsID09PSBlbnRyeS5sYWJlbCkgeyAvLyBjcmVhdGUgbmV3IChnb29nbGUgZW1haWxzKVxuICAgICAgICAgIGV4aXN0aW5nRW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFleGlzdGluZ0VudHJ5KSB7XG4gICAgICAgIHRoaXMubW9kZWwucHVzaChzdWdnZXN0aW9uKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLm1vZGVsKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnNlYXJjaFRleHQ7XG4gICAgICB0aGlzLnNlYXJjaFRleHRDaGFuZ2VkLm5leHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tb2RlbCA9IHN1Z2dlc3Rpb247XG4gICAgICB0aGlzLmV4dGVybmFsTGluayA9IHN1Z2dlc3Rpb24uZXh0ZXJuYWxMaW5rO1xuICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHN1Z2dlc3Rpb24pO1xuICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gc3VnZ2VzdGlvbi5sYWJlbDtcbiAgICAgIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4ID0gKHRoaXMuc2VhcmNoUmVzdWx0cyB8fCB0aGlzLnN1Z2dlc3Rpb25zKS5pbmRleE9mKHN1Z2dlc3Rpb24pO1xuICAgIH1cbiAgICB0aGlzLmRpc21pc3NEcm9wZG93bigpO1xuICAgIC8vIGlmICh0aGlzLmlzUG9seW1vcnBoaWMpIHtcbiAgICAvLyAgIHRoaXMuc2VhcmNoUmVzb3VyY2VUeXBlID0gdGhpcy5tZXRhUmVmZXJlbmNlLmZpbmQoKHJ0KT0+IHtcbiAgICAvLyAgICAgcmV0dXJuIHJ0Lm5hbWUgPT09IHN1Z2dlc3Rpb24udHlwZTtcbiAgICAvLyAgIH0pO1xuICAgIC8vIH1cbiAgfVxuXG4gIHNob3dEcm9wZG93bigpIHtcbiAgICB0aGlzLmRyb3Bkb3duVmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5kcm9wZG93bi5jbGFzc0xpc3QuYWRkKCdWbHQtZHJvcGRvd24tLWV4cGFuZGVkJyk7XG4gICAgaWYgKCF0aGlzLmtleUxpc3RlbmVyQWN0aXZlKSB7XG4gICAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd24pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja291dCk7XG4gICAgICB9LCAyMDApO1xuICAgICAgdGhpcy5rZXlMaXN0ZW5lckFjdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0aGlzLm1vZGVsICYmICh0aGlzLnNlYXJjaFJlc3VsdHMgfHwgdGhpcy5zdWdnZXN0aW9ucykpIHtcbiAgICAgICAgZm9yIChsZXQgc3VnZ2VzdGlvbkluZGV4ID0gMDsgc3VnZ2VzdGlvbkluZGV4IDwgKHRoaXMuc2VhcmNoUmVzdWx0cyB8fCB0aGlzLnN1Z2dlc3Rpb25zKS5sZW5ndGg7IHN1Z2dlc3Rpb25JbmRleCsrKSB7XG4gICAgICAgICAgY29uc3QgaXRlbSA9ICh0aGlzLnNlYXJjaFJlc3VsdHMgfHwgdGhpcy5zdWdnZXN0aW9ucylbc3VnZ2VzdGlvbkluZGV4XTtcbiAgICAgICAgICBpZiAodGhpcy5tb2RlbC5pZCA9PT0gaXRlbS5pZCAmJiB0aGlzLm1vZGVsLnR5cGUgPT09IGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggPSBzdWdnZXN0aW9uSW5kZXg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5lbnN1cmVEcm9wZG93bklzVmlzaWJsZSgpO1xuICB9XG5cbiAgZGlzbWlzc0Ryb3Bkb3duKGV2ZW50Pykge1xuICAgIHRoaXMuZHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRyb3Bkb3duKSB7XG4gICAgICB0aGlzLmRyb3Bkb3duLmNsYXNzTGlzdC5yZW1vdmUoJ1ZsdC1kcm9wZG93bi0tZXhwYW5kZWQnKTtcbiAgICB9XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLnByZXZNb2RlbCA9IHRoaXMubW9kZWw7XG4gICAgZGVsZXRlIHRoaXMuc2VhcmNoVGV4dDtcbiAgICBkZWxldGUgdGhpcy5zZWFyY2hSZXN1bHRzO1xuICAgIGRlbGV0ZSB0aGlzLm1vZGVsO1xuICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleDtcbiAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy5tb2RlbCk7XG4gICAgdGhpcy5vblNlYXJjaFRleHRDaGFuZ2VkKHRoaXMuc2VhcmNoVGV4dCk7XG4gICAgdGhpcy5mb2N1cygpO1xuICB9XG5cbiAgcmV2ZXJ0KCkge1xuICAgIHRoaXMubW9kZWwgPSB0aGlzLnByZXZNb2RlbDtcbiAgICBkZWxldGUgdGhpcy5wcmV2TW9kZWw7XG4gICAgdGhpcy5vbk1vZGVsQ2hhbmdlKHRoaXMubW9kZWwpO1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgfVxuXG4gIHJlbW92ZShldiwgaXRlbSkge1xuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3Qgb3B0aW9uSW5kZXggPSB0aGlzLm1vZGVsLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKG9wdGlvbkluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5tb2RlbC5zcGxpY2Uob3B0aW9uSW5kZXgsIDEpO1xuICAgICAgaWYgKCF0aGlzLm1vZGVsLmxlbmd0aCkge1xuICAgICAgICBkZWxldGUgdGhpcy5tb2RlbDtcbiAgICAgICAgZGVsZXRlIHRoaXMudmFsdWU7XG4gICAgICB9XG4gICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy5tb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgb3BlblJlc291cmNlKG1vZGVsPykge1xuICAgIHRoaXMua2V5TGlzdGVuZXJBY3RpdmUgPSB0cnVlOyAvLyBzdXBwcmVzcyBkcm9wZG93biBpbiB0aGlzIGNhc2VcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZGlzbWlzc0Ryb3Bkb3duKCk7XG4gICAgfSk7XG4gICAgY29uc3QgcmVmRGlhbG9nQ29tcG9uZW50ID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChNZXRhUmVmRGlhbG9nKTtcbiAgICB0aGlzLm1ldGFUcmFja2VyLmVtaXQodGhpcy5idWlsZFRyYWNrRXZlbnQobW9kZWwgPyAnRURJVCcgOiAnTkVXJykpO1xuICAgIGxldCB0aGVtZSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmRhdGFzZXQudGhlbWU7XG4gICAgaWYgKCF0aGVtZSB8fCB0aGVtZSA9PT0gJ2luaGVyaXQnKSB7XG4gICAgICBsZXQgcGFyZW50Q29tcG9uZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xvc2VzdCgndmdpcC1tZXRhLWxheW91dCcpO1xuICAgICAgaWYgKHBhcmVudENvbXBvbmVudCkge1xuICAgICAgICB0aGVtZSA9IHBhcmVudENvbXBvbmVudC5kYXRhc2V0LnRoZW1lO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGVtZSB8fCB0aGVtZSA9PT0gJ2luaGVyaXQnKSB7XG4gICAgICAgIHBhcmVudENvbXBvbmVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsb3Nlc3QoJ3ZnaXAtbWV0YS1yZXNvdXJjZScpO1xuICAgICAgICBpZiAocGFyZW50Q29tcG9uZW50KSB7XG4gICAgICAgICAgdGhlbWUgPSBwYXJlbnRDb21wb25lbnQuZGF0YXNldC50aGVtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlZmVyZW5jZVNlcnZpY2Uub3BlbkRpYWxvZyhcbiAgICAgIHJlZkRpYWxvZ0NvbXBvbmVudCwgdGhpcy5tZXRhUmVzb3VyY2UsIHRoaXMuaW50ZWdyYXRpb25Db2RlLFxuICAgICAgKHRoaXMubWV0YVJlZmVyZW5jZSBpbnN0YW5jZW9mIEFycmF5KSA/IHRoaXMubWV0YVJlZmVyZW5jZS5maWx0ZXIocnQgPT4gcnQuaGlkZGVuICE9PSB0cnVlKSA6IHRoaXMubWV0YVJlZmVyZW5jZSxcbiAgICAgIG1vZGVsLCBudWxsLCB0aGlzLnNlYXJjaFJlc291cmNlVHlwZS5yZXNvdXJjZVR5cGUsIHRoZW1lXG4gICAgKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IHJlc3VsdDtcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHJlc3VsdCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU3VnZ2VzdGlvbiA9ICh0aGlzLm1ldGEuc3VnZ2VzdGlvbnMgfHwgW10pLmZpbmQoKHMpID0+IChzLmlkID09PSByZXN1bHQuaWQgJiYgcy50eXBlID09PSByZXN1bHQudHlwZSkpO1xuICAgICAgICBpZiAoZXhpc3RpbmdTdWdnZXN0aW9uKSB7XG4gICAgICAgICAgZXhpc3RpbmdTdWdnZXN0aW9uLmxhYmVsID0gcmVzdWx0LmxhYmVsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghdGhpcy5tZXRhLnN1Z2dlc3Rpb25zKSB7XG4gICAgICAgICAgICB0aGlzLm1ldGEuc3VnZ2VzdGlvbnMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5tZXRhLnN1Z2dlc3Rpb25zLnVuc2hpZnQocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1ldGFUcmFja2VyLmVtaXQodGhpcy5idWlsZFRyYWNrRXZlbnQobW9kZWwgPyAnVVBEQVRFJyA6ICdDUkVBVEUnLCByZXN1bHQudHlwZSB8fCByZXN1bHQucmVzb3VyY2VUeXBlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1ldGFUcmFja2VyLmVtaXQodGhpcy5idWlsZFRyYWNrRXZlbnQobW9kZWwgPyAnQ0FOQ0VMX0VESVQnIDogJ0NBTkNFTF9VUERBVEUnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZURyb3Bkb3duSXNWaXNpYmxlKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgaG9sZGVyID0gdGhpcy5kcm9wZG93bi5jbG9zZXN0KCcuVmx0LWNhcmRfX2NvbnRlbnQnKTtcbiAgICAgIGlmIChob2xkZXIpIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuVmx0LWRyb3Bkb3duX19wYW5lbCcpO1xuICAgICAgICBjb25zdCBlbFJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgaG9sZGVyUmVjdCA9IGhvbGRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKGhvbGRlclJlY3QudG9wICsgaG9sZGVyUmVjdC5oZWlnaHQgPCBlbFJlY3QudG9wICsgZWxSZWN0LmhlaWdodCkge1xuICAgICAgICAgIGVsLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgNDAwKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlRHJvcGRvd25PcHRpb25Jc1Zpc2libGUoKSB7XG4gICAgaWYgKCF0aGlzLmRyb3Bkb3duU2Nyb2xsQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLmRyb3Bkb3duU2Nyb2xsQ29udGFpbmVyID0gdGhpcy5kcm9wZG93bi5xdWVyeVNlbGVjdG9yKCcuVmx0LWRyb3Bkb3duX19zY3JvbGwnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZHJvcGRvd25TY3JvbGxDb250YWluZXIgJiYgdHlwZW9mICh0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCkgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBzY3JvbGxUb3AgPSA0NCAqIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4O1xuICAgICAgY29uc3Qgc2Nyb2xsQm90dG9tID0gNDQgKiAodGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggLSA3KTtcbiAgICAgIGlmIChzY3JvbGxUb3AgPCB0aGlzLmRyb3Bkb3duU2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duU2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsQm90dG9tID4gdGhpcy5kcm9wZG93blNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3ApIHtcbiAgICAgICAgdGhpcy5kcm9wZG93blNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgPSBzY3JvbGxCb3R0b207XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGlja291dCA9IChldmVudCkgPT4ge1xuICAgIGNvbnN0IGludGVybmFsQ29udHJvbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKGludGVybmFsQ29udHJvbCAmJiBbJ1ZsdC1kcm9wZG93bl9fbGluaycsICdWbHQtZHJvcGRvd25fX2Jsb2NrJ10uaW5kZXhPZihldmVudC50YXJnZXQuY2xhc3NOYW1lKSAhPT0gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9IGVsc2UgaWYgKCFpbnRlcm5hbENvbnRyb2wgJiYgZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmlucHV0ICYmIGV2ZW50LnRhcmdldC5jbGFzc05hbWUgIT09ICdWbHQtZHJvcGRvd25fX3RpdGxlJykge1xuICAgICAgdGhpcy5kaXNtaXNzRHJvcGRvd24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFpbnRlcm5hbENvbnRyb2wgJiYgaW50ZXJuYWxDb250cm9sLnRhZ05hbWUgIT09ICdJTlBVVCcpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGJ1aWxkVHJhY2tFdmVudChhY3Rpb246IHN0cmluZywgdmFsdWU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBlOiBJTWV0YVRyYWNrZXJFdmVudCA9IHtcbiAgICAgIGludGVncmF0aW9uOiB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgIHJlc291cmNlOiB0aGlzLm1vZGVsID8gKHRoaXMubW9kZWwudHlwZSB8fCB0aGlzLm1vZGVsLnJlc291cmNlVHlwZSkgOiB0aGlzLnNlYXJjaFJlc291cmNlVHlwZS5yZXNvdXJjZVR5cGUsXG4gICAgICBmaWVsZDogdGhpcy5tZXRhLm5hbWUsXG4gICAgICBhY3Rpb25cbiAgICB9O1xuICAgIGlmICh0aGlzLm1ldGEuJGlzQ29udGFjdGFibGUpIHtcbiAgICAgIGUuaXNDb250YWN0YWJsZSA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKHZhbHVlKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGU7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUGxhY2Vob2xkZXJMYWJlbCgpIHtcbiAgICB0aGlzLnBsYWNlSG9sZGVyTGFiZWwgPSB0aGlzLm1ldGEubGFiZWw7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgIXRoaXMuaXNQb2x5bW9ycGhpYykge1xuICAgICAgdGhpcy5wbGFjZUhvbGRlckxhYmVsID0gJytBZGQgJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbGFjZUhvbGRlckxhYmVsID0gKHRoaXMuaXNTZWFyY2hhYmxlICYmICh0aGlzLm11bHRpcGxlIHx8ICF0aGlzLmlzUG9seW1vcnBoaWMpKSA/ICdTZWFyY2ggJyA6ICcnO1xuICAgIH1cbiAgICB0aGlzLnBsYWNlSG9sZGVyTGFiZWwgKz0gdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUucmVzb3VyY2VUeXBlID8gdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGUucmVzb3VyY2VUeXBlIDogdGhpcy5zZWFyY2hSZXNvdXJjZVR5cGVzU2NvcGU7XG4gIH1cblxuICBwcml2YXRlIGtleWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzoge1xuICAgICAgICB0aGlzLnNob3dEcm9wZG93bigpO1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4Kys7XG4gICAgICAgICAgaWYgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4ID49ICh0aGlzLnNlYXJjaFJlc3VsdHMgfHwgdGhpcy5zdWdnZXN0aW9ucykubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVN1Z2dlc3Rpb25JbmRleCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5zdXJlRHJvcGRvd25PcHRpb25Jc1Zpc2libGUoKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQXJyb3dVcCc6IHtcbiAgICAgICAgdGhpcy5zaG93RHJvcGRvd24oKTtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXgpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4ID0gKHRoaXMuc2VhcmNoUmVzdWx0cyB8fCB0aGlzLnN1Z2dlc3Rpb25zKS5sZW5ndGggLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4LS07XG4gICAgICAgICAgaWYgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTdWdnZXN0aW9uSW5kZXggPSAodGhpcy5zZWFyY2hSZXN1bHRzIHx8IHRoaXMuc3VnZ2VzdGlvbnMpLmxlbmd0aCAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5zdXJlRHJvcGRvd25PcHRpb25Jc1Zpc2libGUoKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnU3BhY2UnOlxuICAgICAgY2FzZSAnRW50ZXInOiB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4KSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMub25TdWdnZXN0aW9uU2VsZWN0KGV2ZW50LCAodGhpcy5zZWFyY2hSZXN1bHRzIHx8IHRoaXMuc3VnZ2VzdGlvbnMpW3RoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4XSk7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlU3VnZ2VzdGlvbkluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRXNjYXBlJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5kaXNtaXNzRHJvcGRvd24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdCYWNrc3BhY2UnOiB7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiB0aGlzLm1vZGVsKSB7IC8vIEhQQlItODIyOVxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy5yZW1vdmVTZWxlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBidWlsZEV4dGVybmFsTGluaygpIHtcbiAgICBpZiAodGhpcy5tb2RlbCkge1xuICAgICAgaWYgKHRoaXMubW9kZWwuZXh0ZXJuYWxMaW5rKSB7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxMaW5rID0gdGhpcy5tb2RlbC5leHRlcm5hbExpbms7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWV0YUNvbnRleHQucHJvZmlsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGUudG9VcHBlckNhc2UoKV0pIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZXh0ZXJuYWxMaW5rO1xuICAgICAgICB0aGlzLm1ldGFNc2dTZXJ2aWNlLnNlbmRNZXNzYWdlKFxuICAgICAgICAgIHRoaXMuaW50ZWdyYXRpb25Db2RlLnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnYnVpbGRFeHRlcm5hbExpbmsnLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25Db2RlOiB0aGlzLmludGVncmF0aW9uQ29kZSxcbiAgICAgICAgICAgIHJlZjogdGhpcy5tb2RlbCxcbiAgICAgICAgICAgIHByb2ZpbGU6IHRoaXMubWV0YUNvbnRleHQucHJvZmlsZXNbdGhpcy5pbnRlZ3JhdGlvbkNvZGUudG9VcHBlckNhc2UoKV1cbiAgICAgICAgICB9LFxuICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5lcnJvcikge1xuICAgICAgICAgICAgICB0aGlzLmV4dGVybmFsTGluayA9IHJlc3BvbnNlLmV4dGVybmFsTGluaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gZXh0ZXJuYWwgbGluayBzdXBwb3J0IGZvcicsIHRoaXMuaW50ZWdyYXRpb25Db2RlLCB0aGlzLm1vZGVsLnJlc291cmNlVHlwZSB8fCB0aGlzLm1vZGVsLnR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMuZXh0ZXJuYWxMaW5rO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VhcmNoQXV0b1N1Z2dlc3Rpb25zKHBhcmFtcz8pIHtcbiAgICBsZXQgc2VhcmNoVXJsID0gYC9zdWdnZXN0aW9ucy8ke3RoaXMubWV0YS5uYW1lfS9zZWFyY2hgO1xuICAgIGlmICh0aGlzLm1ldGEuYXV0byAmJiB0aGlzLm1ldGEuYXV0by5zZWFyY2gpIHtcbiAgICAgIGlmICh0aGlzLm1ldGEuYXV0by5zZWFyY2gudXJsKSB7XG4gICAgICAgIHNlYXJjaFVybCA9IHRoaXMubWV0YS5hdXRvLnNlYXJjaC51cmwucmVwbGFjZSgvXFwke1xccyooW1xcd1xcLl0rKVxccyp9L2csIChtYXRjaCwga2V5KSA9PiB7XG4gICAgICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSBwYXJhbXNba2V5XTtcbiAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXNba2V5XTtcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgT2JqZWN0LmtleXMocGFyYW1zKSkge1xuICAgICAgICBzZWFyY2hVcmwgKz0gYCR7c2VhcmNoVXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJid9JHtlbmNvZGVVUklDb21wb25lbnQocCl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtc1twXSl9YDtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VhcmNoaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVzb3VyY2VTZXJ2aWNlLmdldEJ5UGF0aChzZWFyY2hVcmwpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlYXJjaGluZztcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGxldCBzdWdnZXN0aW9ucztcbiAgICAgICAgICBzdWdnZXN0aW9ucyA9IHJlc3VsdDtcbiAgICAgICAgICBpZiAodGhpcy5tZXRhLmF1dG8uc2VhcmNoLmV4dHJhY3QpIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zID0gcmVzdWx0W3RoaXMubWV0YS5hdXRvLnNlYXJjaC5leHRyYWN0XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN1Z2dlc3Rpb25zIGluc3RhbmNlb2YgQXJyYXkgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zID0gW3N1Z2dlc3Rpb25zXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYXN5bmNTdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICAgIHN1Z2dlc3Rpb25zLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgICAgIGlmIChzICYmIHMuaWQgJiYgcy50eXBlKSB7IC8vIFRPT0QgY2hlY2sgdGhlIHR5cGUgaXMgYWNjZXB0YWJsZVxuICAgICAgICAgICAgICBhc3luY1N1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBzLmlkLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBzLmxhYmVsIHx8IGAke3MudHlwZX0jJHtzLmlkfWAsXG4gICAgICAgICAgICAgICAgdHlwZTogcy50eXBlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChhc3luY1N1Z2dlc3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGFzeW5jU3VnZ2VzdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgIHRoaXMucGFyZW50W3RoaXMubWV0YS5uYW1lXSA9IGFzeW5jU3VnZ2VzdGlvbnNbMF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5hc3luY1N1Z2dlc3Rpb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFzeW5jU3VnZ2VzdGlvbnMgPSBhc3luY1N1Z2dlc3Rpb25zO1xuICAgICAgICB9XG4gICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlYXJjaGluZztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPSd2Z2lwLW1ldGEtZmllbGQtcHJldmlldycgKm5nSWY9J3ByZXZpZXcgJiYgbW9kZWwgJiYgKCFtdWx0aXBsZSB8fCAobXVsdGlwbGUgJiYgbW9kZWwubGVuZ3RoKSknPlxuICA8ZGl2IGNsYXNzPSd2Z2lwLW1ldGEtZmllbGQtbGFiZWwnPnt7bWV0YS5sYWJlbCB8fCBtZXRhLm5hbWV9fTwvZGl2PlxuICA8ZGl2ICpuZ0lmPSchbXVsdGlwbGUnIGNsYXNzPSd2Z2lwLW1ldGEtZmllbGQtdmFsdWUgX19ndSc+XG4gICAgPHN2ZyBjbGFzcz1cIlZsdC1pY29uIFZsdC1pY29uLS1zbWFsbGVyXCIgc3R5bGU9J21hcmdpbi10b3A6IC0zcHg7Jz48dXNlIGF0dHIueGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWJyYW5kLWljb25zLnN2ZyN7e2ludGVncmF0aW9uSWNvbn19XCIvPjwvc3ZnPlxuICAgIHt7bW9kZWwubGFiZWwgfHwgbW9kZWwuaWR9fSA8c3BhbiBjbGFzcz0nVmx0LWdyZXknPih7e21vZGVsLnR5cGV9fSk8L3NwYW4+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPSdtdWx0aXBsZScgY2xhc3M9J3ZnaXAtbWV0YS1maWVsZC12YWx1ZSBfX2d1Jz5cbiAgICA8c3BhbiAqbmdGb3I9J2xldCBtIG9mIChtb2RlbCB8fCBbXSknIGNsYXNzPSdWbHQtYmFkZ2UgVmx0LWJhZGdlLS1hcHAnPlxuICAgICAge3ttLmxhYmVsIHx8IG0uaWQgfHwgbX19IDxzcGFuIGNsYXNzPSdWbHQtZ3JleS1kYXJrJyAqbmdJZj0naXNQb2x5bW9ycGhpYyc+KHt7bS50eXBlfX0pPC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG4gIDxhIFtocmVmXT0nZXh0ZXJuYWxMaW5rIHx8IG1vZGVsLmV4dGVybmFsTGluaycgdGFyZ2V0PSdfYmxhbmsnIHJlbD0nbm9vcGVuZXInICpuZ0lmPSdleHRlcm5hbExpbmsgJiYgKG1vZGVsICYmICFtdWx0aXBsZSknIGNsYXNzPVwiVmx0LWNvbXBvc2l0ZV9fYXBwZW5kLS1pY29uIHByZXZpZXdcIiBhcmlhLWxhYmVsPSdPcGVuIGV4dGVybmFsJz5cbiAgICA8ZGl2IGNsYXNzPVwiVmx0LWNvbXBvc2l0ZV9faWNvblwiPlxuICAgICAgPHN2Zz48dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tb3BlblwiLz48L3N2Zz5cbiAgICA8L2Rpdj5cbiAgPC9hPlxuPC9kaXY+XG48ZGl2ICpuZ0lmPSchcHJldmlldycgY2xhc3M9XCJtZXRhLWZpZWxkLXJlZmVyZW5jZSBWbHQtZm9ybV9fZWxlbWVudCBWbHQtZm9ybV9fZWxlbWVudC0tYmlnXCIgW25nQ2xhc3NdPVwieyAnVmx0LWZvcm1fX2VsZW1lbnQtLWVycm9yJzogKHNlYXJjaEVycm9yICYmIGtleUxpc3RlbmVyQWN0aXZlKSB8fCAoZi5pbnZhbGlkICYmICgoZiB8IG1ldGFNb2RlbCkuX3BhcmVudC5zdWJtaXR0ZWQgfHwgKGZ0IHwgbWV0YU1vZGVsICkudG91Y2hlZCkpLCAnbXVsdGlwbGUnOiBtdWx0aXBsZSwgJ2hhcy12YWx1ZSc6IG1vZGVsLCBhY3RpdmU6IGtleUxpc3RlbmVyQWN0aXZlIH1cIj5cbiAgPGRpdiAqbmdJZj0nbXVsdGlwbGUnIGNsYXNzPSdpdGVtcy1jb250YWluZXInIFtuZ0NsYXNzXT0neyBjcmVhdGFibGU6IGlzQ3JlYXRhYmxlIH0nPlxuICAgIDxkaXYgKm5nSWY9J21vZGVsJyBjbGFzcz0nYmFkZ2VzLWNvbnRhaW5lciBrZWVwLWZvY3VzJyAoY2xpY2spPSdmb2N1cygpJyBzdHlsZT0nd2lkdGg6IDEwMCU7Jz5cbiAgICAgIDxkaXYgKm5nRm9yPSdsZXQgaXRlbSBvZiBtb2RlbCcgY2xhc3M9XCJWbHQtYmFkZ2UgVmx0LWJhZGdlLS1hcHAgVmx0LWJhZGdlLS1sYXJnZSBrZWVwLWZvY3VzXCIgW25nQ2xhc3NdPVwieyBncmlkOiAoaXRlbS5sYWJlbCB8fCBpdGVtLmlkIHx8ICcnKS5sZW5ndGggPiA1Nn1cIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9J1ZsdC10cnVuY2F0ZSc+e3tpdGVtLmxhYmVsIHx8IGl0ZW0uaWQgfHwgaXRlbSB9fSA8c3BhbiAqbmdJZj0naXNQb2x5bW9ycGhpYycgY2xhc3M9J1ZsdC1ncmV5LWRhcmsnIHN0eWxlPSdmb250LXdlaWdodDogbm9ybWFsOyc+KHt7aXRlbS50eXBlfX0pPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIlZsdC1iYWRnZV9fZGlzbWlzcyBrZWVwLWZvY3VzXCIgKGNsaWNrKT0ncmVtb3ZlKCRldmVudCwgaXRlbSknIHN0eWxlPSdwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAxMnB4OyB0b3A6IDhweDsnIGFyaWEtbGFiZWw9J1JlbW92ZSc+PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJWbHQtY29tcG9zaXRlXCI+XG4gICAgPGRpdiBjbGFzcz0nZHJvcGRvd24td3JhcHBlciBWbHQtZHJvcGRvd24nIHN0eWxlPSd3aWR0aDogMTAwJTsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDQ4cHg7Jz5cbiAgICAgIDxkaXYgY2xhc3M9XCJWbHQtZHJvcGRvd25fX3BhbmVsXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9J3NlYXJjaEVycm9yJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiVmx0LWNhbGxvdXQgVmx0LWNhbGxvdXQtLWNyaXRpY2FsIGtlZXAtZm9jdXNcIj5cbiAgICAgICAgICAgIDxpPjwvaT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJWbHQtY2FsbG91dF9fY29udGVudFwiPnt7c2VhcmNoRXJyb3J9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj0nIXNlYXJjaEVycm9yICYmIChzdWdnZXN0aW9ucy5sZW5ndGggfHwgc2VhcmNoUmVzdWx0cyknIFtuZ0NsYXNzXT1cInsgc3VnZ2VzdGlvbnM6ICFzZWFyY2hSZXN1bHRzfVwiIGNsYXNzPVwiVmx0LWRyb3Bkb3duX19wYW5lbF9fY29udGVudCBWbHQtZHJvcGRvd25fX3BhbmVsX19jb250ZW50LS1zY3JvbGwtYXJlYVwiIHN0eWxlPSdwYWRkaW5nOiAwOyc+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIlZsdC1kcm9wZG93bl9fYmxvY2tcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPSchc2VhcmNoUmVzdWx0cycgY2xhc3M9XCJWbHQtZHJvcGRvd25fX3Njcm9sbFwiPlxuICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7ICdWbHQtZHJvcGRvd25fX2xpbmstLXNlbGVjdGVkJzogYWN0aXZlU3VnZ2VzdGlvbkluZGV4ID09PSBpLCBzbWFydDogc3VnZ2VzdGlvbi5zbWFydCB9XCIgKGNsaWNrKT0nb25TdWdnZXN0aW9uU2VsZWN0KCRldmVudCwgc3VnZ2VzdGlvbiknICpuZ0Zvcj0nbGV0IHN1Z2dlc3Rpb24gb2Ygc3VnZ2VzdGlvbnM7IGxldCBpID0gaW5kZXgnICBjbGFzcz1cIlZsdC1kcm9wZG93bl9fbGluayBoYXMtdHlwZVwiPlxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSdWbHQtaWNvbiAgVmx0LWljb24tLXNtYWxsJz48dXNlIGF0dHIueGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWJyYW5kLWljb25zLnN2ZyN7e2ludGVncmF0aW9uSWNvbn19XCIvPjwvc3ZnPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdfX2d1JyBbdGl0bGVdPSdzdWdnZXN0aW9uLmxhYmVsJz57eyBzdWdnZXN0aW9uLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz0nVmx0LWdyZXktZGFyaycgc3R5bGU9J3RleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOyc+e3tzdWdnZXN0aW9uLnR5cGV9fTwvc21hbGw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPSdzZWFyY2hSZXN1bHRzJyBjbGFzcz1cIlZsdC1kcm9wZG93bl9fc2Nyb2xsXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPSchc2VhcmNoUmVzdWx0cy5sZW5ndGgnIGNsYXNzPSdWbHQtZHJvcGRvd25fX2Jsb2NrJz4gTm8gcmVjb3JkcyBtYXRjaGluZyAnPGIgc3R5bGU9J3BvaW50ZXItZXZlbnRzOiBub25lOyc+e3tzZWFyY2hUZXh0fX08L2I+JyB3ZXJlIGZvdW5kLjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7ICdWbHQtZHJvcGRvd25fX2xpbmstLXNlbGVjdGVkJzogYWN0aXZlU3VnZ2VzdGlvbkluZGV4ID09PSBpIH1cIiAoY2xpY2spPSdvblN1Z2dlc3Rpb25TZWxlY3QoJGV2ZW50LCBzdWdnZXN0aW9uKScgKm5nRm9yPSdsZXQgc3VnZ2VzdGlvbiBvZiBzZWFyY2hSZXN1bHRzOyBsZXQgaSA9IGluZGV4JyAgY2xhc3M9XCJWbHQtZHJvcGRvd25fX2xpbmsgaGFzLXR5cGVcIj5cbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0nVmx0LWljb24gVmx0LWljb24tLXNtYWxsJz48dXNlIGF0dHIueGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWJyYW5kLWljb25zLnN2ZyN7e2ludGVncmF0aW9uSWNvbn19XCIvPjwvc3ZnPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdfX2d1JyBbdGl0bGVdPSdzdWdnZXN0aW9uLmxhYmVsJz57eyBzdWdnZXN0aW9uLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz0nVmx0LWdyZXktZGFyaycgc3R5bGU9J3RleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOyc+e3tzdWdnZXN0aW9uLnR5cGV9fTwvc21hbGw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9J3NlYXJjaFJlc3VsdHMnIGNsYXNzPVwiVmx0LWRyb3Bkb3duX19ibG9ja1wiIHN0eWxlPSd0ZXh0LWFsaWduOiByaWdodDsgcGFkZGluZy10b3A6IDA7Jz5cbiAgICAgICAgICAgIDxzbWFsbD5cbiAgICAgICAgICAgICAge3sgc2VhcmNoUmVzdWx0cyA/IHNlYXJjaFJlc3VsdHMubGVuZ3RoKycgcmVzdWx0cycgOiAnU3VnZ2VzdGlvbnMnIH19IDxzcGFuIHN0eWxlPSdmb250LXN0eWxlOiBpdGFsaWM7IGZvbnQtd2VpZ2h0OiBub3JtYWw7JyAqbmdJZj0nc2VhcmNoUmVzdWx0cyc+fnt7IG1vZGVsID8gJ2xhc3Qgc2VhcmNoJyA6IHNlYXJjaFRleHR9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJWbHQtZHJvcGRvd25fX2Jsb2NrXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIlZsdC1jb21wb3NpdGVfX3ByZXBlbmRcIiAqbmdJZj0naXNQb2x5bW9ycGhpYyAmJiBzaG93VHlwZXMgJiYgKG11bHRpcGxlIHx8ICFtb2RlbCB8fCAoZHJvcGRvd25WaXNpYmxlICYmICgoc3VnZ2VzdGlvbnMgfHwgc2VhcmNoUmVzdWx0cyB8fCBbXSkubGVuZ3RoIHx8IHNlYXJjaFJlc291cmNlVHlwZS5yZXNvdXJjZVR5cGUpKSknPlxuICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1zY29wZVwiIFtuZ0NsYXNzXT1cInsgJ2hhcy12YWx1ZSc6IHNlYXJjaFJlc291cmNlVHlwZS5yZXNvdXJjZVR5cGUgfVwiPlxuICAgICAgICA8dmdpcC1tZXRhLWZpZWxkIGNsYXNzPSdzaG93bicgW21ldGFdPSdzZWFyY2hSZXNvdXJjZVR5cGVNZXRhJyBbcGFyZW50XT0nc2VhcmNoUmVzb3VyY2VUeXBlJyAob25DaGFuZ2UpPSdvblNlYXJjaFJlc291cmNlVHlwZUNoYW5nZWQoJGV2ZW50KScgKG9uTGVhdmUpPSdvbkJsdXIoJGV2ZW50KScgW2ludGVncmF0aW9uQ29kZV09J2ludGVncmF0aW9uQ29kZScgdGhlbWU9J2luaGVyaXQnPjwvdmdpcC1tZXRhLWZpZWxkPlxuICAgICAgICA8c3ZnIGNsYXNzPSdWbHQtaWNvbiBWbHQtZ3JleSBWbHQtaWNvbi0tc21hbGxlciB2aXNpYmxlLW1vYmlsZSBtb2JpbGUtaWNvbicgc3R5bGU9J3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAxNXB4OyBsZWZ0OiAxNHB4OyBwb2ludGVyLWV2ZW50czogbm9uZTsnPlxuICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi1tZW51XCIvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPGxhYmVsIGNsYXNzPSdtb2JpbGUtbGFiZWwgaGlkZGVuLW1vYmlsZSBoaWRkZW4tZGVza3RvcCc+U2VhcmNoPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9JyEoaXNQb2x5bW9ycGhpYyAmJiBzaG93VHlwZXMgJiYgKG11bHRpcGxlIHx8ICFtb2RlbCB8fCBkcm9wZG93blZpc2libGUpKSc+PCEtLSByZXF1aXJlZCBieSBjc3MgLS0+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIlZsdC1jb21wb3NpdGVfX3dyYXBwZXIgVmx0LWlucHV0XCIgc3R5bGU9J292ZXJmbG93OiBoaWRkZW47JyBbbmdDbGFzc109XCJ7ICdoYXMtYXBwZW5kLWJ1dHRvbic6IGhhc0FwcGVuZEJ1dHRvbiAmJiAhZGlzYWJsZWQgfVwiPlxuICAgICAgPGxhYmVsIGNsYXNzPSd3cmFwcGVyJz5cbiAgICAgICAgPGRpdiBjbGFzcz1cIlZsdC1jb21wb3NpdGVfX3ByZXBlbmQgVmx0LWNvbXBvc2l0ZV9fcHJlcGVuZC0taWNvblwiIHN0eWxlPSd0b3A6IDA7IHBhZGRpbmctdG9wOiAxNXB4Oyc+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIlZsdC1jb21wb3NpdGVfX2ljb25cIj5cbiAgICAgICAgICAgIDxzdmcgKm5nSWY9J2lzU2VhcmNoYWJsZSAmJiAoIW1vZGVsIHx8IG11bHRpcGxlKScgY2xhc3M9J1ZsdC1ncmV5Jz48dXNlIGF0dHIueGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi17eyBtdWx0aXBsZSA/ICdzdGFjaycgOiAnc2VhcmNoJ319XCIvPjwvc3ZnPlxuICAgICAgICAgICAgPHN2ZyAqbmdJZj0nIWlzU2VhcmNoYWJsZSB8fCAobW9kZWwgJiYgIW11bHRpcGxlKScgW25nU3R5bGVdPVwie2ZpbGw6IGludGVncmF0aW9uSWNvbiA9PT0gJ0JyYW5kLWljb24tdm9uYWdlJyA/ICd2YXIoLS12Z2lwLW1ldGEtaW5wdXQtY29sb3IpJyA6ICcnfVwiPjx1c2UgYXR0ci54bGluazpocmVmPVwidm9sdGEvdm9sdGEtYnJhbmQtaWNvbnMuc3ZnI3t7aW50ZWdyYXRpb25JY29ufX1cIi8+PC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj0nc3VnZ2VzdGlvbnMubGVuZ3RoJyBjbGFzcz1cIlZsdC1iYWRnZSBWbHQtYmFkZ2UtLXNtYWxsIFZsdC1iYWRnZS0tcHVycGxlXCIgc3R5bGU9J3BhZGRpbmc6IDBweCA0cHg7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAyNnB4OyBsZWZ0OiA0cHg7IHBvaW50ZXItZXZlbnRzOiBub25lOyBtaW4td2lkdGg6IDE0cHg7Jz57e3N1Z2dlc3Rpb25zLmxlbmd0aH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aW5wdXQgY2xhc3M9J21vZGVsJyB0eXBlPSdoaWRkZW4nIFtyZXF1aXJlZF09J3ZhbGlkYXRpb25zLnJlcXVpcmVkJyBbKG5nTW9kZWwpXT0nbW9kZWwnICNmPSduZ01vZGVsJyBbbmFtZV09J25hbWUnIC8+XG4gICAgICAgIDxpbnB1dCBjbGFzcz0nbWFpbicgW3JlYWRvbmx5XT0nIWlzU2VhcmNoYWJsZSB8fCAobW9kZWwgJiYgIW11bHRpcGxlKScgW25nTW9kZWxdPSdzZWFyY2hUZXh0JyAjZnQ9J25nTW9kZWwnIChuZ01vZGVsQ2hhbmdlKT0nb25TZWFyY2hUZXh0Q2hhbmdlZCgkZXZlbnQpJyBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cInt7IHBsYWNlSG9sZGVyTGFiZWwgfHwgJyAnIH19XCIgW25nQ2xhc3NdPSd7IGV4dDogZXh0ZXJuYWxMaW5rIH0nIChjbGljayk9J29uQWN0aXZhdGVkKCRldmVudCknIChmb2N1cyk9J29uQWN0aXZhdGVkKCRldmVudCknIChibHVyKT0nb25CbHVyKCRldmVudCknIFtkaXNhYmxlZF09J2Rpc2FibGVkJyBbdGl0bGVdPVwibW9kZWwgPyBtb2RlbC5sYWJlbCA6ICcnXCIvPlxuICAgICAgICA8bGFiZWwgY2xhc3M9J1ZsdC10cnVuY2F0ZSBoaWRkZW4tbW9iaWxlJyBzdHlsZT0ncGFkZGluZy1sZWZ0OiAyNXB4OyBwYWRkaW5nLXJpZ2h0OiA0MnB4Oyc+e3sgKG11bHRpcGxlICYmIGlzUG9seW1vcnBoaWMpID8gJytBZGQgJyA6ICgobW9kZWwgfHwgIWlzUG9seW1vcnBoaWMpID8gbWV0YS5sYWJlbCA6ICggbWV0YS5zZWFyY2hMYWJlbCB8fCAnU2VhcmNoJykpIH19PHNwYW4gKm5nSWY9J3ZhbGlkYXRpb25zLnJlcXVpcmVkJyBjbGFzcz0nVmx0LXJlZCc+Kjwvc3Bhbj4mbmJzcDs8c3BhbiBzdHlsZT0nY29sb3I6IHZhcigtLXZnaXAtbWV0YS1pbnB1dC1jb2xvcik7IHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOycgKm5nSWY9J21vZGVsJz4oe3ttb2RlbC50eXBlIHx8IG1vZGVsLnJlc291cmNlVHlwZSB8fCBtb2RlbC5sZW5ndGh9fSk8L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPSdWbHQtdHJ1bmNhdGUgaGlkZGVuLWRlc2t0b3AnIHN0eWxlPSdwYWRkaW5nLWxlZnQ6IDI1cHg7IHBhZGRpbmctcmlnaHQ6IDQycHg7Jz57e21ldGEubGFiZWwgfHwgbWV0YS5uYW1lfX08c3BhbiAqbmdJZj0ndmFsaWRhdGlvbnMucmVxdWlyZWQnIGNsYXNzPSdWbHQtcmVkJz4qPC9zcGFuPiZuYnNwOzxzcGFuIHN0eWxlPSdjb2xvcjogdmFyKC0tdmdpcC1tZXRhLWlucHV0LWNvbG9yKTsgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7JyAqbmdJZj0nbW9kZWwnPih7e21vZGVsLnR5cGUgfHwgbW9kZWwucmVzb3VyY2VUeXBlIHx8IG1vZGVsLmxlbmd0aH19KTwvc3Bhbj48L2xhYmVsPlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxkaXYgKm5nSWY9J3NlYXJjaGluZycgY2xhc3M9J3NlYXJjaC1wcm9ncmVzcyc+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFyIFZsdC1iZy1wdXJwbGVcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9J1ZsdC1jb21wb3NpdGVfX2FwcGVuZCByaWdodC1hY3Rpb25zJz5cbiAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPSdwcmV2TW9kZWwgJiYgIW1vZGVsJyBjbGFzcz1cIlZsdC1jb21wb3NpdGVfX2FwcGVuZC0taWNvblwiIChjbGljayk9J3JldmVydCgpJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiVmx0LWNvbXBvc2l0ZV9faWNvblwiPlxuICAgICAgICAgICAgPHN2Zz48dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tcmVwbHlcIi8+PC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj0nbW9kZWwgJiYgIW11bHRpcGxlJyBjbGFzcz1cIlZsdC1jb21wb3NpdGVfX2FwcGVuZC0taWNvblwiIChjbGljayk9J3JlbW92ZVNlbGVjdGlvbigpJz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiVmx0LWNvbXBvc2l0ZV9faWNvblwiPlxuICAgICAgICAgICAgPHN2Zz48dXNlIHhsaW5rOmhyZWY9XCJ2b2x0YS92b2x0YS1pY29ucy5zdmcjVmx0LWljb24tY3Jvc3NcIi8+PC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YSBbaHJlZl09J2V4dGVybmFsTGluayB8fCBtb2RlbC5leHRlcm5hbExpbmsnIHRhcmdldD0nX2JsYW5rJyByZWw9J25vb3BlbmVyJyAqbmdJZj0nZXh0ZXJuYWxMaW5rICYmIChtb2RlbCAmJiAhbXVsdGlwbGUpJyBjbGFzcz1cIlZsdC1jb21wb3NpdGVfX2FwcGVuZC0taWNvblwiIGFyaWEtbGFiZWw9J09wZW4gZXh0ZXJuYWwnPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJWbHQtY29tcG9zaXRlX19pY29uXCI+XG4gICAgICAgICAgICA8c3ZnPjx1c2UgeGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi1vcGVuXCIvPjwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2E+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIDxzcGFuICpuZ0lmPSdoYXNDcmVhdGFibGVzJz5cbiAgICAgIDxidXR0b24gdHlwZT0nYnV0dG9uJyAqbmdJZj0nIW1vZGVsIHx8IG11bHRpcGxlJyAoY2xpY2spPSdvcGVuUmVzb3VyY2UoKScgY2xhc3M9XCJWbHQtYnRuIFZsdC1idG4tLXNlY29uZGFyeSBWbHQtYnRuLS1pY29uIFZsdC1idG4tLWxhcmdlXCIgc3R5bGU9J21hcmdpbi1sZWZ0OiAxMnB4Oyc+XG4gICAgICAgIDxzdmc+PHVzZSB4bGluazpocmVmPVwidm9sdGEvdm9sdGEtaWNvbnMuc3ZnI1ZsdC1pY29uLXBsdXNcIi8+PC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT0nYnV0dG9uJyAqbmdJZj0nbW9kZWwgJiYgIW11bHRpcGxlJyAoY2xpY2spPSdvcGVuUmVzb3VyY2UobW9kZWwpJyBjbGFzcz1cIlZsdC1idG4gVmx0LWJ0bi0tcHJpbWFyeSBWbHQtYnRuLS1pY29uIFZsdC1idG4tLWxhcmdlXCIgc3R5bGU9J21hcmdpbi1sZWZ0OiAxMnB4Oyc+XG4gICAgICAgIDxzdmc+PHVzZSB4bGluazpocmVmPVwidm9sdGEvdm9sdGEtaWNvbnMuc3ZnI1ZsdC1pY29uLWVkaXRcIi8+PC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L3NwYW4+IC0tPlxuICAgIDxkaXYgKm5nSWY9J2hhc0FwcGVuZEJ1dHRvbiAmJiAhZGlzYWJsZWQnIGNsYXNzPVwiVmx0LWNvbXBvc2l0ZV9fYXBwZW5kXCI+XG4gICAgICA8YnV0dG9uIChmb2N1cyk9J29uQWN0aXZhdGVkKCRldmVudCknIChibHVyKT0nb25CbHVyKCRldmVudCknIHR5cGU9J2J1dHRvbicgKm5nSWY9JyFtb2RlbCB8fCBtdWx0aXBsZScgKGNsaWNrKT0nb3BlblJlc291cmNlKCknIGNsYXNzPVwiVmx0LWJ0biBWbHQtYnRuLS13aGl0ZSBWbHQtYnRuLS1pY29uXCIgYXJpYS1sYWJlbD0nQWRkIG5ldyc+XG4gICAgICAgIDxzdmc+PHVzZSB4bGluazpocmVmPVwidm9sdGEvdm9sdGEtaWNvbnMuc3ZnI1ZsdC1pY29uLXBsdXNcIi8+PC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gKGZvY3VzKT0nb25BY3RpdmF0ZWQoJGV2ZW50KScgKGJsdXIpPSdvbkJsdXIoJGV2ZW50KScgdHlwZT0nYnV0dG9uJyAqbmdJZj0nbW9kZWwgJiYgIW11bHRpcGxlJyAoY2xpY2spPSdvcGVuUmVzb3VyY2UobW9kZWwpJyBjbGFzcz1cIlZsdC1idG4gVmx0LWJ0bi0td2hpdGUgVmx0LWJ0bi0taWNvblwiIGFyaWEtbGFiZWw9J0VkaXQnPlxuICAgICAgICA8c3ZnPjx1c2UgeGxpbms6aHJlZj1cInZvbHRhL3ZvbHRhLWljb25zLnN2ZyNWbHQtaWNvbi1lZGl0XCIvPjwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8c21hbGwgKm5nSWY9J2YuaW52YWxpZCAmJiAoKGYgfCBtZXRhTW9kZWwpLl9wYXJlbnQuc3VibWl0dGVkIHx8ICgoZnQgfCBtZXRhTW9kZWwpLnRvdWNoZWQgJiYga2V5TGlzdGVuZXJBY3RpdmUpKScgY2xhc3M9XCJWbHQtZm9ybV9fZWxlbWVudF9fZXJyb3JcIj5cbiAgICA8c3BhbiAqbmdJZj1cImYuZXJyb3JzLnJlcXVpcmVkXCI+UmVxdWlyZWQ8L3NwYW4+XG4gICAgPHNwYW4gKm5nSWY9XCJmLmVycm9ycy5wYXR0ZXJuXCI+U2hvdWxkIG1hdGNoICd7e3ZhbGlkYXRpb25zLnBhdHRlcm59fScgcGF0dGVybjwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cImYuZXJyb3JzLmN1c3RvbVwiPnt7Zi5lcnJvcnMuY3VzdG9tfX0mbmJzcDs8L3NwYW4+XG4gIDwvc21hbGw+XG4gIDxzbWFsbCAqbmdJZj0nbWV0YS5oZWxwVGV4dCB8fCBtZXRhLmhpbnQnIGNsYXNzPVwiVmx0LWZvcm1fX2VsZW1lbnRfX2hpbnRcIj57e21ldGEuaGVscFRleHQgfHwgbWV0YS5oaW50fX08L3NtYWxsPlxuPC9kaXY+XG4iXX0=