ngx-bimplus-components 0.0.159-29471-1 → 0.0.160

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 (158) hide show
  1. package/esm2022/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.mjs +5 -40
  2. package/esm2022/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.mjs +2 -5
  3. package/esm2022/lib/components/bimplus-connection-designer/bimplus-connection-designer.component.mjs +5 -5
  4. package/esm2022/lib/components/bimplus-connection-designer-results/bimplus-connection-designer-results.component.mjs +3 -3
  5. package/esm2022/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.mjs +7 -115
  6. package/esm2022/lib/components/bimplus-flat-tree/bimplus-flat-tree.interface.mjs +1 -1
  7. package/esm2022/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.mjs +1 -1
  8. package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-dialog-config-settings.mjs +1 -1
  9. package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.component.mjs +3 -3
  10. package/esm2022/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.component.mjs +3 -3
  11. package/esm2022/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.mjs +32 -12
  12. package/esm2022/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.mjs +3 -3
  13. package/esm2022/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.interface.mjs +1 -1
  14. package/esm2022/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.mjs +7 -3
  15. package/esm2022/lib/components/bimplus-object-structure/bimplus-object-structure.component.mjs +4 -42
  16. package/esm2022/lib/components/bimplus-object-structure/bimplus-object-structure.interface.mjs +2 -4
  17. package/esm2022/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.mjs +8 -31
  18. package/esm2022/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.mjs +8 -34
  19. package/esm2022/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.mjs +1 -1
  20. package/esm2022/lib/components/object-properties-header/object-properties-header.component.mjs +6 -48
  21. package/esm2022/lib/components/object-properties-header/object-properties-header.interface.mjs +1 -1
  22. package/esm2022/lib/components/resizable-panel/resizable-panel.component.mjs +10 -54
  23. package/esm2022/public-api.mjs +1 -22
  24. package/fesm2022/ngx-bimplus-components.mjs +112 -4329
  25. package/fesm2022/ngx-bimplus-components.mjs.map +1 -1
  26. package/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.d.ts +3 -14
  27. package/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.d.ts +1 -7
  28. package/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.d.ts +3 -16
  29. package/lib/components/bimplus-flat-tree/bimplus-flat-tree.interface.d.ts +0 -4
  30. package/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.d.ts +1 -1
  31. package/lib/components/bimplus-general-overlay-dialog/bimplus-general-dialog-config-settings.d.ts +3 -3
  32. package/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.d.ts +7 -5
  33. package/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.d.ts +12 -12
  34. package/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.interface.d.ts +3 -3
  35. package/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.d.ts +1 -0
  36. package/lib/components/bimplus-object-structure/bimplus-object-structure.component.d.ts +1 -5
  37. package/lib/components/bimplus-object-structure/bimplus-object-structure.interface.d.ts +0 -2
  38. package/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.d.ts +1 -8
  39. package/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.d.ts +1 -11
  40. package/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.d.ts +1 -1
  41. package/lib/components/object-properties-header/object-properties-header.component.d.ts +4 -13
  42. package/lib/components/object-properties-header/object-properties-header.interface.d.ts +0 -8
  43. package/lib/components/resizable-panel/resizable-panel.component.d.ts +3 -12
  44. package/package.json +4 -12
  45. package/public-api.d.ts +0 -21
  46. package/assets/images/default/Attachment_18_gray.svg +0 -1
  47. package/assets/images/default/Attachment_18_maincolor.svg +0 -3
  48. package/assets/images/default/Attachmentlink_18_gray.svg +0 -7
  49. package/assets/images/default/Attachmentlink_18_maincolor.svg +0 -7
  50. package/assets/images/default/Comments_18_gray.svg +0 -1
  51. package/assets/images/default/Comments_18_maincolor.svg +0 -4
  52. package/assets/images/default/Links_18_gray.svg +0 -1
  53. package/assets/images/default/Links_18_maincolor.svg +0 -4
  54. package/assets/images/default/Refresh_18_gray.svg +0 -1
  55. package/assets/images/default/bimplus_WebIcons_Cross_Disabled.svg +0 -1
  56. package/assets/images/default/ic_models.svg +0 -3
  57. package/assets/images/default/ic_models_maincolor.svg +0 -3
  58. package/assets/images/default/icn_grid_attachments.png +0 -0
  59. package/assets/images/default/icn_grid_hyperlinks.png +0 -0
  60. package/assets/images/default/progress-spinner.svg +0 -1
  61. package/esm2022/lib/components/bimplus-attachments/bimplus-attachments.component.mjs +0 -114
  62. package/esm2022/lib/components/bimplus-attachments/bimplus-attachments.interface.mjs +0 -38
  63. package/esm2022/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.mjs +0 -95
  64. package/esm2022/lib/components/bimplus-attachments/services/bimplus-attachments.service.mjs +0 -32
  65. package/esm2022/lib/components/bimplus-comment/IComment.mjs +0 -2
  66. package/esm2022/lib/components/bimplus-comment/bimplus-comment.component.mjs +0 -118
  67. package/esm2022/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.mjs +0 -64
  68. package/esm2022/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.mjs +0 -161
  69. package/esm2022/lib/components/bimplus-input-number/bimplus-input-number.component.mjs +0 -85
  70. package/esm2022/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.mjs +0 -92
  71. package/esm2022/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.mjs +0 -78
  72. package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.mjs +0 -385
  73. package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.interface.mjs +0 -3
  74. package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.service.mjs +0 -104
  75. package/esm2022/lib/components/bimplus-object-comments-list/bimplusObjectCommentsI.mjs +0 -2
  76. package/esm2022/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.mjs +0 -77
  77. package/esm2022/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.mjs +0 -83
  78. package/esm2022/lib/components/bimplus-status-bar/bimplus-status-bar.component.mjs +0 -35
  79. package/esm2022/lib/components/bimplus-status-bar/bimplus-status-bar.service.mjs +0 -35
  80. package/esm2022/lib/components/bimplus-status-bar/statusBar.mjs +0 -2
  81. package/esm2022/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.mjs +0 -38
  82. package/esm2022/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.mjs +0 -10
  83. package/esm2022/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.mjs +0 -89
  84. package/esm2022/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.mjs +0 -33
  85. package/esm2022/lib/components/bimplus-textarea/autoResizeTextarea.directive.mjs +0 -83
  86. package/esm2022/lib/components/bimplus-textarea/bimplus-textarea.component.mjs +0 -128
  87. package/esm2022/lib/components/links-to-documents/links-to-documents.component.mjs +0 -373
  88. package/esm2022/lib/components/object-hyperlinks/object-hyperlinks.component.mjs +0 -145
  89. package/esm2022/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.mjs +0 -36
  90. package/esm2022/lib/components/object-preview/object-preview.component.mjs +0 -284
  91. package/esm2022/lib/components/object-preview/object-preview.interface.mjs +0 -2
  92. package/esm2022/lib/components/object-properties/object-properties.component.mjs +0 -536
  93. package/esm2022/lib/components/object-properties/object-properties.interface.mjs +0 -2
  94. package/esm2022/lib/components/object-properties/object-properties.service.mjs +0 -26
  95. package/esm2022/lib/components/object-properties-group/object-properties-group.component.mjs +0 -124
  96. package/esm2022/lib/components/object-properties-group/object-property-value/object-property-value.component.mjs +0 -55
  97. package/esm2022/lib/pipes/bit-converter.pipe.mjs +0 -46
  98. package/esm2022/lib/pipes/get-attribute-value-as-string.pipe.mjs +0 -173
  99. package/esm2022/lib/pipes/get-attribute-value.pipe.mjs +0 -162
  100. package/esm2022/lib/pipes/round.pipe.mjs +0 -20
  101. package/esm2022/lib/services/decorators.service.mjs +0 -65
  102. package/esm2022/lib/utils/objectProperties.mjs +0 -9
  103. package/esm2022/lib/validators/double-enum.validator.mjs +0 -17
  104. package/esm2022/lib/validators/double.validator.mjs +0 -23
  105. package/esm2022/lib/validators/guid-enum.validator.mjs +0 -17
  106. package/esm2022/lib/validators/guid.validator.mjs +0 -11
  107. package/esm2022/lib/validators/integer.validator.mjs +0 -20
  108. package/esm2022/lib/validators/string-combobox.validator.mjs +0 -17
  109. package/esm2022/lib/validators/string-enum.validator.mjs +0 -17
  110. package/lib/components/bimplus-attachments/bimplus-attachments.component.d.ts +0 -39
  111. package/lib/components/bimplus-attachments/bimplus-attachments.interface.d.ts +0 -33
  112. package/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.d.ts +0 -30
  113. package/lib/components/bimplus-attachments/services/bimplus-attachments.service.d.ts +0 -8
  114. package/lib/components/bimplus-comment/IComment.d.ts +0 -4
  115. package/lib/components/bimplus-comment/bimplus-comment.component.d.ts +0 -39
  116. package/lib/components/bimplus-input-checkbox/bimplus-input-checkbox.component.d.ts +0 -18
  117. package/lib/components/bimplus-input-combobox/bimplus-input-combobox.component.d.ts +0 -41
  118. package/lib/components/bimplus-input-number/bimplus-input-number.component.d.ts +0 -26
  119. package/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.d.ts +0 -28
  120. package/lib/components/bimplus-link-tooltip-message/bimplus-link-tooltip-message.component.d.ts +0 -22
  121. package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.d.ts +0 -87
  122. package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.interface.d.ts +0 -10
  123. package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.service.d.ts +0 -20
  124. package/lib/components/bimplus-object-comments-list/bimplusObjectCommentsI.d.ts +0 -11
  125. package/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.d.ts +0 -29
  126. package/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.d.ts +0 -24
  127. package/lib/components/bimplus-status-bar/bimplus-status-bar.component.d.ts +0 -14
  128. package/lib/components/bimplus-status-bar/bimplus-status-bar.service.d.ts +0 -14
  129. package/lib/components/bimplus-status-bar/statusBar.d.ts +0 -4
  130. package/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.d.ts +0 -16
  131. package/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.d.ts +0 -18
  132. package/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.d.ts +0 -36
  133. package/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.d.ts +0 -15
  134. package/lib/components/bimplus-textarea/autoResizeTextarea.directive.d.ts +0 -24
  135. package/lib/components/bimplus-textarea/bimplus-textarea.component.d.ts +0 -42
  136. package/lib/components/links-to-documents/links-to-documents.component.d.ts +0 -68
  137. package/lib/components/object-hyperlinks/object-hyperlinks.component.d.ts +0 -32
  138. package/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.d.ts +0 -15
  139. package/lib/components/object-preview/object-preview.component.d.ts +0 -45
  140. package/lib/components/object-preview/object-preview.interface.d.ts +0 -5
  141. package/lib/components/object-properties/object-properties.component.d.ts +0 -78
  142. package/lib/components/object-properties/object-properties.interface.d.ts +0 -22
  143. package/lib/components/object-properties/object-properties.service.d.ts +0 -12
  144. package/lib/components/object-properties-group/object-properties-group.component.d.ts +0 -29
  145. package/lib/components/object-properties-group/object-property-value/object-property-value.component.d.ts +0 -14
  146. package/lib/pipes/bit-converter.pipe.d.ts +0 -17
  147. package/lib/pipes/get-attribute-value-as-string.pipe.d.ts +0 -35
  148. package/lib/pipes/get-attribute-value.pipe.d.ts +0 -35
  149. package/lib/pipes/round.pipe.d.ts +0 -7
  150. package/lib/services/decorators.service.d.ts +0 -12
  151. package/lib/utils/objectProperties.d.ts +0 -2
  152. package/lib/validators/double-enum.validator.d.ts +0 -2
  153. package/lib/validators/double.validator.d.ts +0 -2
  154. package/lib/validators/guid-enum.validator.d.ts +0 -2
  155. package/lib/validators/guid.validator.d.ts +0 -2
  156. package/lib/validators/integer.validator.d.ts +0 -2
  157. package/lib/validators/string-combobox.validator.d.ts +0 -2
  158. package/lib/validators/string-enum.validator.d.ts +0 -2
@@ -1,536 +0,0 @@
1
- import { Component, ViewEncapsulation, Input, signal, EventEmitter, Output } from '@angular/core';
2
- import { ExpansionPanelComponent } from '../expansion-panel/expansion-panel.component';
3
- import { ExpansionPanelHeaderComponent } from '../expansion-panel-header/expansion-panel-header.component';
4
- import { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';
5
- import { TranslateModule } from '@ngx-translate/core';
6
- import { ObjectStructureNodeBuilder, } from '../bimplus-object-structure/bimplus-object-structure.interface';
7
- import { from, BehaviorSubject } from 'rxjs';
8
- import { BimplusObjectStructureComponent } from '../bimplus-object-structure/bimplus-object-structure.component';
9
- import { ComplexPropertiesNodeBuilder, } from '../bimplus-object-complex-properties/bimplus-object-complex-properties.interface';
10
- import { BimplusObjectComplexPropertiesComponent } from '../bimplus-object-complex-properties/bimplus-object-complex-properties.component';
11
- import { BimplusButtonsRowComponent } from '../bimplus-buttons-row/bimplus-buttons-row.component';
12
- import { BimplusScrollableContainerComponent } from '../bimplus-scrollable-container/bimplus-scrollable-container.component';
13
- import { ObjectPropertiesGroupComponent } from '../object-properties-group/object-properties-group.component';
14
- import { isObjectPropertyValueBlank } from '../../utils/objectProperties';
15
- import { FormGroup, ReactiveFormsModule, FormControl, Validators } from '@angular/forms';
16
- import { GetAttributeValue } from '../../pipes/get-attribute-value.pipe';
17
- import { doubleValidator } from '../../validators/double.validator';
18
- import { integerValidator } from '../../validators/integer.validator';
19
- import { guidValidator } from '../../validators/guid.validator';
20
- import { doubleEnumValidator } from '../../validators/double-enum.validator';
21
- import { ObjectPreviewComponent } from "../object-preview/object-preview.component";
22
- import { guidEnumValidator } from '../../validators/guid-enum.validator';
23
- import { stringEnumValidator } from '../../validators/string-enum.validator';
24
- import { stringComboboxValidator } from '../../validators/string-combobox.validator';
25
- import * as i0 from "@angular/core";
26
- import * as i1 from "@ngx-translate/core";
27
- import * as i2 from "@angular/forms";
28
- import * as i3 from "./object-properties.service";
29
- export class ObjectPropertiesComponent extends BimplusLocalizedWidgetComponent {
30
- _objectPropertiesGroupForm(group_name) {
31
- const _groupForm = this._objectPropertiesForm;
32
- return _groupForm.controls[group_name];
33
- }
34
- constructor(translateService, formBuilder, cdr, objectPropertiesService) {
35
- super(translateService);
36
- this.formBuilder = formBuilder;
37
- this.cdr = cdr;
38
- this.objectPropertiesService = objectPropertiesService;
39
- this._objectPropertiesForm = new FormGroup({});
40
- this._editMode = signal(false);
41
- this._objectStructure = null;
42
- this._complexProperties = null;
43
- this.api = null;
44
- this.revision = undefined;
45
- this._canUpdateObject = signal(false);
46
- this._rootObjectId = "";
47
- this.isSaveButtonDisabled$ = new BehaviorSubject(true);
48
- this.visibleNodeSignal = signal({ id: "", visible: false, opaque: false });
49
- this.opaqueNodeSignal = signal({ id: "", visible: false, opaque: false });
50
- this._currentObjectId$ = new BehaviorSubject("");
51
- this._currentPropertiesObjectId$ = new BehaviorSubject("");
52
- this.buttonRowItems = [];
53
- this.configEditProperties = [];
54
- this.configEditedProperties = [];
55
- this.updatedObjectProperties = new EventEmitter();
56
- this.objectAttributeGroups = signal([]);
57
- this.initialFormValues = "";
58
- }
59
- get objectStructure() {
60
- return this._objectStructure;
61
- }
62
- get complexProperties() {
63
- return this._complexProperties;
64
- }
65
- set canUpdateObject(canUpdateObject) {
66
- this._canUpdateObject.set(canUpdateObject);
67
- }
68
- set rootObjectId(id) {
69
- this._currentObjectId$.next(id);
70
- this._createObjectStructure(id, this.revision);
71
- this._rootObjectId = id;
72
- }
73
- get rootObjectId() {
74
- return this._rootObjectId;
75
- }
76
- _editPropertiesButtonsConfiguration() {
77
- this.configEditProperties.push({
78
- id: 'edit-properties',
79
- title: this.translateService.instant('_Edit_properties'),
80
- tooltip: this.translateService.instant('_Edit_properties'),
81
- disabled: !this._canUpdateObject(),
82
- buttonStyle: 'primary',
83
- });
84
- }
85
- _editedPropertiesButtonsConfiguration() {
86
- this.configEditedProperties.push({
87
- id: 'save-changed-properties',
88
- title: this.translateService.instant('_Save'),
89
- tooltip: this.translateService.instant('_Save'),
90
- disabled: this.isSaveButtonDisabled$,
91
- buttonStyle: 'primary',
92
- });
93
- this.configEditedProperties.push({
94
- id: 'cancel-editing-properties',
95
- title: this.translateService.instant('_Cancel'),
96
- tooltip: this.translateService.instant('_Cancel'),
97
- disabled: false,
98
- buttonStyle: 'secondary',
99
- });
100
- }
101
- ngOnInit() {
102
- this._editPropertiesButtonsConfiguration();
103
- this._editedPropertiesButtonsConfiguration();
104
- this.buttonRowItems = this.configEditProperties;
105
- this.subscribeProperties();
106
- }
107
- subscribeProperties() {
108
- this._currentPropertiesObjectId$.subscribe({
109
- next: (id) => {
110
- if (id) {
111
- this._createObjectProperties(id, this.revision);
112
- }
113
- },
114
- });
115
- this._currentObjectId$.subscribe({
116
- next: (id) => {
117
- this._currentPropertiesObjectId$.next(id);
118
- this._createComplexPropertiestructure(id, this.revision);
119
- },
120
- });
121
- }
122
- handleObjectStructureNodeSelected(node) {
123
- console.log(node);
124
- this._currentObjectId$.next(node.id);
125
- }
126
- handleObjectStructureNodeVisible(node) {
127
- const objNode = {
128
- id: node.id,
129
- visible: node.visible,
130
- opaque: node.opaque
131
- };
132
- this.visibleNodeSignal.set(objNode); // Update the signal
133
- }
134
- handleObjectStructureNodeOpaque(node) {
135
- const objNode = {
136
- id: node.id,
137
- visible: node.visible,
138
- opaque: node.opaque
139
- };
140
- this.opaqueNodeSignal.set(objNode); // Update the signal
141
- }
142
- handleComplexPropertyNodeSelected(node) {
143
- console.log(node);
144
- this._currentPropertiesObjectId$.next(node.id);
145
- }
146
- _loadObjectStructure(objectId, revision) {
147
- if (!this.api) {
148
- return;
149
- }
150
- if (!objectId) {
151
- return;
152
- }
153
- return from(this.api.objects.getTopology(objectId, revision, false, false, undefined));
154
- }
155
- _createObjectStructure(objectId, revision) {
156
- this._loadObjectStructure(objectId, revision)?.subscribe({
157
- next: (structureData) => {
158
- if (structureData) {
159
- this._objectStructure =
160
- ObjectStructureNodeBuilder.createFromResponse(structureData);
161
- }
162
- },
163
- });
164
- }
165
- _loadObjectComplexPropertiesStructure(objectId, revision) {
166
- if (!this.api) {
167
- return;
168
- }
169
- if (!objectId) {
170
- return;
171
- }
172
- return from(this.api.objects.getComplexPropertiesTopology(objectId, revision));
173
- }
174
- _createComplexPropertiestructure(objectId, revision) {
175
- this._loadObjectComplexPropertiesStructure(objectId, revision)?.subscribe({
176
- next: (structureData) => {
177
- if (structureData) {
178
- const complexProps = ComplexPropertiesNodeBuilder.createFromResponse(structureData);
179
- if (complexProps?.children?.length) {
180
- this._complexProperties = complexProps;
181
- }
182
- else {
183
- this._complexProperties = null;
184
- }
185
- }
186
- },
187
- });
188
- }
189
- _loadObjectProperties(objectId, revision) {
190
- if (!this.api) {
191
- return;
192
- }
193
- if (!objectId) {
194
- return;
195
- }
196
- return from(this.api.objects.get(objectId, revision, '8', undefined, false, undefined));
197
- }
198
- _createObjectProperties(objectId, revision) {
199
- this._loadObjectProperties(objectId, revision)?.subscribe({
200
- // properties response is badly structured, nearly impossible to create class structure from it. Therefore using shortcut
201
- // any for json response
202
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
203
- next: (propertiesData) => {
204
- this.objectPropertiesService.setModel(propertiesData);
205
- this.objectAttributeGroups.set(this._createAttributeGroupsFromResponse(propertiesData));
206
- },
207
- error: () => {
208
- this.objectAttributeGroups.set([]);
209
- },
210
- });
211
- }
212
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
213
- _tooltip(attrib) {
214
- const nameTitle = this.translateService.instant('_Name');
215
- const name = attrib.name ? attrib.name : '';
216
- const descriptionTitle = this.translateService.instant('description');
217
- const description = attrib.description;
218
- const uuidTitle = this.translateService.instant('_UUID');
219
- const uuid = attrib.id;
220
- if (description === null ||
221
- description === undefined ||
222
- description === '') {
223
- return `${nameTitle}: ${name}\n${uuidTitle}: ${uuid}`;
224
- }
225
- return `${nameTitle}: ${name}\n${descriptionTitle}: ${description}\n${uuidTitle}: ${uuid}`;
226
- }
227
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
228
- _createAttributeGroupsFromResponse(propertiesData) {
229
- const groups = [];
230
- let localizedAttribGroups = null;
231
- if (propertiesData.localizedAttributeGroups) {
232
- localizedAttribGroups = propertiesData.localizedAttributeGroups;
233
- }
234
- if (!propertiesData.attributes) {
235
- return groups;
236
- }
237
- const attribGroups = propertiesData.attributes;
238
- for (const [groupName, attribsObject] of Object.entries(attribGroups)) {
239
- const newGroup = {
240
- name: groupName,
241
- expanded: false,
242
- attributes: [],
243
- };
244
- if (localizedAttribGroups?.[groupName]) {
245
- newGroup.name = localizedAttribGroups[groupName];
246
- }
247
- if (!attribsObject) {
248
- continue;
249
- }
250
- for (const attrib of Object.values(attribsObject)) {
251
- const newAttrib = {
252
- id: attrib.id,
253
- name: attrib.name,
254
- description: attrib.description,
255
- value: attrib.value,
256
- group: attrib.group,
257
- type: attrib.type,
258
- unit: attrib.unit,
259
- decimal: attrib.decimal,
260
- control: attrib.control,
261
- enumdefinition: attrib.enumdefinition,
262
- isChangeable: attrib.isChangeable,
263
- tooltip: this._tooltip(attrib),
264
- minValue: attrib.minValue,
265
- maxValue: attrib.maxValue,
266
- };
267
- newGroup.attributes.push(newAttrib);
268
- }
269
- groups.push(newGroup);
270
- }
271
- return groups;
272
- }
273
- _deleteForm() {
274
- this._objectPropertiesForm = new FormGroup({});
275
- }
276
- _createForm() {
277
- const _getAttributeValue = new GetAttributeValue();
278
- const _form = {};
279
- this.objectAttributeGroups().forEach(groupAttributes => {
280
- const _form_group = {};
281
- groupAttributes.attributes.forEach(attribute => {
282
- if ((typeof attribute.type === 'string' && /^boolean$/i.test(attribute.type)) && !attribute.control) {
283
- _form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [Validators.pattern(/^(false|true|0|1)$/i)] : []);
284
- return;
285
- }
286
- if ((typeof attribute.type === 'string' && /^boolean$/i.test(attribute.type))
287
- && (typeof attribute.control === 'string' && /^checkbox$/i.test(attribute.control))) {
288
- _form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute));
289
- return;
290
- }
291
- if ((typeof attribute.type === 'string' && /^string$/i.test(attribute.type)) && !attribute.control) {
292
- _form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute));
293
- return;
294
- }
295
- if ((typeof attribute.type === 'string' && /^double$/i.test(attribute.type)) && !attribute.control) {
296
- _form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [doubleValidator(attribute.minValue, attribute.maxValue)] : []);
297
- return;
298
- }
299
- if ((typeof attribute.type === 'string' && /^int(32)?$/i.test(attribute.type)) && !attribute.control) {
300
- _form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [integerValidator(attribute.minValue, attribute.maxValue)] : []);
301
- return;
302
- }
303
- if ((typeof attribute.type === 'string' && /^guid$/i.test(attribute.type)) && !attribute.control) {
304
- _form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [guidValidator()] : []);
305
- return;
306
- }
307
- if ((typeof attribute.type === 'string' && /^double$/i.test(attribute.type))
308
- && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))) {
309
- _form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [doubleEnumValidator(attribute.enumdefinition)] : []);
310
- return;
311
- }
312
- if ((typeof attribute.type === 'string' && /^guid$/i.test(attribute.type))
313
- && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))) {
314
- _form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [guidEnumValidator(attribute.enumdefinition)] : []);
315
- return;
316
- }
317
- if ((typeof attribute.type === 'string' && /^int(32)?$/i.test(attribute.type))
318
- && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))) {
319
- _form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [doubleEnumValidator(attribute.enumdefinition)] : []);
320
- return;
321
- }
322
- if ((typeof attribute.type === 'string' && /^string$/i.test(attribute.type))
323
- && (typeof attribute.control === 'string' && /^enumeration$/i.test(attribute.control))) {
324
- _form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [stringEnumValidator(attribute.enumdefinition)] : []);
325
- return;
326
- }
327
- if ((typeof attribute.type === 'string' && /^string$/i.test(attribute.type))
328
- && (typeof attribute.control === 'string' && /^combobox$/i.test(attribute.control))) {
329
- _form_group[attribute.id] = this.formBuilder.control(_getAttributeValue.transform(attribute), attribute.isChangeable ? [stringComboboxValidator(attribute.enumdefinition)] : []);
330
- return;
331
- }
332
- });
333
- _form[groupAttributes.name] = this.formBuilder.group(_form_group);
334
- });
335
- this._objectPropertiesForm = this.formBuilder.group(_form);
336
- this.initialFormValues = JSON.stringify(this._objectPropertiesForm.value);
337
- this._objectPropertiesForm.valueChanges.subscribe({
338
- next: (value) => {
339
- const changed = JSON.stringify(value) !== this.initialFormValues;
340
- this.isSaveButtonDisabled$.next(!(this._objectPropertiesForm.valid && changed));
341
- }
342
- });
343
- }
344
- _getPropertyName(uuid) {
345
- const attrGroups = this.objectAttributeGroups();
346
- for (const attrGroup of attrGroups) {
347
- for (const attr of attrGroup.attributes) {
348
- if (attr.id === uuid) {
349
- return attr.name;
350
- }
351
- }
352
- }
353
- return '';
354
- }
355
- _getPropertyType(uuid) {
356
- const attrGroups = this.objectAttributeGroups();
357
- for (const attrGroup of attrGroups) {
358
- for (const attr of attrGroup.attributes) {
359
- if (attr.id === uuid) {
360
- return attr.type;
361
- }
362
- }
363
- }
364
- return '';
365
- }
366
- _getPropertyControl(uuid) {
367
- const attrGroups = this.objectAttributeGroups();
368
- for (const attrGroup of attrGroups) {
369
- for (const attr of attrGroup.attributes) {
370
- if (attr.id === uuid) {
371
- return attr.control;
372
- }
373
- }
374
- }
375
- return '';
376
- }
377
- _convertValueToBoolean(value) {
378
- return /^true$/i.test(value) || /^1$/i.test(value);
379
- }
380
- _convertValueToDouble(value) {
381
- return parseFloat(value);
382
- }
383
- _hasBeenValueChanged(uuid, value) {
384
- const attrGroups = this.objectAttributeGroups();
385
- for (const attrGroup of attrGroups) {
386
- for (const attr of attrGroup.attributes) {
387
- if (attr.id === uuid) {
388
- return value !== attr.value;
389
- }
390
- }
391
- }
392
- return false;
393
- }
394
- _getChangedData(formGroup) {
395
- const changedData = {};
396
- Object.keys(formGroup.controls).forEach(key => {
397
- const control = formGroup.get(key);
398
- if (control instanceof FormControl) {
399
- // If it's a FormControl and it's dirty, capture the changed value
400
- if (control.dirty) {
401
- const propName = this._getPropertyName(key);
402
- const propType = this._getPropertyType(key);
403
- // const propControl: string = this._getPropertyControl(key);
404
- if (propName === '') {
405
- const _newValue = {
406
- id: key,
407
- value: control.value
408
- };
409
- changedData[key] = _newValue;
410
- }
411
- else {
412
- if (/^boolean$/i.test(propType)) {
413
- const _val = this._convertValueToBoolean(control.value);
414
- if (this._hasBeenValueChanged(key, _val)) {
415
- const _newValue = {
416
- id: key,
417
- value: _val
418
- };
419
- changedData[propName] = _newValue;
420
- }
421
- }
422
- else if (/^double$/i.test(propType)) {
423
- const _val = this._convertValueToDouble(control.value);
424
- if (this._hasBeenValueChanged(key, _val)) {
425
- const _newValue = {
426
- id: key,
427
- value: _val
428
- };
429
- changedData[propName] = _newValue;
430
- }
431
- }
432
- else {
433
- const _val = control.value;
434
- if (this._hasBeenValueChanged(key, control.value)) {
435
- const _newValue = {
436
- id: key,
437
- value: _val
438
- };
439
- changedData[propName] = _newValue;
440
- }
441
- }
442
- }
443
- }
444
- }
445
- else if (control instanceof FormGroup) {
446
- if (control.dirty) {
447
- // Recursively get changed data from nested FormGroup
448
- const nestedChanges = this._getChangedData(control);
449
- if (Object.keys(nestedChanges).length > 0) {
450
- changedData[key] = nestedChanges;
451
- }
452
- }
453
- }
454
- });
455
- return changedData;
456
- }
457
- _saveObjectProperties() {
458
- const saveData = {};
459
- saveData['id'] = this._currentObjectId$.value;
460
- saveData['unsaved'] = true;
461
- saveData['attributes'] = this._getChangedData(this._objectPropertiesForm);
462
- this.saveObjectProperties(saveData);
463
- }
464
- buttonClicked($event) {
465
- if ($event.id === 'edit-properties') {
466
- this._editMode.set(true);
467
- this._createForm();
468
- console.log('Edit properties clicked');
469
- this.buttonRowItems = this.configEditedProperties;
470
- }
471
- if ($event.id === 'save-changed-properties') {
472
- this._saveObjectProperties();
473
- this._editMode.set(false);
474
- this._deleteForm();
475
- this.buttonRowItems = this.configEditProperties;
476
- console.log('Save changed properties clicked');
477
- }
478
- if ($event.id === 'cancel-editing-properties') {
479
- this._editMode.set(false);
480
- this._deleteForm();
481
- this.buttonRowItems = this.configEditProperties;
482
- console.log('Cancel edit properties clicked');
483
- }
484
- }
485
- hasSetAnyAttribute(objectAttributeGroup) {
486
- return objectAttributeGroup.attributes.some((attrib) => {
487
- return !isObjectPropertyValueBlank(attrib);
488
- });
489
- }
490
- saveObjectProperties(data) {
491
- const selectedObjectId = this._currentPropertiesObjectId$.value;
492
- if (!data || !selectedObjectId) {
493
- return;
494
- }
495
- if (!this.api) {
496
- return;
497
- }
498
- from(this.api.objects.put(selectedObjectId, JSON.stringify(data))).subscribe({
499
- next: (response) => {
500
- this._createObjectProperties(selectedObjectId, this.revision);
501
- this._createObjectStructure(selectedObjectId, this.revision);
502
- this.updatedObjectProperties.emit({ id: selectedObjectId, request: data, response });
503
- },
504
- });
505
- }
506
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ObjectPropertiesComponent, deps: [{ token: i1.TranslateService }, { token: i2.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: i3.ObjectPropertiesService }], target: i0.ɵɵFactoryTarget.Component }); }
507
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: ObjectPropertiesComponent, isStandalone: true, selector: "lib-object-properties", inputs: { api: "api", revision: "revision", canUpdateObject: "canUpdateObject", rootObjectId: "rootObjectId" }, outputs: { updatedObjectProperties: "updatedObjectProperties" }, usesInheritance: true, ngImport: i0, template: "<lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n/>\r\n\r\n<div class=\"object-properties\">\r\n\r\n <lib-bimplus-scrollable-container>\r\n <lib-expansion-panel class=\"object-properties-preview-panel\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-structure-header\">{{\"_3D preview\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-object-preview \r\n [api]=\"api\" \r\n [revision]=\"revision\" \r\n [objectId]=\"rootObjectId\"\r\n [visibleNode]=\"visibleNodeSignal()\"\t\r\n [opaqueNode]=\"opaqueNodeSignal()\"\r\n />\r\n </lib-expansion-panel>\r\n <!-- Object structure-->\r\n <lib-expansion-panel class=\"object-properties-object-structure-panel\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-structure-header\">{{\"_Object structure\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n @if (objectStructure) {\r\n <lib-bimplus-object-structure\r\n [objectStructure]=\"objectStructure\"\r\n (nodeSelected)=\"handleObjectStructureNodeSelected($event)\"\r\n (nodeVisible)= \"handleObjectStructureNodeVisible($event)\"\r\n (nodeOpaque)= \"handleObjectStructureNodeOpaque($event)\" \r\n />\r\n }\r\n </lib-expansion-panel>\r\n <!-- End Object structure-->\r\n\r\n <!-- Complex properties-->\r\n @if(complexProperties){\r\n <lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-header\"> {{\"_Object multiproperties tree\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-bimplus-object-complex-properties\r\n [complexProperties]=\"complexProperties\"\r\n (nodeSelected)=\"handleComplexPropertyNodeSelected($event)\"\r\n />\r\n </lib-expansion-panel>\r\n }\r\n <!-- End Complex properties-->\r\n\r\n @if(objectAttributeGroups().length > 0){\r\n <lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-header\">{{\"_Object properties\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <form [formGroup]=\"_objectPropertiesForm\" class=\"input-form\">\r\n @for (attribGroup of objectAttributeGroups(); track attribGroup) {\r\n @if(_editMode() || hasSetAnyAttribute(attribGroup)){\r\n <lib-expansion-panel [expanded]=\"attribGroup.expanded\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-group-header\"> {{attribGroup.name}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-object-properties-group\r\n [attributesGroup]=\"attribGroup\"\r\n [editMode]=\"_editMode()\"\r\n [canUpdateObject]=\"_canUpdateObject()\"\r\n [objectPropertiesForm]=\"_objectPropertiesGroupForm(attribGroup.name)\"\r\n />\r\n </lib-expansion-panel>\r\n }\r\n }\r\n </form>\r\n </lib-expansion-panel>\r\n }\r\n </lib-bimplus-scrollable-container>\r\n</div>\r\n", styles: [":host{height:100%;display:flex;flex-direction:column;flex:1}lib-bimplus-buttons-row{flex:0;--button-row-margin-right: .8rem}.object-properties{margin-left:.8rem;position:relative;flex:1}.object-properties .object-structure-header,.object-properties .object-properties-header{font-weight:700;text-transform:uppercase;font-size:1.4rem}.object-properties .object-properties-group-header{line-height:2.4rem}.object-properties lib-bimplus-object-structure{--bimplus-object-structure-background-color: var(--object-properties-background-color, var(--flat-tree-container-background-color-enabled))}.object-properties lib-bimplus-object-complex-properties{--bimplus-object-complex-properties-background-color: var(--object-properties-background-color, var(--flat-tree-container-background-color-enabled))}.object-properties lib-bimplus-scrollable-container{position:absolute;top:0;bottom:0;flex:1;width:100%}.object-properties .object-properties-object-structure-panel .expansion-panel,.object-properties lib-object-preview{margin-top:.8rem}\n"], dependencies: [{ kind: "component", type: ExpansionPanelComponent, selector: "lib-expansion-panel", inputs: ["expanded"] }, { kind: "component", type: ExpansionPanelHeaderComponent, selector: "lib-expansion-panel-header" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: BimplusObjectStructureComponent, selector: "lib-bimplus-object-structure", inputs: ["objectStructure"], outputs: ["nodeSelected", "nodeVisible", "nodeOpaque"] }, { kind: "component", type: BimplusObjectComplexPropertiesComponent, selector: "lib-bimplus-object-complex-properties", inputs: ["complexProperties"], outputs: ["nodeSelected"] }, { kind: "component", type: BimplusButtonsRowComponent, selector: "lib-bimplus-buttons-row", inputs: ["items", "isMultiple", "canUpdateObject"], outputs: ["fileChanged", "buttonClicked"] }, { kind: "component", type: BimplusScrollableContainerComponent, selector: "lib-bimplus-scrollable-container" }, { kind: "component", type: ObjectPropertiesGroupComponent, selector: "lib-object-properties-group", inputs: ["editMode", "objectPropertiesForm", "canUpdateObject", "attributesGroup"] }, { kind: "component", type: ObjectPreviewComponent, selector: "lib-object-preview", inputs: ["api", "objectId", "revision", "visibleNode", "opaqueNode"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }], encapsulation: i0.ViewEncapsulation.ShadowDom }); }
508
- }
509
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ObjectPropertiesComponent, decorators: [{
510
- type: Component,
511
- args: [{ selector: 'lib-object-properties', standalone: true, imports: [
512
- ExpansionPanelComponent,
513
- ExpansionPanelHeaderComponent,
514
- TranslateModule,
515
- BimplusObjectStructureComponent,
516
- BimplusObjectComplexPropertiesComponent,
517
- BimplusButtonsRowComponent,
518
- BimplusScrollableContainerComponent,
519
- ObjectPropertiesGroupComponent,
520
- ObjectPropertiesGroupComponent,
521
- ObjectPreviewComponent,
522
- ReactiveFormsModule,
523
- GetAttributeValue
524
- ], encapsulation: ViewEncapsulation.ShadowDom, template: "<lib-bimplus-buttons-row\r\n [items]=\"buttonRowItems\"\r\n (buttonClicked)=\"buttonClicked($event)\"\r\n/>\r\n\r\n<div class=\"object-properties\">\r\n\r\n <lib-bimplus-scrollable-container>\r\n <lib-expansion-panel class=\"object-properties-preview-panel\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-structure-header\">{{\"_3D preview\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-object-preview \r\n [api]=\"api\" \r\n [revision]=\"revision\" \r\n [objectId]=\"rootObjectId\"\r\n [visibleNode]=\"visibleNodeSignal()\"\t\r\n [opaqueNode]=\"opaqueNodeSignal()\"\r\n />\r\n </lib-expansion-panel>\r\n <!-- Object structure-->\r\n <lib-expansion-panel class=\"object-properties-object-structure-panel\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-structure-header\">{{\"_Object structure\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n @if (objectStructure) {\r\n <lib-bimplus-object-structure\r\n [objectStructure]=\"objectStructure\"\r\n (nodeSelected)=\"handleObjectStructureNodeSelected($event)\"\r\n (nodeVisible)= \"handleObjectStructureNodeVisible($event)\"\r\n (nodeOpaque)= \"handleObjectStructureNodeOpaque($event)\" \r\n />\r\n }\r\n </lib-expansion-panel>\r\n <!-- End Object structure-->\r\n\r\n <!-- Complex properties-->\r\n @if(complexProperties){\r\n <lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-header\"> {{\"_Object multiproperties tree\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-bimplus-object-complex-properties\r\n [complexProperties]=\"complexProperties\"\r\n (nodeSelected)=\"handleComplexPropertyNodeSelected($event)\"\r\n />\r\n </lib-expansion-panel>\r\n }\r\n <!-- End Complex properties-->\r\n\r\n @if(objectAttributeGroups().length > 0){\r\n <lib-expansion-panel>\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-header\">{{\"_Object properties\" | translate}}</span>\r\n </lib-expansion-panel-header>\r\n <form [formGroup]=\"_objectPropertiesForm\" class=\"input-form\">\r\n @for (attribGroup of objectAttributeGroups(); track attribGroup) {\r\n @if(_editMode() || hasSetAnyAttribute(attribGroup)){\r\n <lib-expansion-panel [expanded]=\"attribGroup.expanded\">\r\n <lib-expansion-panel-header>\r\n <span class=\"object-properties-group-header\"> {{attribGroup.name}}</span>\r\n </lib-expansion-panel-header>\r\n <lib-object-properties-group\r\n [attributesGroup]=\"attribGroup\"\r\n [editMode]=\"_editMode()\"\r\n [canUpdateObject]=\"_canUpdateObject()\"\r\n [objectPropertiesForm]=\"_objectPropertiesGroupForm(attribGroup.name)\"\r\n />\r\n </lib-expansion-panel>\r\n }\r\n }\r\n </form>\r\n </lib-expansion-panel>\r\n }\r\n </lib-bimplus-scrollable-container>\r\n</div>\r\n", styles: [":host{height:100%;display:flex;flex-direction:column;flex:1}lib-bimplus-buttons-row{flex:0;--button-row-margin-right: .8rem}.object-properties{margin-left:.8rem;position:relative;flex:1}.object-properties .object-structure-header,.object-properties .object-properties-header{font-weight:700;text-transform:uppercase;font-size:1.4rem}.object-properties .object-properties-group-header{line-height:2.4rem}.object-properties lib-bimplus-object-structure{--bimplus-object-structure-background-color: var(--object-properties-background-color, var(--flat-tree-container-background-color-enabled))}.object-properties lib-bimplus-object-complex-properties{--bimplus-object-complex-properties-background-color: var(--object-properties-background-color, var(--flat-tree-container-background-color-enabled))}.object-properties lib-bimplus-scrollable-container{position:absolute;top:0;bottom:0;flex:1;width:100%}.object-properties .object-properties-object-structure-panel .expansion-panel,.object-properties lib-object-preview{margin-top:.8rem}\n"] }]
525
- }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: i3.ObjectPropertiesService }], propDecorators: { api: [{
526
- type: Input
527
- }], revision: [{
528
- type: Input
529
- }], canUpdateObject: [{
530
- type: Input
531
- }], rootObjectId: [{
532
- type: Input
533
- }], updatedObjectProperties: [{
534
- type: Output
535
- }] } });
536
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LXByb3BlcnRpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJpbXBsdXMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvb2JqZWN0LXByb3BlcnRpZXMvb2JqZWN0LXByb3BlcnRpZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJpbXBsdXMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvb2JqZWN0LXByb3BlcnRpZXMvb2JqZWN0LXByb3BlcnRpZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDUCxpQkFBaUIsRUFDakIsS0FBSyxFQUVMLE1BQU0sRUFHUixZQUFZLEVBQ1osTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQzNHLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ2pILE9BQU8sRUFDTCxlQUFlLEVBRWhCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUVMLDBCQUEwQixHQUMzQixNQUFNLGdFQUFnRSxDQUFDO0FBR3hFLE9BQU8sRUFDTCxJQUFJLEVBQ0YsZUFBZSxFQUNsQixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ2pILE9BQU8sRUFFTCw0QkFBNEIsR0FDN0IsTUFBTSxrRkFBa0YsQ0FBQztBQUMxRixPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxrRkFBa0YsQ0FBQztBQUszSSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUts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Qix1Q0FBdUM7d0JBQ3ZDLDBCQUEwQjt3QkFDMUIsbUNBQW1DO3dCQUNuQyw4QkFBOEI7d0JBQzlCLDhCQUE4Qjt3QkFDOUIsc0JBQXNCO3dCQUN0QixtQkFBbUI7d0JBQ25CLGlCQUFpQjtxQkFDbEIsaUJBR2MsaUJBQWlCLENBQUMsU0FBUztxTEFtQ2pDLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBS08sWUFBWTtzQkFBeEIsS0FBSztnQkFxQkksdUJBQXVCO3NCQUFoQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnRcclxuICAsIFZpZXdFbmNhcHN1bGF0aW9uXHJcbiAgLCBJbnB1dFxyXG4gICwgT25Jbml0XHJcbiAgLCBzaWduYWxcclxuICAsIFdyaXRhYmxlU2lnbmFsXHJcbiAgLCBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT3V0cHV0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEV4cGFuc2lvblBhbmVsQ29tcG9uZW50IH0gZnJvbSAnLi4vZXhwYW5zaW9uLXBhbmVsL2V4cGFuc2lvbi1wYW5lbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFeHBhbnNpb25QYW5lbEhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL2V4cGFuc2lvbi1wYW5lbC1oZWFkZXIvZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCaW1wbHVzTG9jYWxpemVkV2lkZ2V0Q29tcG9uZW50IH0gZnJvbSAnLi4vYmltcGx1cy1sb2NhbGl6ZWQtd2lkZ2V0L2JpbXBsdXMtbG9jYWxpemVkLXdpZGdldC5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gIFRyYW5zbGF0ZU1vZHVsZVxyXG4gICwgVHJhbnNsYXRlU2VydmljZVxyXG59IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIE9iamVjdFN0cnVjdHVyZU5vZGUsXHJcbiAgT2JqZWN0U3RydWN0dXJlTm9kZUJ1aWxkZXIsXHJcbn0gZnJvbSAnLi4vYmltcGx1cy1vYmplY3Qtc3RydWN0dXJlL2JpbXBsdXMtb2JqZWN0LXN0cnVjdHVyZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQcmV2aWV3T2JqZWN0IH0gZnJvbSAnLi4vb2JqZWN0LXByZXZpZXcvb2JqZWN0LXByZXZpZXcuaW50ZXJmYWNlJztcclxuaW1wb3J0ICogYXMgV2ViU2RrIGZyb20gJ2JpbXBsdXMtd2Vic2RrJztcclxuaW1wb3J0IHtcclxuICBmcm9tXHJcbiAgLCBCZWhhdmlvclN1YmplY3RcclxufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQmltcGx1c09iamVjdFN0cnVjdHVyZUNvbXBvbmVudCB9IGZyb20gJy4uL2JpbXBsdXMtb2JqZWN0LXN0cnVjdHVyZS9iaW1wbHVzLW9iamVjdC1zdHJ1Y3R1cmUuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBDb21wbGV4UHJvcGVydGllc05vZGUsXHJcbiAgQ29tcGxleFByb3BlcnRpZXNOb2RlQnVpbGRlcixcclxufSBmcm9tICcuLi9iaW1wbHVzLW9iamVjdC1jb21wbGV4LXByb3BlcnRpZXMvYmltcGx1cy1vYmplY3QtY29tcGxleC1wcm9wZXJ0aWVzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEJpbXBsdXNPYmplY3RDb21wbGV4UHJvcGVydGllc0NvbXBvbmVudCB9IGZyb20gJy4uL2JpbXBsdXMtb2JqZWN0LWNvbXBsZXgtcHJvcGVydGllcy9iaW1wbHVzLW9iamVjdC1jb21wbGV4LXByb3BlcnRpZXMuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBPYmplY3RBdHRyaWJ1dGUsXHJcbiAgT2JqZWN0QXR0cmlidXRlR3JvdXAsXHJcbn0gZnJvbSAnLi9vYmplY3QtcHJvcGVydGllcy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBCaW1wbHVzQnV0dG9uc1Jvd0NvbXBvbmVudCB9IGZyb20gJy4uL2JpbXBsdXMtYnV0dG9ucy1yb3cvYmltcGx1cy1idXR0b25zLXJvdy5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gIEJpbXBsdXNCdXR0b25Sb3dJdGVtLFxyXG4gIEJpbXBsdXNCdXR0b25DbGlja0V2ZW50LFxyXG59IGZyb20gJy4uL2JpbXBsdXMtYnV0dG9ucy1yb3cvYmltcGx1cy1idXR0b25zLXJvdy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBCaW1wbHVzU2Nyb2xsYWJsZUNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4uL2JpbXBsdXMtc2Nyb2xsYWJsZS1jb250YWluZXIvYmltcGx1cy1zY3JvbGxhYmxlLWNvbnRhaW5lci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBPYmplY3RQcm9wZXJ0aWVzR3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9vYmplY3QtcHJvcGVydGllcy1ncm91cC9vYmplY3QtcHJvcGVydGllcy1ncm91cC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBpc09iamVjdFByb3BlcnR5VmFsdWVCbGFuayB9IGZyb20gJy4uLy4uL3V0aWxzL29iamVjdFByb3BlcnRpZXMnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1Hcm91cFxyXG4gICwgUmVhY3RpdmVGb3Jtc01vZHVsZVxyXG4gICwgRm9ybUJ1aWxkZXJcclxuICAsIEZvcm1Db250cm9sXHJcbiAgLCBWYWxpZGF0b3JzXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBHZXRBdHRyaWJ1dGVWYWx1ZSB9IGZyb20gJy4uLy4uL3BpcGVzL2dldC1hdHRyaWJ1dGUtdmFsdWUucGlwZSc7XHJcbmltcG9ydCB7IGRvdWJsZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvcnMvZG91YmxlLnZhbGlkYXRvcic7XHJcbmltcG9ydCB7IGludGVnZXJWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi92YWxpZGF0b3JzL2ludGVnZXIudmFsaWRhdG9yJztcclxuaW1wb3J0IHsgZ3VpZFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvcnMvZ3VpZC52YWxpZGF0b3InO1xyXG5pbXBvcnQgeyBkb3VibGVFbnVtVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vdmFsaWRhdG9ycy9kb3VibGUtZW51bS52YWxpZGF0b3InO1xyXG5pbXBvcnQgeyBPYmplY3RQcmV2aWV3Q29tcG9uZW50IH0gZnJvbSBcIi4uL29iamVjdC1wcmV2aWV3L29iamVjdC1wcmV2aWV3LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBPYmplY3RQcm9wZXJ0aWVzU2VydmljZSB9IGZyb20gJy4vb2JqZWN0LXByb3BlcnRpZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IGd1aWRFbnVtVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vdmFsaWRhdG9ycy9ndWlkLWVudW0udmFsaWRhdG9yJztcclxuaW1wb3J0IHsgc3RyaW5nRW51bVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvcnMvc3RyaW5nLWVudW0udmFsaWRhdG9yJztcclxuaW1wb3J0IHsgc3RyaW5nQ29tYm9ib3hWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi92YWxpZGF0b3JzL3N0cmluZy1jb21ib2JveC52YWxpZGF0b3InO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItb2JqZWN0LXByb3BlcnRpZXMnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRXhwYW5zaW9uUGFuZWxDb21wb25lbnQsXHJcbiAgICBFeHBhbnNpb25QYW5lbEhlYWRlckNvbXBvbmVudCxcclxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcclxuICAgIEJpbXBsdXNPYmplY3RTdHJ1Y3R1cmVDb21wb25lbnQsXHJcbiAgICBCaW1wbHVzT2JqZWN0Q29tcGxleFByb3BlcnRpZXNDb21wb25lbnQsXHJcbiAgICBCaW1wbHVzQnV0dG9uc1Jvd0NvbXBvbmVudCxcclxuICAgIEJpbXBsdXNTY3JvbGxhYmxlQ29udGFpbmVyQ29tcG9uZW50LFxyXG4gICAgT2JqZWN0UHJvcGVydGllc0dyb3VwQ29tcG9uZW50LFxyXG4gICAgT2JqZWN0UHJvcGVydGllc0dyb3VwQ29tcG9uZW50LFxyXG4gICAgT2JqZWN0UHJldmlld0NvbXBvbmVudCxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBHZXRBdHRyaWJ1dGVWYWx1ZVxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL29iamVjdC1wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9vYmplY3QtcHJvcGVydGllcy5jb21wb25lbnQubGVzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLlNoYWRvd0RvbSxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBPYmplY3RQcm9wZXJ0aWVzQ29tcG9uZW50XHJcbiAgZXh0ZW5kcyBCaW1wbHVzTG9jYWxpemVkV2lkZ2V0Q29tcG9uZW50XHJcbiAgaW1wbGVtZW50cyBPbkluaXRcclxue1xyXG4gIHByb3RlY3RlZCBfb2JqZWN0UHJvcGVydGllc0Zvcm0gID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblxyXG4gIHByb3RlY3RlZCBfb2JqZWN0UHJvcGVydGllc0dyb3VwRm9ybShncm91cF9uYW1lOiBzdHJpbmcpOiBGb3JtR3JvdXAge1xyXG4gICAgY29uc3QgX2dyb3VwRm9ybTogRm9ybUdyb3VwID0gdGhpcy5fb2JqZWN0UHJvcGVydGllc0Zvcm07XHJcbiAgICByZXR1cm4gX2dyb3VwRm9ybS5jb250cm9sc1tncm91cF9uYW1lXSBhcyBGb3JtR3JvdXA7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcih0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlXHJcbiAgICAsIHByaXZhdGUgcmVhZG9ubHkgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyXHJcbiAgICAsIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICAgLCBwcml2YXRlIHJlYWRvbmx5IG9iamVjdFByb3BlcnRpZXNTZXJ2aWNlOiBPYmplY3RQcm9wZXJ0aWVzU2VydmljZSApXHJcbiAge1xyXG4gICAgc3VwZXIodHJhbnNsYXRlU2VydmljZSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2VkaXRNb2RlID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcclxuICBwcml2YXRlIF9vYmplY3RTdHJ1Y3R1cmU6IE9iamVjdFN0cnVjdHVyZU5vZGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgZ2V0IG9iamVjdFN0cnVjdHVyZSgpOiBPYmplY3RTdHJ1Y3R1cmVOb2RlIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0U3RydWN0dXJlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY29tcGxleFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0aWVzTm9kZSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBnZXQgY29tcGxleFByb3BlcnRpZXMoKTogQ29tcGxleFByb3BlcnRpZXNOb2RlIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29tcGxleFByb3BlcnRpZXM7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBhcGk6IFdlYlNkay5BcGkgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSByZXZpc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgX2NhblVwZGF0ZU9iamVjdCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcbiAgQElucHV0KCkgc2V0IGNhblVwZGF0ZU9iamVjdChjYW5VcGRhdGVPYmplY3Q6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2NhblVwZGF0ZU9iamVjdC5zZXQoY2FuVXBkYXRlT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Jvb3RPYmplY3RJZCA6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KCkgc2V0IHJvb3RPYmplY3RJZChpZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50T2JqZWN0SWQkLm5leHQoaWQpO1xyXG4gICAgdGhpcy5fY3JlYXRlT2JqZWN0U3RydWN0dXJlKGlkLCB0aGlzLnJldmlzaW9uKTtcclxuICAgIHRoaXMuX3Jvb3RPYmplY3RJZCA9IGlkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJvb3RPYmplY3RJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Jvb3RPYmplY3RJZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNTYXZlQnV0dG9uRGlzYWJsZWQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSB2aXNpYmxlTm9kZVNpZ25hbDpXcml0YWJsZVNpZ25hbDxQcmV2aWV3T2JqZWN0PiA9IHNpZ25hbCh7aWQ6XCJcIix2aXNpYmxlOmZhbHNlLG9wYXF1ZTpmYWxzZX0pO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBvcGFxdWVOb2RlU2lnbmFsOldyaXRhYmxlU2lnbmFsPFByZXZpZXdPYmplY3Q+ID0gc2lnbmFsKHtpZDpcIlwiLHZpc2libGU6ZmFsc2Usb3BhcXVlOmZhbHNlfSk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1cnJlbnRPYmplY3RJZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gKFwiXCIpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1cnJlbnRQcm9wZXJ0aWVzT2JqZWN0SWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+IChcIlwiKTtcclxuXHJcbiAgYnV0dG9uUm93SXRlbXM6IEFycmF5PEJpbXBsdXNCdXR0b25Sb3dJdGVtPiA9IFtdO1xyXG4gIGNvbmZpZ0VkaXRQcm9wZXJ0aWVzOiBBcnJheTxCaW1wbHVzQnV0dG9uUm93SXRlbT4gPSBbXTtcclxuICBjb25maWdFZGl0ZWRQcm9wZXJ0aWVzOiBBcnJheTxCaW1wbHVzQnV0dG9uUm93SXRlbT4gPSBbXTtcclxuXHJcbiAgQE91dHB1dCgpIHVwZGF0ZWRPYmplY3RQcm9wZXJ0aWVzID0gbmV3IEV2ZW50RW1pdHRlcjx7IFtrZXk6IHN0cmluZ106IHVua25vd24gfT4oKTtcclxuXHJcbiAgX2VkaXRQcm9wZXJ0aWVzQnV0dG9uc0NvbmZpZ3VyYXRpb24oKSB7XHJcbiAgICB0aGlzLmNvbmZpZ0VkaXRQcm9wZXJ0aWVzLnB1c2goe1xyXG4gICAgICBpZDogJ2VkaXQtcHJvcGVydGllcycsXHJcbiAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0VkaXRfcHJvcGVydGllcycpLFxyXG4gICAgICB0b29sdGlwOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0VkaXRfcHJvcGVydGllcycpLFxyXG4gICAgICBkaXNhYmxlZDogIXRoaXMuX2NhblVwZGF0ZU9iamVjdCgpLFxyXG4gICAgICBidXR0b25TdHlsZTogJ3ByaW1hcnknLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfZWRpdGVkUHJvcGVydGllc0J1dHRvbnNDb25maWd1cmF0aW9uKCkge1xyXG4gICAgdGhpcy5jb25maWdFZGl0ZWRQcm9wZXJ0aWVzLnB1c2goe1xyXG4gICAgICBpZDogJ3NhdmUtY2hhbmdlZC1wcm9wZXJ0aWVzJyxcclxuICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdfU2F2ZScpLFxyXG4gICAgICB0b29sdGlwOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX1NhdmUnKSxcclxuICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNTYXZlQnV0dG9uRGlzYWJsZWQkLFxyXG4gICAgICBidXR0b25TdHlsZTogJ3ByaW1hcnknLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNvbmZpZ0VkaXRlZFByb3BlcnRpZXMucHVzaCh7XHJcbiAgICAgIGlkOiAnY2FuY2VsLWVkaXRpbmctcHJvcGVydGllcycsXHJcbiAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0NhbmNlbCcpLFxyXG4gICAgICB0b29sdGlwOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0NhbmNlbCcpLFxyXG4gICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgIGJ1dHRvblN0eWxlOiAnc2Vjb25kYXJ5JyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLl9lZGl0UHJvcGVydGllc0J1dHRvbnNDb25maWd1cmF0aW9uKCk7XHJcbiAgICB0aGlzLl9lZGl0ZWRQcm9wZXJ0aWVzQnV0dG9uc0NvbmZpZ3VyYXRpb24oKTtcclxuXHJcbiAgICB0aGlzLmJ1dHRvblJvd0l0ZW1zID0gdGhpcy5jb25maWdFZGl0UHJvcGVydGllcztcclxuXHJcbiAgICB0aGlzLnN1YnNjcmliZVByb3BlcnRpZXMoKTsgIFxyXG4gIH1cclxuXHJcbiAgc3Vic2NyaWJlUHJvcGVydGllcygpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRQcm9wZXJ0aWVzT2JqZWN0SWQkLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChpZCkgPT4ge1xyXG4gICAgICAgIGlmIChpZCkge1xyXG4gICAgICAgICAgdGhpcy5fY3JlYXRlT2JqZWN0UHJvcGVydGllcyhpZCwgdGhpcy5yZXZpc2lvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fY3VycmVudE9iamVjdElkJC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoaWQpID0+IHtcclxuICAgICAgICB0aGlzLl9jdXJyZW50UHJvcGVydGllc09iamVjdElkJC5uZXh0KGlkKTtcclxuICAgICAgICB0aGlzLl9jcmVhdGVDb21wbGV4UHJvcGVydGllc3RydWN0dXJlKGlkLCB0aGlzLnJldmlzaW9uKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlT2JqZWN0U3RydWN0dXJlTm9kZVNlbGVjdGVkKG5vZGU6IE9iamVjdFN0cnVjdHVyZU5vZGUpIHtcclxuICAgIGNvbnNvbGUubG9nKG5vZGUpO1xyXG4gICAgdGhpcy5fY3VycmVudE9iamVjdElkJC5uZXh0KG5vZGUuaWQpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlT2JqZWN0U3RydWN0dXJlTm9kZVZpc2libGUobm9kZSA6IE9iamVjdFN0cnVjdHVyZU5vZGUpe1xyXG4gICAgY29uc3Qgb2JqTm9kZTogUHJldmlld09iamVjdCA9IHtcclxuICAgICAgaWQ6bm9kZS5pZCxcclxuICAgICAgdmlzaWJsZTogbm9kZS52aXNpYmxlLFxyXG4gICAgICBvcGFxdWU6IG5vZGUub3BhcXVlfTtcclxuICAgIHRoaXMudmlzaWJsZU5vZGVTaWduYWwuc2V0KG9iak5vZGUpOyAvLyBVcGRhdGUgdGhlIHNpZ25hbFxyXG4gIH1cclxuXHJcbiAgaGFuZGxlT2JqZWN0U3RydWN0dXJlTm9kZU9wYXF1ZShub2RlIDogT2JqZWN0U3RydWN0dXJlTm9kZSl7XHJcbiAgICBjb25zdCBvYmpOb2RlOiBQcmV2aWV3T2JqZWN0ID0ge1xyXG4gICAgICBpZDpub2RlLmlkLFxyXG4gICAgICB2aXNpYmxlOiBub2RlLnZpc2libGUsXHJcbiAgICAgIG9wYXF1ZTogbm9kZS5vcGFxdWV9O1xyXG4gICAgdGhpcy5vcGFxdWVOb2RlU2lnbmFsLnNldChvYmpOb2RlKTsgLy8gVXBkYXRlIHRoZSBzaWduYWxcclxuICB9XHJcbiAgXHJcblxyXG4gIGhhbmRsZUNvbXBsZXhQcm9wZXJ0eU5vZGVTZWxlY3RlZChub2RlIDogQ29tcGxleFByb3BlcnRpZXNOb2RlKXtcclxuICAgIGNvbnNvbGUubG9nKG5vZGUpO1xyXG4gICAgdGhpcy5fY3VycmVudFByb3BlcnRpZXNPYmplY3RJZCQubmV4dChub2RlLmlkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xvYWRPYmplY3RTdHJ1Y3R1cmUob2JqZWN0SWQ6IHN0cmluZywgcmV2aXNpb246IG51bWJlciB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKCF0aGlzLmFwaSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFvYmplY3RJZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIHRoaXMuYXBpLm9iamVjdHMuZ2V0VG9wb2xvZ3kob2JqZWN0SWQsIHJldmlzaW9uLCBmYWxzZSwgZmFsc2UsIHVuZGVmaW5lZClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVPYmplY3RTdHJ1Y3R1cmUoXHJcbiAgICBvYmplY3RJZDogc3RyaW5nLFxyXG4gICAgcmV2aXNpb246IG51bWJlciB8IHVuZGVmaW5lZFxyXG4gICkge1xyXG4gICAgdGhpcy5fbG9hZE9iamVjdFN0cnVjdHVyZShvYmplY3RJZCwgcmV2aXNpb24pPy5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoc3RydWN0dXJlRGF0YSkgPT4ge1xyXG4gICAgICAgIGlmIChzdHJ1Y3R1cmVEYXRhKSB7XHJcbiAgICAgICAgICB0aGlzLl9vYmplY3RTdHJ1Y3R1cmUgPVxyXG4gICAgICAgICAgICBPYmplY3RTdHJ1Y3R1cmVOb2RlQnVpbGRlci5jcmVhdGVGcm9tUmVzcG9uc2Uoc3RydWN0dXJlRGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkT2JqZWN0Q29tcGxleFByb3BlcnRpZXNTdHJ1Y3R1cmUoXHJcbiAgICBvYmplY3RJZDogc3RyaW5nLFxyXG4gICAgcmV2aXNpb246IG51bWJlciB8IHVuZGVmaW5lZFxyXG4gICkge1xyXG4gICAgaWYgKCF0aGlzLmFwaSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFvYmplY3RJZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIHRoaXMuYXBpLm9iamVjdHMuZ2V0Q29tcGxleFByb3BlcnRpZXNUb3BvbG9neShvYmplY3RJZCwgcmV2aXNpb24pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlQ29tcGxleFByb3BlcnRpZXN0cnVjdHVyZShcclxuICAgIG9iamVjdElkOiBzdHJpbmcsXHJcbiAgICByZXZpc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9sb2FkT2JqZWN0Q29tcGxleFByb3BlcnRpZXNTdHJ1Y3R1cmUob2JqZWN0SWQsIHJldmlzaW9uKT8uc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHN0cnVjdHVyZURhdGEpID0+IHtcclxuICAgICAgICBpZiAoc3RydWN0dXJlRGF0YSkge1xyXG4gICAgICAgICAgY29uc3QgY29tcGxleFByb3BzID1cclxuICAgICAgICAgICAgQ29tcGxleFByb3BlcnRpZXNOb2RlQnVpbGRlci5jcmVhdGVGcm9tUmVzcG9uc2Uoc3RydWN0dXJlRGF0YSk7XHJcbiAgICAgICAgICBpZiAoY29tcGxleFByb3BzPy5jaGlsZHJlbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBsZXhQcm9wZXJ0aWVzID0gY29tcGxleFByb3BzO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcGxleFByb3BlcnRpZXMgPSBudWxsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9iamVjdEF0dHJpYnV0ZUdyb3VwcyA9IHNpZ25hbDxPYmplY3RBdHRyaWJ1dGVHcm91cFtdPihbXSk7XHJcblxyXG4gIHByaXZhdGUgX2xvYWRPYmplY3RQcm9wZXJ0aWVzKFxyXG4gICAgb2JqZWN0SWQ6IHN0cmluZyxcclxuICAgIHJldmlzaW9uOiBudW1iZXIgfCB1bmRlZmluZWRcclxuICApIHtcclxuICAgIGlmICghdGhpcy5hcGkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghb2JqZWN0SWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmcm9tKFxyXG4gICAgICB0aGlzLmFwaS5vYmplY3RzLmdldChvYmplY3RJZCwgcmV2aXNpb24sICc4JywgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZU9iamVjdFByb3BlcnRpZXMoXHJcbiAgICBvYmplY3RJZDogc3RyaW5nLFxyXG4gICAgcmV2aXNpb246IG51bWJlciB8IHVuZGVmaW5lZFxyXG4gICkge1xyXG4gICAgdGhpcy5fbG9hZE9iamVjdFByb3BlcnRpZXMob2JqZWN0SWQsIHJldmlzaW9uKT8uc3Vic2NyaWJlKHtcclxuICAgICAgLy8gcHJvcGVydGllcyByZXNwb25zZSBpcyBiYWRseSBzdHJ1Y3R1cmVkLCBuZWFybHkgaW1wb3NzaWJsZSB0byBjcmVhdGUgY2xhc3Mgc3RydWN0dXJlIGZyb20gaXQuIFRoZXJlZm9yZSB1c2luZyBzaG9ydGN1dFxyXG4gICAgICAvLyBhbnkgZm9yIGpzb24gcmVzcG9uc2VcclxuXHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICBuZXh0OiAocHJvcGVydGllc0RhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMub2JqZWN0UHJvcGVydGllc1NlcnZpY2Uuc2V0TW9kZWwocHJvcGVydGllc0RhdGEpO1xyXG4gICAgICAgIHRoaXMub2JqZWN0QXR0cmlidXRlR3JvdXBzLnNldCh0aGlzLl9jcmVhdGVBdHRyaWJ1dGVHcm91cHNGcm9tUmVzcG9uc2UocHJvcGVydGllc0RhdGEpKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICB0aGlzLm9iamVjdEF0dHJpYnV0ZUdyb3Vwcy5zZXQoW10pO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBwcml2YXRlIF90b29sdGlwKGF0dHJpYjogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG5hbWVUaXRsZTogc3RyaW5nID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ19OYW1lJyk7XHJcbiAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSBhdHRyaWIubmFtZSA/IGF0dHJpYi5uYW1lIDogJyc7XHJcbiAgICBjb25zdCBkZXNjcmlwdGlvblRpdGxlOiBzdHJpbmcgPVxyXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnZGVzY3JpcHRpb24nKTtcclxuICAgIGNvbnN0IGRlc2NyaXB0aW9uOiBzdHJpbmcgPSBhdHRyaWIuZGVzY3JpcHRpb247XHJcbiAgICBjb25zdCB1dWlkVGl0bGU6IHN0cmluZyA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdfVVVJRCcpO1xyXG4gICAgY29uc3QgdXVpZDogc3RyaW5nID0gYXR0cmliLmlkO1xyXG4gICAgaWYgKFxyXG4gICAgICBkZXNjcmlwdGlvbiA9PT0gbnVsbCB8fFxyXG4gICAgICBkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgIGRlc2NyaXB0aW9uID09PSAnJ1xyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBgJHtuYW1lVGl0bGV9OiAke25hbWV9XFxuJHt1dWlkVGl0bGV9OiAke3V1aWR9YDtcclxuICAgIH1cclxuICAgIHJldHVybiBgJHtuYW1lVGl0bGV9OiAke25hbWV9XFxuJHtkZXNjcmlwdGlvblRpdGxlfTogJHtkZXNjcmlwdGlvbn1cXG4ke3V1aWRUaXRsZX06ICR7dXVpZH1gO1xyXG4gIH1cclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgcHJpdmF0ZSBfY3JlYXRlQXR0cmlidXRlR3JvdXBzRnJvbVJlc3BvbnNlKHByb3BlcnRpZXNEYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGdyb3VwczogQXJyYXk8T2JqZWN0QXR0cmlidXRlR3JvdXA+ID0gW107XHJcbiAgICBsZXQgbG9jYWxpemVkQXR0cmliR3JvdXBzID0gbnVsbDtcclxuICAgIGlmIChwcm9wZXJ0aWVzRGF0YS5sb2NhbGl6ZWRBdHRyaWJ1dGVHcm91cHMpIHtcclxuICAgICAgbG9jYWxpemVkQXR0cmliR3JvdXBzID0gcHJvcGVydGllc0RhdGEubG9jYWxpemVkQXR0cmlidXRlR3JvdXBzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghcHJvcGVydGllc0RhdGEuYXR0cmlidXRlcykge1xyXG4gICAgICByZXR1cm4gZ3JvdXBzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGF0dHJpYkdyb3VwcyA9IHByb3BlcnRpZXNEYXRhLmF0dHJpYnV0ZXM7XHJcbiAgICBmb3IgKGNvbnN0IFtncm91cE5hbWUsIGF0dHJpYnNPYmplY3RdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYkdyb3VwcykpIHtcclxuICAgICAgY29uc3QgbmV3R3JvdXA6IE9iamVjdEF0dHJpYnV0ZUdyb3VwID0ge1xyXG4gICAgICAgIG5hbWU6IGdyb3VwTmFtZSxcclxuICAgICAgICBleHBhbmRlZDogZmFsc2UsXHJcbiAgICAgICAgYXR0cmlidXRlczogW10sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAobG9jYWxpemVkQXR0cmliR3JvdXBzPy5bZ3JvdXBOYW1lXSkge1xyXG4gICAgICAgIG5ld0dyb3VwLm5hbWUgPSBsb2NhbGl6ZWRBdHRyaWJHcm91cHNbZ3JvdXBOYW1lXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFhdHRyaWJzT2JqZWN0KSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAoY29uc3QgYXR0cmliIG9mIE9iamVjdC52YWx1ZXMoYXR0cmlic09iamVjdCkpIHtcclxuICAgICAgICBjb25zdCBuZXdBdHRyaWI6IE9iamVjdEF0dHJpYnV0ZSA9IHtcclxuICAgICAgICAgIGlkOiBhdHRyaWIuaWQsXHJcbiAgICAgICAgICBuYW1lOiBhdHRyaWIubmFtZSxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBhdHRyaWIuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICB2YWx1ZTogYXR0cmliLnZhbHVlLFxyXG4gICAgICAgICAgZ3JvdXA6IGF0dHJpYi5ncm91cCxcclxuICAgICAgICAgIHR5cGU6IGF0dHJpYi50eXBlLFxyXG4gICAgICAgICAgdW5pdDogYXR0cmliLnVuaXQsXHJcbiAgICAgICAgICBkZWNpbWFsOiBhdHRyaWIuZGVjaW1hbCxcclxuICAgICAgICAgIGNvbnRyb2w6IGF0dHJpYi5jb250cm9sLFxyXG4gICAgICAgICAgZW51bWRlZmluaXRpb246IGF0dHJpYi5lbnVtZGVmaW5pdGlvbixcclxuICAgICAgICAgIGlzQ2hhbmdlYWJsZTogYXR0cmliLmlzQ2hhbmdlYWJsZSxcclxuICAgICAgICAgIHRvb2x0aXA6IHRoaXMuX3Rvb2x0aXAoYXR0cmliKSxcclxuICAgICAgICAgIG1pblZhbHVlOiBhdHRyaWIubWluVmFsdWUsXHJcbiAgICAgICAgICBtYXhWYWx1ZTogYXR0cmliLm1heFZhbHVlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIG5ld0dyb3VwLmF0dHJpYnV0ZXMucHVzaChuZXdBdHRyaWIpO1xyXG4gICAgICB9XHJcbiAgICAgIGdyb3Vwcy5wdXNoKG5ld0dyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZ3JvdXBzO1xyXG4gIH1cclxuXHJcbiAgX2RlbGV0ZUZvcm0oKSB7XHJcbiAgICB0aGlzLl9vYmplY3RQcm9wZXJ0aWVzRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsRm9ybVZhbHVlczogc3RyaW5nID0gXCJcIjtcclxuICBfY3JlYXRlRm9ybSgpIHtcclxuICAgIGNvbnN0IF9nZXRBdHRyaWJ1dGVWYWx1ZSA9IG5ldyBHZXRBdHRyaWJ1dGVWYWx1ZSgpO1xyXG4gICAgY29uc3QgX2Zvcm06IHsgW2tleTogc3RyaW5nXTogRm9ybUdyb3VwIH0gPSB7fTtcclxuICAgIHRoaXMub2JqZWN0QXR0cmlidXRlR3JvdXBzKCkuZm9yRWFjaChncm91cEF0dHJpYnV0ZXMgPT4ge1xyXG4gICAgICBjb25zdCBfZm9ybV9ncm91cDogeyBba2V5OiBzdHJpbmddOiBGb3JtQ29udHJvbCB8IG51bGwgfSA9IHt9O1xyXG4gICAgICBncm91cEF0dHJpYnV0ZXMuYXR0cmlidXRlcy5mb3JFYWNoKGF0dHJpYnV0ZSA9PiB7XHJcbiAgICAgICAgaWYoKHR5cGVvZiBhdHRyaWJ1dGUudHlwZSA9PT0gJ3N0cmluZycgJiYgL15ib29sZWFuJC9pLnRlc3QoYXR0cmlidXRlLnR5cGUpKSAmJiAhYXR0cmlidXRlLmNvbnRyb2wpIHtcclxuICAgICAgICAgIF9mb3JtX2dyb3VwW2F0dHJpYnV0ZS5pZF0gPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woXHJcbiAgICAgICAgICAgIF9nZXRBdHRyaWJ1dGVWYWx1ZS50cmFuc2Zvcm0oYXR0cmlidXRlKVxyXG4gICAgICAgICAgICAsIGF0dHJpYnV0ZS5pc0NoYW5nZWFibGUgPyBbVmFsaWRhdG9ycy5wYXR0ZXJuKC9eKGZhbHNlfHRydWV8MHwxKSQvaSldIDogW11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCh0eXBlb2YgYXR0cmlidXRlLnR5cGUgPT09ICdzdHJpbmcnICYmIC9eYm9vbGVhbiQvaS50ZXN0KGF0dHJpYnV0ZS50eXBlKSlcclxuICAgICAgICAgICAgJiYgKHR5cGVvZiBhdHRyaWJ1dGUuY29udHJvbCA9PT0gJ3N0cmluZycgJiYgL15jaGVja2JveCQvaS50ZXN0KGF0dHJpYnV0ZS5jb250cm9sKSlcclxuICAgICAgICAgIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICBfZm9ybV9ncm91cFthdHRyaWJ1dGUuaWRdID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKFxyXG4gICAgICAgICAgICBfZ2V0QXR0cmlidXRlVmFsdWUudHJhbnNmb3JtKGF0dHJpYnV0ZSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCh0eXBlb2YgYXR0cmlidXRlLnR5cGUgPT09ICdzdHJpbmcnICYmIC9ec3RyaW5nJC9pLnRlc3QoYXR0cmlidXRlLnR5cGUpKSAmJiAhYXR0cmlidXRlLmNvbnRyb2wpIHtcclxuICAgICAgICAgIF9mb3JtX2dyb3VwW2F0dHJpYnV0ZS5pZF0gPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woXHJcbiAgICAgICAgICAgIF9nZXRBdHRyaWJ1dGVWYWx1ZS50cmFuc2Zvcm0oYXR0cmlidXRlKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoKHR5cGVvZiBhdHRyaWJ1dGUudHlwZSA9PT0gJ3N0cmluZycgJiYgL15kb3VibGUkL2kudGVzdChhdHRyaWJ1dGUudHlwZSkpICYmICFhdHRyaWJ1dGUuY29udHJvbCkge1xyXG4gICAgICAgICAgX2Zvcm1fZ3JvdXBbYXR0cmlidXRlLmlkXSA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChcclxuICAgICAgICAgICAgX2dldEF0dHJpYnV0ZVZhbHVlLnRyYW5zZm9ybShhdHRyaWJ1dGUpXHJcbiAgICAgICAgICAgICwgYXR0cmlidXRlLmlzQ2hhbmdlYWJsZSA/IFtkb3VibGVWYWxpZGF0b3IoYXR0cmlidXRlLm1pblZhbHVlLCBhdHRyaWJ1dGUubWF4VmFsdWUpXSA6IFtdXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZigodHlwZW9mIGF0dHJpYnV0ZS50eXBlID09PSAnc3RyaW5nJyAmJiAvXmludCgzMik/JC9pLnRlc3QoYXR0cmlidXRlLnR5cGUpKSAmJiAhYXR0cmlidXRlLmNvbnRyb2wpIHtcclxuICAgICAgICAgIF9mb3JtX2dyb3VwW2F0dHJpYnV0ZS5pZF0gPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woXHJcbiAgICAgICAgICAgIF9nZXRBdHRyaWJ1dGVWYWx1ZS50cmFuc2Zvcm0oYXR0cmlidXRlKVxyXG4gICAgICAgICAgICAsIGF0dHJpYnV0ZS5pc0NoYW5nZWFibGUgPyBbaW50ZWdlclZhbGlkYXRvcihhdHRyaWJ1dGUubWluVmFsdWUsIGF0dHJpYnV0ZS5tYXhWYWx1ZSldIDogW11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCh0eXBlb2YgYXR0cmlidXRlLnR5cGUgPT09ICdzdHJpbmcnICYmIC9eZ3VpZCQvaS50ZXN0KGF0dHJpYnV0ZS50eXBlKSkgJiYgIWF0dHJpYnV0ZS5jb250cm9sKSB7XHJcbiAgICAgICAgICBfZm9ybV9ncm91cFthdHRyaWJ1dGUuaWRdID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKFxyXG4gICAgICAgICAgICBfZ2V0QXR0cmlidXRlVmFsdWUudHJhbnNmb3JtKGF0dHJpYnV0ZSlcclxuICAgICAgICAgICAgLCBhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlID8gW2d1aWRWYWxpZGF0b3IoKV0gOiBbXVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoKHR5cGVvZiBhdHRyaWJ1dGUudHlwZSA9PT0gJ3N0cmluZycgJiYgL15kb3VibGUkL2kudGVzdChhdHRyaWJ1dGUudHlwZSkpXHJcbiAgICAgICAgICAmJiAodHlwZW9mIGF0dHJpYnV0ZS5jb250cm9sID09PSAnc3RyaW5nJyAmJiAvXmVudW1lcmF0aW9uJC9pLnRlc3QoYXR0cmlidXRlLmNvbnRyb2wpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgX2Zvcm1fZ3JvdXBbYXR0cmlidXRlLmlkXSA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChcclxuICAgICAgICAgICAgX2dldEF0dHJpYnV0ZVZhbHVlLnRyYW5zZm9ybShhdHRyaWJ1dGUpXHJcbiAgICAgICAgICAgICwgYXR0cmlidXRlLmlzQ2hhbmdlYWJsZSA/IFtkb3VibGVFbnVtVmFsaWRhdG9yKGF0dHJpYnV0ZS5lbnVtZGVmaW5pdGlvbildIDogW11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCh0eXBlb2YgYXR0cmlidXRlLnR5cGUgPT09ICdzdHJpbmcnICYmIC9eZ3VpZCQvaS50ZXN0KGF0dHJpYnV0ZS50eXBlKSlcclxuICAgICAgICAgICYmICh0eXBlb2YgYXR0cmlidXRlLmNvbnRyb2wgPT09ICdzdHJpbmcnICYmIC9eZW51bWVyYXRpb24kL2kudGVzdChhdHRyaWJ1dGUuY29udHJvbCkpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBfZm9ybV9ncm91cFthdHRyaWJ1dGUuaWRdID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKFxyXG4gICAgICAgICAgICBfZ2V0QXR0cmlidXRlVmFsdWUudHJhbnNmb3JtKGF0dHJpYnV0ZSlcclxuICAgICAgICAgICAgLCBhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlID8gW2d1aWRFbnVtVmFsaWRhdG9yKGF0dHJpYnV0ZS5lbnVtZGVmaW5pdGlvbildIDogW11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCh0eXBlb2YgYXR0cmlidXRlLnR5cGUgPT09ICdzdHJpbmcnICYmIC9eaW50KDMyKT8kL2kudGVzdChhdHRyaWJ1dGUudHlwZSkpXHJcbiAgICAgICAgICAmJiAodHlwZW9mIGF0dHJpYnV0ZS5jb250cm9sID09PSAnc3RyaW5nJyAmJiAvXmVudW1lcmF0aW9uJC9pLnRlc3QoYXR0cmlidXRlLmNvbnRyb2wpKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgX2Zvcm1fZ3JvdXBbYXR0cmlidXRlLmlkXSA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChcclxuICAgICAgICAgICAgX2dldEF0dHJpYnV0ZVZhbHVlLnRyYW5zZm9ybShhdHRyaWJ1dGUpXHJcbiAgICAgICAgICAgICwgYXR0cmlidXRlLmlzQ2hhbmdlYWJsZSA/IFtkb3VibGVFbnVtVmFsaWRhdG9yKGF0dHJpYnV0ZS5lbnVtZGVmaW5pdGlvbildIDogW11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCh0eXBlb2YgYXR0cmlidXRlLnR5cGUgPT09ICdzdHJpbmcnICYmIC9ec3RyaW5nJC9pLnRlc3QoYXR0cmlidXRlLnR5cGUpKVxyXG4gICAgICAgICAgJiYgKHR5cGVvZiBhdHRyaWJ1dGUuY29udHJvbCA9PT0gJ3N0cmluZycgJiYgL15lbnVtZXJhdGlvbiQvaS50ZXN0KGF0dHJpYnV0ZS5jb250cm9sKSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIF9mb3JtX2dyb3VwW2F0dHJpYnV0ZS5pZF0gPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woXHJcbiAgICAgICAgICAgIF9nZXRBdHRyaWJ1dGVWYWx1ZS50cmFuc2Zvcm0oYXR0cmlidXRlKVxyXG4gICAgICAgICAgICAsIGF0dHJpYnV0ZS5pc0NoYW5nZWFibGUgPyBbc3RyaW5nRW51bVZhbGlkYXRvcihhdHRyaWJ1dGUuZW51bWRlZmluaXRpb24pXSA6IFtdXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZigodHlwZW9mIGF0dHJpYnV0ZS50eXBlID09PSAnc3RyaW5nJyAmJiAvXnN0cmluZyQvaS50ZXN0KGF0dHJpYnV0ZS50eXBlKSlcclxuICAgICAgICAgICYmICh0eXBlb2YgYXR0cmlidXRlLmNvbnRyb2wgPT09ICdzdHJpbmcnICYmIC9eY29tYm9ib3gkL2kudGVzdChhdHRyaWJ1dGUuY29udHJvbCkpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBfZm9ybV9ncm91cFthdHRyaWJ1dGUuaWRdID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKFxyXG4gICAgICAgICAgICBfZ2V0QXR0cmlidXRlVmFsdWUudHJhbnNmb3JtKGF0dHJpYnV0ZSlcclxuICAgICAgICAgICAgLCBhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlID8gW3N0cmluZ0NvbWJvYm94VmFsaWRhdG9yKGF0dHJpYnV0ZS5lbnVtZGVmaW5pdGlvbildIDogW11cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAgIF9mb3JtW2dyb3VwQXR0cmlidXRlcy5uYW1lXSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoX2Zvcm1fZ3JvdXApO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9vYmplY3RQcm9wZXJ0aWVzRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoX2Zvcm0pO1xyXG5cclxuICAgIHRoaXMuaW5pdGlhbEZvcm1WYWx1ZXMgPSBKU09OLnN0cmluZ2lmeSh0aGlzLl9vYmplY3RQcm9wZXJ0aWVzRm9ybS52YWx1ZSk7XHJcbiAgICB0aGlzLl9vYmplY3RQcm9wZXJ0aWVzRm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hhbmdlZDogYm9vbGVhbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKSAhPT0gdGhpcy5pbml0aWFsRm9ybVZhbHVlcztcclxuICAgICAgICB0aGlzLmlzU2F2ZUJ1dHRvbkRpc2FibGVkJC5uZXh0KCEodGhpcy5fb2JqZWN0UHJvcGVydGllc0Zvcm0udmFsaWQgJiYgY2hhbmdlZCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFByb3BlcnR5TmFtZSh1dWlkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgYXR0ckdyb3VwczogT2JqZWN0QXR0cmlidXRlR3JvdXBbXSA9IHRoaXMub2JqZWN0QXR0cmlidXRlR3JvdXBzKCk7XHJcbiAgICBmb3IgKGNvbnN0IGF0dHJHcm91cCBvZiBhdHRyR3JvdXBzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBhdHRyR3JvdXAuYXR0cmlidXRlcykge1xyXG4gICAgICAgIGlmIChhdHRyLmlkID09PSB1dWlkKSB7XHJcbiAgICAgICAgICByZXR1cm4gYXR0ci5uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0UHJvcGVydHlUeXBlKHV1aWQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBhdHRyR3JvdXBzOiBPYmplY3RBdHRyaWJ1dGVHcm91cFtdID0gdGhpcy5vYmplY3RBdHRyaWJ1dGVHcm91cHMoKTtcclxuICAgIGZvciAoY29uc3QgYXR0ckdyb3VwIG9mIGF0dHJHcm91cHMpIHtcclxuICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJHcm91cC5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgaWYgKGF0dHIuaWQgPT09IHV1aWQpIHtcclxuICAgICAgICAgIHJldHVybiBhdHRyLnR5cGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRQcm9wZXJ0eUNvbnRyb2wodXVpZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGF0dHJHcm91cHM6IE9iamVjdEF0dHJpYnV0ZUdyb3VwW10gPSB0aGlzLm9iamVjdEF0dHJpYnV0ZUdyb3VwcygpO1xyXG4gICAgZm9yIChjb25zdCBhdHRyR3JvdXAgb2YgYXR0ckdyb3Vwcykge1xyXG4gICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0ckdyb3VwLmF0dHJpYnV0ZXMpIHtcclxuICAgICAgICBpZiAoYXR0ci5pZCA9PT0gdXVpZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGF0dHIuY29udHJvbDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbnZlcnRWYWx1ZVRvQm9vbGVhbih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gL150cnVlJC9pLnRlc3QodmFsdWUpIHx8IC9eMSQvaS50ZXN0KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbnZlcnRWYWx1ZVRvRG91YmxlKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGFzQmVlblZhbHVlQ2hhbmdlZCh1dWlkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhdHRyR3JvdXBzOiBPYmplY3RBdHRyaWJ1dGVHcm91cFtdID0gdGhpcy5vYmplY3RBdHRyaWJ1dGVHcm91cHMoKTtcclxuICAgIGZvciAoY29uc3QgYXR0ckdyb3VwIG9mIGF0dHJHcm91cHMpIHtcclxuICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJHcm91cC5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgaWYgKGF0dHIuaWQgPT09IHV1aWQpIHtcclxuICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gYXR0ci52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldENoYW5nZWREYXRhKGZvcm1Hcm91cDogRm9ybUdyb3VwKTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0ge1xyXG4gICAgY29uc3QgY2hhbmdlZERhdGE6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge307XHJcblxyXG4gICAgT2JqZWN0LmtleXMoZm9ybUdyb3VwLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGtleSk7XHJcblxyXG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSB7XHJcbiAgICAgICAgLy8gSWYgaXQncyBhIEZvcm1Db250cm9sIGFuZCBpdCdzIGRpcnR5LCBjYXB0dXJlIHRoZSBjaGFuZ2VkIHZhbHVlXHJcbiAgICAgICAgaWYgKGNvbnRyb2wuZGlydHkpIHtcclxuICAgICAgICAgIGNvbnN0IHByb3BOYW1lOiBzdHJpbmcgPSB0aGlzLl9nZXRQcm9wZXJ0eU5hbWUoa2V5KTtcclxuICAgICAgICAgIGNvbnN0IHByb3BUeXBlOiBzdHJpbmcgPSB0aGlzLl9nZXRQcm9wZXJ0eVR5cGUoa2V5KTtcclxuICAgICAgICAgIC8vIGNvbnN0IHByb3BDb250cm9sOiBzdHJpbmcgPSB0aGlzLl9nZXRQcm9wZXJ0eUNvbnRyb2woa2V5KTtcclxuICAgICAgICAgIGlmKHByb3BOYW1lID09PSAnJykge1xyXG4gICAgICAgICAgICBjb25zdCBfbmV3VmFsdWUgPSB7XHJcbiAgICAgICAgICAgICAgaWQ6IGtleSxcclxuICAgICAgICAgICAgICB2YWx1ZTogY29udHJvbC52YWx1ZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjaGFuZ2VkRGF0YVtrZXldID0gX25ld1ZhbHVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYoL15ib29sZWFuJC9pLnRlc3QocHJvcFR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgX3ZhbDogYm9vbGVhbiA9IHRoaXMuX2NvbnZlcnRWYWx1ZVRvQm9vbGVhbihjb250cm9sLnZhbHVlKTtcclxuICAgICAgICAgICAgICBpZih0aGlzLl9oYXNCZWVuVmFsdWVDaGFuZ2VkKGtleSwgX3ZhbCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IF9uZXdWYWx1ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgaWQ6IGtleSxcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IF92YWxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBjaGFuZ2VkRGF0YVtwcm9wTmFtZV0gPSBfbmV3VmFsdWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoL15kb3VibGUkL2kudGVzdChwcm9wVHlwZSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCBfdmFsOiBudW1iZXIgPSB0aGlzLl9jb252ZXJ0VmFsdWVUb0RvdWJsZShjb250cm9sLnZhbHVlKTtcclxuICAgICAgICAgICAgICBpZih0aGlzLl9oYXNCZWVuVmFsdWVDaGFuZ2VkKGtleSwgX3ZhbCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IF9uZXdWYWx1ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgaWQ6IGtleSxcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IF92YWxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBjaGFuZ2VkRGF0YVtwcm9wTmFtZV0gPSBfbmV3VmFsdWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnN0IF92YWw6IHN0cmluZyA9IGNvbnRyb2wudmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgIGlmKHRoaXMuX2hhc0JlZW5WYWx1ZUNoYW5nZWQoa2V5LCBjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgX25ld1ZhbHVlID0ge1xyXG4gICAgICAgICAgICAgICAgICBpZDoga2V5LFxyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogX3ZhbFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNoYW5nZWREYXRhW3Byb3BOYW1lXSA9IF9uZXdWYWx1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xyXG4gICAgICAgIGlmKGNvbnRyb2wuZGlydHkpIHtcclxuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGdldCBjaGFuZ2VkIGRhdGEgZnJvbSBuZXN0ZWQgRm9ybUdyb3VwXHJcbiAgICAgICAgICBjb25zdCBuZXN0ZWRDaGFuZ2VzID0gdGhpcy5fZ2V0Q2hhbmdlZERhdGEoY29udHJvbCk7XHJcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXMobmVzdGVkQ2hhbmdlcykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjaGFuZ2VkRGF0YVtrZXldID0gbmVzdGVkQ2hhbmdlcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBjaGFuZ2VkRGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NhdmVPYmplY3RQcm9wZXJ0aWVzKCkge1xyXG4gICAgY29uc3Qgc2F2ZURhdGE6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge307XHJcbiAgICBzYXZlRGF0YVsnaWQnXSA9IHRoaXMuX2N1cnJlbnRPYmplY3RJZCQudmFsdWU7XHJcbiAgICBzYXZlRGF0YVsndW5zYXZlZCddID0gdHJ1ZTtcclxuICAgIHNhdmVEYXRhWydhdHRyaWJ1dGVzJ10gPSB0aGlzLl9nZXRDaGFuZ2VkRGF0YSh0aGlzLl9vYmplY3RQcm9wZXJ0aWVzRm9ybSk7XHJcbiAgICB0aGlzLnNhdmVPYmplY3RQcm9wZXJ0aWVzKHNhdmVEYXRhKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBidXR0b25DbGlja2VkKCRldmVudDogQmltcGx1c0J1dHRvbkNsaWNrRXZlbnQpIHtcclxuICAgIGlmICgkZXZlbnQuaWQgPT09ICdlZGl0LXByb3BlcnRpZXMnKSB7XHJcbiAgICAgIHRoaXMuX2VkaXRNb2RlLnNldCh0cnVlKTtcclxuICAgICAgdGhpcy5fY3JlYXRlRm9ybSgpO1xyXG4gICAgICBjb25zb2xlLmxvZygnRWRpdCBwcm9wZXJ0aWVzIGNsaWNrZWQnKTtcclxuICAgICAgdGhpcy5idXR0b25Sb3dJdGVtcyA9IHRoaXMuY29uZmlnRWRpdGVkUHJvcGVydGllcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoJGV2ZW50LmlkID09PSAnc2F2ZS1jaGFuZ2VkLXByb3BlcnRpZXMnKSB7XHJcbiAgICAgIHRoaXMuX3NhdmVPYmplY3RQcm9wZXJ0aWVzKCk7XHJcbiAgICAgIHRoaXMuX2VkaXRNb2RlLnNldChmYWxzZSk7XHJcbiAgICAgIHRoaXMuX2RlbGV0ZUZvcm0oKTtcclxuICAgICAgdGhpcy5idXR0b25Sb3dJdGVtcyA9IHRoaXMuY29uZmlnRWRpdFByb3BlcnRpZXM7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdTYXZlIGNoYW5nZWQgcHJvcGVydGllcyBjbGlja2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCRldmVudC5pZCA9PT0gJ2NhbmNlbC1lZGl0aW5nLXByb3BlcnRpZXMnKSB7XHJcbiAgICAgIHRoaXMuX2VkaXRNb2RlLnNldChmYWxzZSk7XHJcbiAgICAgIHRoaXMuX2RlbGV0ZUZvcm0oKTtcclxuICAgICAgdGhpcy5idXR0b25Sb3dJdGVtcyA9IHRoaXMuY29uZmlnRWRpdFByb3BlcnRpZXM7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdDYW5jZWwgZWRpdCBwcm9wZXJ0aWVzIGNsaWNrZWQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhc1NldEFueUF0dHJpYnV0ZShvYmplY3RBdHRyaWJ1dGVHcm91cDogT2JqZWN0QXR0cmlidXRlR3JvdXApIHtcclxuICAgIHJldHVybiBvYmplY3RBdHRyaWJ1dGVHcm91cC5hdHRyaWJ1dGVzLnNvbWUoKGF0dHJpYikgPT4ge1xyXG4gICAgICByZXR1cm4gIWlzT2JqZWN0UHJvcGVydHlWYWx1ZUJsYW5rKGF0dHJpYik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzYXZlT2JqZWN0UHJvcGVydGllcyhkYXRhOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRPYmplY3RJZCA9IHRoaXMuX2N1cnJlbnRQcm9wZXJ0aWVzT2JqZWN0SWQkLnZhbHVlO1xyXG4gICAgaWYgKCFkYXRhIHx8ICFzZWxlY3RlZE9iamVjdElkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuYXBpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBmcm9tKHRoaXMuYXBpLm9iamVjdHMucHV0KHNlbGVjdGVkT2JqZWN0SWQsIEpTT04uc3RyaW5naWZ5KGRhdGEpKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlc3BvbnNlOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkgPT4ge1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZU9iamVjdFByb3BlcnRpZXMoc2VsZWN0ZWRPYmplY3RJZCwgdGhpcy5yZXZpc2lvbik7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlT2JqZWN0U3RydWN0dXJlKHNlbGVjdGVkT2JqZWN0SWQsIHRoaXMucmV2aXNpb24pO1xyXG4gICAgICAgIHRoaXMudXBkYXRlZE9iamVjdFByb3BlcnRpZXMuZW1pdCh7IGlkOiBzZWxlY3RlZE9iamVjdElkLCByZXF1ZXN0OiBkYXRhLCByZXNwb25zZSB9KTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8bGliLWJpbXBsdXMtYnV0dG9ucy1yb3dcclxuICBbaXRlbXNdPVwiYnV0dG9uUm93SXRlbXNcIlxyXG4gIChidXR0b25DbGlja2VkKT1cImJ1dHRvbkNsaWNrZWQoJGV2ZW50KVwiXHJcbi8+XHJcblxyXG48ZGl2IGNsYXNzPVwib2JqZWN0LXByb3BlcnRpZXNcIj5cclxuXHJcbiAgPGxpYi1iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyPlxyXG4gICAgPGxpYi1leHBhbnNpb24tcGFuZWwgY2xhc3M9XCJvYmplY3QtcHJvcGVydGllcy1wcmV2aWV3LXBhbmVsXCI+XHJcbiAgICAgIDxsaWItZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm9iamVjdC1zdHJ1Y3R1cmUtaGVhZGVyXCI+e3tcIl8zRCBwcmV2aWV3XCIgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgPC9saWItZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgPGxpYi1vYmplY3QtcHJldmlldyBcclxuICAgICAgICBbYXBpXT1cImFwaVwiIFxyXG4gICAgICAgIFtyZXZpc2lvbl09XCJyZXZpc2lvblwiIFxyXG4gICAgICAgIFtvYmplY3RJZF09XCJyb290T2JqZWN0SWRcIlxyXG4gICAgICAgIFt2aXNpYmxlTm9kZV09XCJ2aXNpYmxlTm9kZVNpZ25hbCgpXCJcdFxyXG4gICAgICAgIFtvcGFxdWVOb2RlXT1cIm9wYXF1ZU5vZGVTaWduYWwoKVwiXHJcbiAgICAgIC8+XHJcbiAgICA8L2xpYi1leHBhbnNpb24tcGFuZWw+XHJcbiAgICA8IS0tIE9iamVjdCBzdHJ1Y3R1cmUtLT5cclxuICAgIDxsaWItZXhwYW5zaW9uLXBhbmVsIGNsYXNzPVwib2JqZWN0LXByb3BlcnRpZXMtb2JqZWN0LXN0cnVjdHVyZS1wYW5lbFwiPlxyXG4gICAgICA8bGliLWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJvYmplY3Qtc3RydWN0dXJlLWhlYWRlclwiPnt7XCJfT2JqZWN0IHN0cnVjdHVyZVwiIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgIDwvbGliLWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgIEBpZiAob2JqZWN0U3RydWN0dXJlKSB7XHJcbiAgICAgICAgPGxpYi1iaW1wbHVzLW9iamVjdC1zdHJ1Y3R1cmVcclxuICAgICAgICAgIFtvYmplY3RTdHJ1Y3R1cmVdPVwib2JqZWN0U3RydWN0dXJlXCJcclxuICAgICAgICAgIChub2RlU2VsZWN0ZWQpPVwiaGFuZGxlT2JqZWN0U3RydWN0dXJlTm9kZVNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICAgICAgKG5vZGVWaXNpYmxlKT0gXCJoYW5kbGVPYmplY3RTdHJ1Y3R1cmVOb2RlVmlzaWJsZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChub2RlT3BhcXVlKT0gIFwiaGFuZGxlT2JqZWN0U3RydWN0dXJlTm9kZU9wYXF1ZSgkZXZlbnQpXCIgICAgICAgICAgXHJcbiAgICAgICAgLz5cclxuICAgICAgfVxyXG4gICAgPC9saWItZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgPCEtLSBFbmQgT2JqZWN0IHN0cnVjdHVyZS0tPlxyXG5cclxuICAgIDwhLS0gQ29tcGxleCBwcm9wZXJ0aWVzLS0+XHJcbiAgICBAaWYoY29tcGxleFByb3BlcnRpZXMpe1xyXG4gICAgICA8bGliLWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICA8bGliLWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9iamVjdC1wcm9wZXJ0aWVzLWhlYWRlclwiPiB7e1wiX09iamVjdCBtdWx0aXByb3BlcnRpZXMgdHJlZVwiIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgPC9saWItZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICA8bGliLWJpbXBsdXMtb2JqZWN0LWNvbXBsZXgtcHJvcGVydGllc1xyXG4gICAgICAgICAgW2NvbXBsZXhQcm9wZXJ0aWVzXT1cImNvbXBsZXhQcm9wZXJ0aWVzXCJcclxuICAgICAgICAgIChub2RlU2VsZWN0ZWQpPVwiaGFuZGxlQ29tcGxleFByb3BlcnR5Tm9kZVNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvbGliLWV4cGFuc2lvbi1wYW5lbD5cclxuICAgIH1cclxuICAgIDwhLS0gRW5kIENvbXBsZXggcHJvcGVydGllcy0tPlxyXG5cclxuICAgIEBpZihvYmplY3RBdHRyaWJ1dGVHcm91cHMoKS5sZW5ndGggPiAwKXtcclxuICAgICAgPGxpYi1leHBhbnNpb24tcGFuZWw+XHJcbiAgICAgICAgPGxpYi1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJvYmplY3QtcHJvcGVydGllcy1oZWFkZXJcIj57e1wiX09iamVjdCBwcm9wZXJ0aWVzXCIgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICA8L2xpYi1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiX29iamVjdFByb3BlcnRpZXNGb3JtXCIgY2xhc3M9XCJpbnB1dC1mb3JtXCI+XHJcbiAgICAgICAgICBAZm9yIChhdHRyaWJHcm91cCBvZiBvYmplY3RBdHRyaWJ1dGVHcm91cHMoKTsgdHJhY2sgYXR0cmliR3JvdXApIHtcclxuICAgICAgICAgICAgQGlmKF9lZGl0TW9kZSgpIHx8IGhhc1NldEFueUF0dHJpYnV0ZShhdHRyaWJHcm91cCkpe1xyXG4gICAgICAgICAgICAgIDxsaWItZXhwYW5zaW9uLXBhbmVsIFtleHBhbmRlZF09XCJhdHRyaWJHcm91cC5leHBhbmRlZFwiPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9iamVjdC1wcm9wZXJ0aWVzLWdyb3VwLWhlYWRlclwiPiB7e2F0dHJpYkdyb3VwLm5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbGliLWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8bGliLW9iamVjdC1wcm9wZXJ0aWVzLWdyb3VwXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyaWJ1dGVzR3JvdXBdPVwiYXR0cmliR3JvdXBcIlxyXG4gICAgICAgICAgICAgICAgICBbZWRpdE1vZGVdPVwiX2VkaXRNb2RlKClcIlxyXG4gICAgICAgICAgICAgICAgICBbY2FuVXBkYXRlT2JqZWN0XT1cIl9jYW5VcGRhdGVPYmplY3QoKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtvYmplY3RQcm9wZXJ0aWVzRm9ybV09XCJfb2JqZWN0UHJvcGVydGllc0dyb3VwRm9ybShhdHRyaWJHcm91cC5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDwvbGliLWV4cGFuc2lvbi1wYW5lbD5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgICAgPC9saWItZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgfVxyXG4gIDwvbGliLWJpbXBsdXMtc2Nyb2xsYWJsZS1jb250YWluZXI+XHJcbjwvZGl2PlxyXG4iXX0=