@rocketshow/designer 1.40.0 → 1.44.0

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 (191) hide show
  1. package/fesm2022/rocketshow-designer.mjs +1389 -1148
  2. package/fesm2022/rocketshow-designer.mjs.map +1 -1
  3. package/index.d.ts +1676 -5
  4. package/package.json +2 -4
  5. package/rocketshow-designer-1.44.0.tgz +0 -0
  6. package/esm2022/lib/array-sort-pipe.mjs +0 -30
  7. package/esm2022/lib/designer.component.mjs +0 -672
  8. package/esm2022/lib/designer.module.mjs +0 -186
  9. package/esm2022/lib/designer.service.mjs +0 -14
  10. package/esm2022/lib/dropzone/dropzone.component.mjs +0 -93
  11. package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +0 -577
  12. package/esm2022/lib/effect/effect-pan-tilt/effect-pan-tilt.component.mjs +0 -36
  13. package/esm2022/lib/effect/effect.component.mjs +0 -174
  14. package/esm2022/lib/error-dialog/error-dialog.component.mjs +0 -75
  15. package/esm2022/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.mjs +0 -370
  16. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.mjs +0 -147
  17. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.mjs +0 -213
  18. package/esm2022/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.mjs +0 -78
  19. package/esm2022/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.mjs +0 -119
  20. package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +0 -191
  21. package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +0 -162
  22. package/esm2022/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.mjs +0 -365
  23. package/esm2022/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.mjs +0 -151
  24. package/esm2022/lib/fixture/fixture-settings/fixture-settings.component.mjs +0 -46
  25. package/esm2022/lib/fixture/fixture.component.mjs +0 -148
  26. package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +0 -145
  27. package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +0 -641
  28. package/esm2022/lib/intro/intro.component.mjs +0 -95
  29. package/esm2022/lib/master-dimmer/master-dimmer.component.mjs +0 -66
  30. package/esm2022/lib/models/cached-fixture-capability.mjs +0 -9
  31. package/esm2022/lib/models/cached-fixture-channel.mjs +0 -7
  32. package/esm2022/lib/models/cached-fixture.mjs +0 -6
  33. package/esm2022/lib/models/color.mjs +0 -8
  34. package/esm2022/lib/models/composition.mjs +0 -46
  35. package/esm2022/lib/models/effect-curve-profile-channel.mjs +0 -15
  36. package/esm2022/lib/models/effect-curve.mjs +0 -69
  37. package/esm2022/lib/models/effect-pan-tilt.mjs +0 -19
  38. package/esm2022/lib/models/effect.mjs +0 -12
  39. package/esm2022/lib/models/fixture-capability-value.mjs +0 -15
  40. package/esm2022/lib/models/fixture-capability.mjs +0 -127
  41. package/esm2022/lib/models/fixture-channel-value.mjs +0 -11
  42. package/esm2022/lib/models/fixture-channel.mjs +0 -24
  43. package/esm2022/lib/models/fixture-matrix-pixel-group-constraints.mjs +0 -27
  44. package/esm2022/lib/models/fixture-matrix-pixel-group.mjs +0 -12
  45. package/esm2022/lib/models/fixture-matrix.mjs +0 -25
  46. package/esm2022/lib/models/fixture-mode-channel.mjs +0 -26
  47. package/esm2022/lib/models/fixture-mode.mjs +0 -17
  48. package/esm2022/lib/models/fixture-physical.mjs +0 -14
  49. package/esm2022/lib/models/fixture-profile.mjs +0 -85
  50. package/esm2022/lib/models/fixture-wheel-slot.mjs +0 -26
  51. package/esm2022/lib/models/fixture-wheel.mjs +0 -15
  52. package/esm2022/lib/models/fixture.mjs +0 -40
  53. package/esm2022/lib/models/preset-fixture.mjs +0 -10
  54. package/esm2022/lib/models/preset-region-scene.mjs +0 -8
  55. package/esm2022/lib/models/preset.mjs +0 -65
  56. package/esm2022/lib/models/project.mjs +0 -78
  57. package/esm2022/lib/models/scene-playback-region.mjs +0 -11
  58. package/esm2022/lib/models/scene.mjs +0 -27
  59. package/esm2022/lib/preset/preset-settings/preset-settings.component.mjs +0 -194
  60. package/esm2022/lib/preset/preset.component.mjs +0 -131
  61. package/esm2022/lib/preview/models/color-changer-3d.mjs +0 -52
  62. package/esm2022/lib/preview/models/fixture-3d.mjs +0 -260
  63. package/esm2022/lib/preview/models/moving-head-3d.mjs +0 -115
  64. package/esm2022/lib/preview/preview.component.mjs +0 -216
  65. package/esm2022/lib/project/project-browser/project-browser.component.mjs +0 -143
  66. package/esm2022/lib/project/project-import/project-import.component.mjs +0 -107
  67. package/esm2022/lib/project/project-save/project-save.component.mjs +0 -178
  68. package/esm2022/lib/project/project-share/project-share.component.mjs +0 -71
  69. package/esm2022/lib/scene/scene-settings/scene-settings.component.mjs +0 -146
  70. package/esm2022/lib/scene/scene.component.mjs +0 -110
  71. package/esm2022/lib/services/animation.service.mjs +0 -16
  72. package/esm2022/lib/services/config.service.mjs +0 -28
  73. package/esm2022/lib/services/effect.service.mjs +0 -14
  74. package/esm2022/lib/services/error-dialog.service.mjs +0 -39
  75. package/esm2022/lib/services/fixture-pool.service.mjs +0 -30
  76. package/esm2022/lib/services/fixture.service.mjs +0 -699
  77. package/esm2022/lib/services/hotkey-target-exclude.service.mjs +0 -24
  78. package/esm2022/lib/services/intro.service.mjs +0 -140
  79. package/esm2022/lib/services/preset.service.mjs +0 -450
  80. package/esm2022/lib/services/preview-mesh.service.mjs +0 -57
  81. package/esm2022/lib/services/preview.service.mjs +0 -481
  82. package/esm2022/lib/services/project-load.service.mjs +0 -206
  83. package/esm2022/lib/services/project.service.mjs +0 -93
  84. package/esm2022/lib/services/scene.service.mjs +0 -164
  85. package/esm2022/lib/services/timeline.service.mjs +0 -726
  86. package/esm2022/lib/services/user-ensure-login.service.mjs +0 -38
  87. package/esm2022/lib/services/user.service.mjs +0 -89
  88. package/esm2022/lib/services/uuid.service.mjs +0 -23
  89. package/esm2022/lib/services/warning-dialog.service.mjs +0 -38
  90. package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +0 -304
  91. package/esm2022/lib/timeline/timeline-grid/timeline-grid.component.mjs +0 -216
  92. package/esm2022/lib/timeline/timeline.component.mjs +0 -418
  93. package/esm2022/lib/user/user-login/user-login.component.mjs +0 -144
  94. package/esm2022/lib/user/user-register/user-register.component.mjs +0 -220
  95. package/esm2022/lib/wait-dialog/wait-dialog.component.mjs +0 -26
  96. package/esm2022/lib/warning-dialog/warning-dialog.component.mjs +0 -68
  97. package/esm2022/public_api.mjs +0 -7
  98. package/esm2022/rocketshow-designer.mjs +0 -5
  99. package/lib/array-sort-pipe.d.ts +0 -7
  100. package/lib/designer.component.d.ts +0 -73
  101. package/lib/designer.module.d.ts +0 -57
  102. package/lib/designer.service.d.ts +0 -6
  103. package/lib/dropzone/dropzone.component.d.ts +0 -24
  104. package/lib/effect/effect-curve/effect-curve.component.d.ts +0 -59
  105. package/lib/effect/effect-pan-tilt/effect-pan-tilt.component.d.ts +0 -15
  106. package/lib/effect/effect.component.d.ts +0 -22
  107. package/lib/error-dialog/error-dialog.component.d.ts +0 -17
  108. package/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.d.ts +0 -41
  109. package/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.d.ts +0 -26
  110. package/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.d.ts +0 -34
  111. package/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.d.ts +0 -15
  112. package/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.d.ts +0 -18
  113. package/lib/fixture/fixture-capability/fixture-capability.component.d.ts +0 -31
  114. package/lib/fixture/fixture-channel/fixture-channel.component.d.ts +0 -25
  115. package/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.d.ts +0 -32
  116. package/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.d.ts +0 -14
  117. package/lib/fixture/fixture-settings/fixture-settings.component.d.ts +0 -14
  118. package/lib/fixture/fixture.component.d.ts +0 -25
  119. package/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.d.ts +0 -28
  120. package/lib/fixture-pool/fixture-pool.component.d.ts +0 -62
  121. package/lib/intro/intro.component.d.ts +0 -11
  122. package/lib/master-dimmer/master-dimmer.component.d.ts +0 -15
  123. package/lib/models/cached-fixture-capability.d.ts +0 -11
  124. package/lib/models/cached-fixture-channel.d.ts +0 -11
  125. package/lib/models/cached-fixture.d.ts +0 -11
  126. package/lib/models/color.d.ts +0 -6
  127. package/lib/models/composition.d.ts +0 -19
  128. package/lib/models/effect-curve-profile-channel.d.ts +0 -5
  129. package/lib/models/effect-curve.d.ts +0 -15
  130. package/lib/models/effect-pan-tilt.d.ts +0 -6
  131. package/lib/models/effect.d.ts +0 -6
  132. package/lib/models/fixture-capability-value.d.ts +0 -10
  133. package/lib/models/fixture-capability.d.ts +0 -117
  134. package/lib/models/fixture-channel-value.d.ts +0 -6
  135. package/lib/models/fixture-channel.d.ts +0 -9
  136. package/lib/models/fixture-matrix-pixel-group-constraints.d.ts +0 -8
  137. package/lib/models/fixture-matrix-pixel-group.d.ts +0 -6
  138. package/lib/models/fixture-matrix.d.ts +0 -6
  139. package/lib/models/fixture-mode-channel.d.ts +0 -8
  140. package/lib/models/fixture-mode.d.ts +0 -8
  141. package/lib/models/fixture-physical.d.ts +0 -4
  142. package/lib/models/fixture-profile.d.ts +0 -39
  143. package/lib/models/fixture-wheel-slot.d.ts +0 -17
  144. package/lib/models/fixture-wheel.d.ts +0 -5
  145. package/lib/models/fixture.d.ts +0 -23
  146. package/lib/models/preset-fixture.d.ts +0 -5
  147. package/lib/models/preset-region-scene.d.ts +0 -9
  148. package/lib/models/preset.d.ts +0 -20
  149. package/lib/models/project.d.ts +0 -31
  150. package/lib/models/scene-playback-region.d.ts +0 -6
  151. package/lib/models/scene.d.ts +0 -11
  152. package/lib/preset/preset-settings/preset-settings.component.d.ts +0 -22
  153. package/lib/preset/preset.component.d.ts +0 -25
  154. package/lib/preview/models/color-changer-3d.d.ts +0 -16
  155. package/lib/preview/models/fixture-3d.d.ts +0 -38
  156. package/lib/preview/models/moving-head-3d.d.ts +0 -23
  157. package/lib/preview/preview.component.d.ts +0 -38
  158. package/lib/project/project-browser/project-browser.component.d.ts +0 -27
  159. package/lib/project/project-import/project-import.component.d.ts +0 -23
  160. package/lib/project/project-save/project-save.component.d.ts +0 -28
  161. package/lib/project/project-share/project-share.component.d.ts +0 -16
  162. package/lib/scene/scene-settings/scene-settings.component.d.ts +0 -20
  163. package/lib/scene/scene.component.d.ts +0 -22
  164. package/lib/services/animation.service.d.ts +0 -7
  165. package/lib/services/config.service.d.ts +0 -20
  166. package/lib/services/effect.service.d.ts +0 -8
  167. package/lib/services/error-dialog.service.d.ts +0 -12
  168. package/lib/services/fixture-pool.service.d.ts +0 -10
  169. package/lib/services/fixture.service.d.ts +0 -70
  170. package/lib/services/hotkey-target-exclude.service.d.ts +0 -7
  171. package/lib/services/intro.service.d.ts +0 -21
  172. package/lib/services/preset.service.d.ts +0 -64
  173. package/lib/services/preview-mesh.service.d.ts +0 -14
  174. package/lib/services/preview.service.d.ts +0 -42
  175. package/lib/services/project-load.service.d.ts +0 -36
  176. package/lib/services/project.service.d.ts +0 -26
  177. package/lib/services/scene.service.d.ts +0 -30
  178. package/lib/services/timeline.service.d.ts +0 -70
  179. package/lib/services/user-ensure-login.service.d.ts +0 -14
  180. package/lib/services/user.service.d.ts +0 -22
  181. package/lib/services/uuid.service.d.ts +0 -7
  182. package/lib/services/warning-dialog.service.d.ts +0 -12
  183. package/lib/timeline/composition-settings/composition-settings.component.d.ts +0 -48
  184. package/lib/timeline/timeline-grid/timeline-grid.component.d.ts +0 -22
  185. package/lib/timeline/timeline.component.d.ts +0 -50
  186. package/lib/user/user-login/user-login.component.d.ts +0 -21
  187. package/lib/user/user-register/user-register.component.d.ts +0 -26
  188. package/lib/wait-dialog/wait-dialog.component.d.ts +0 -8
  189. package/lib/warning-dialog/warning-dialog.component.d.ts +0 -16
  190. package/public_api.d.ts +0 -3
  191. package/rocketshow-designer-1.40.0.tgz +0 -0
@@ -1,641 +0,0 @@
1
- import { Component, HostListener } from '@angular/core';
2
- import { TranslateService } from '@ngx-translate/core';
3
- import { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';
4
- import { ToastrService } from 'ngx-toastr';
5
- import { Subject } from 'rxjs';
6
- import { catchError, finalize } from 'rxjs/operators';
7
- import { Fixture } from '../models/fixture';
8
- import { ConfigService } from '../services/config.service';
9
- import { FixtureService } from '../services/fixture.service';
10
- import { PresetService } from '../services/preset.service';
11
- import { PreviewService } from '../services/preview.service';
12
- import { ProjectService } from '../services/project.service';
13
- import { UuidService } from '../services/uuid.service';
14
- import { FixturePoolCreateFromFileComponent } from './fixture-pool-create-from-file/fixture-pool-create-from-file.component';
15
- import { PresetFixture } from '../models/preset-fixture';
16
- import * as i0 from "@angular/core";
17
- import * as i1 from "ngx-bootstrap/modal";
18
- import * as i2 from "../services/fixture.service";
19
- import * as i3 from "../services/uuid.service";
20
- import * as i4 from "../services/project.service";
21
- import * as i5 from "../services/preview.service";
22
- import * as i6 from "@ngx-translate/core";
23
- import * as i7 from "ngx-toastr";
24
- import * as i8 from "../services/preset.service";
25
- import * as i9 from "../services/config.service";
26
- import * as i10 from "@angular/common";
27
- import * as i11 from "@angular/forms";
28
- import * as i12 from "ngx-bootstrap/popover";
29
- import * as i13 from "ngx-sortablejs-plus";
30
- import * as i14 from "../array-sort-pipe";
31
- function FixturePoolComponent_a_15_Template(rf, ctx) { if (rf & 1) {
32
- i0.ɵɵelementStart(0, "a", 44)(1, "p", 45);
33
- i0.ɵɵelement(2, "i", 46);
34
- i0.ɵɵelementEnd()();
35
- } }
36
- function FixturePoolComponent_div_16_Template(rf, ctx) { if (rf & 1) {
37
- const _r1 = i0.ɵɵgetCurrentView();
38
- i0.ɵɵelementStart(0, "div", 47)(1, "div", 5)(2, "div", 48)(3, "p", 49);
39
- i0.ɵɵelement(4, "span");
40
- i0.ɵɵtext(5);
41
- i0.ɵɵelementEnd()();
42
- i0.ɵɵelementStart(6, "div", 50)(7, "a", 51);
43
- i0.ɵɵlistener("click", function FixturePoolComponent_div_16_Template_a_click_7_listener() { const profile_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.addFixture(profile_r2); return i0.ɵɵresetView(false); });
44
- i0.ɵɵelement(8, "i", 19);
45
- i0.ɵɵelementEnd()()()();
46
- } if (rf & 2) {
47
- const profile_r2 = ctx.$implicit;
48
- const ctx_r2 = i0.ɵɵnextContext();
49
- i0.ɵɵadvance(4);
50
- i0.ɵɵclassMapInterpolate1("icon-", ctx_r2.fixtureService.getFixtureIconClass(profile_r2), " mr-1");
51
- i0.ɵɵadvance();
52
- i0.ɵɵtextInterpolate2(" ", profile_r2.manufacturerName, " - ", profile_r2.name, " ");
53
- } }
54
- function FixturePoolComponent_button_27_i_1_Template(rf, ctx) { if (rf & 1) {
55
- i0.ɵɵelement(0, "i", 55);
56
- } }
57
- function FixturePoolComponent_button_27_i_2_Template(rf, ctx) { if (rf & 1) {
58
- i0.ɵɵelement(0, "i", 56);
59
- } }
60
- function FixturePoolComponent_button_27_Template(rf, ctx) { if (rf & 1) {
61
- const _r4 = i0.ɵɵgetCurrentView();
62
- i0.ɵɵelementStart(0, "button", 52);
63
- i0.ɵɵlistener("click", function FixturePoolComponent_button_27_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.updateProfiles(); return i0.ɵɵresetView(false); });
64
- i0.ɵɵtemplate(1, FixturePoolComponent_button_27_i_1_Template, 1, 0, "i", 53)(2, FixturePoolComponent_button_27_i_2_Template, 1, 0, "i", 54);
65
- i0.ɵɵtext(3);
66
- i0.ɵɵpipe(4, "translate");
67
- i0.ɵɵelementEnd();
68
- } if (rf & 2) {
69
- const ctx_r2 = i0.ɵɵnextContext();
70
- i0.ɵɵproperty("disabled", ctx_r2.updatingProfiles);
71
- i0.ɵɵadvance();
72
- i0.ɵɵproperty("ngIf", ctx_r2.updatingProfiles);
73
- i0.ɵɵadvance();
74
- i0.ɵɵproperty("ngIf", !ctx_r2.updatingProfiles);
75
- i0.ɵɵadvance();
76
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(4, 4, "designer.fixture-pool.update-profiles"), " ");
77
- } }
78
- function FixturePoolComponent_div_47_Template(rf, ctx) { if (rf & 1) {
79
- const _r5 = i0.ɵɵgetCurrentView();
80
- i0.ɵɵelementStart(0, "div", 57);
81
- i0.ɵɵlistener("click", function FixturePoolComponent_div_47_Template_div_click_0_listener() { const fixture_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectFixture(fixture_r6)); });
82
- i0.ɵɵelementStart(1, "div", 5)(2, "div", 58);
83
- i0.ɵɵelement(3, "i", 59);
84
- i0.ɵɵelementEnd();
85
- i0.ɵɵelementStart(4, "div", 60)(5, "p", 49);
86
- i0.ɵɵelement(6, "span");
87
- i0.ɵɵtext(7);
88
- i0.ɵɵelementEnd()();
89
- i0.ɵɵelementStart(8, "div", 61)(9, "a", 51);
90
- i0.ɵɵlistener("click", function FixturePoolComponent_div_47_Template_a_click_9_listener() { const fixture_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.removeFixture(fixture_r6); return i0.ɵɵresetView(false); });
91
- i0.ɵɵelement(10, "i", 62);
92
- i0.ɵɵelementEnd()()()();
93
- } if (rf & 2) {
94
- const fixture_r6 = ctx.$implicit;
95
- const ctx_r2 = i0.ɵɵnextContext();
96
- i0.ɵɵclassProp("active", fixture_r6 == ctx_r2.selectedFixture);
97
- i0.ɵɵadvance(6);
98
- i0.ɵɵclassMapInterpolate1("icon-", ctx_r2.fixtureService.getFixtureIconClass(ctx_r2.fixtureService.getProfileByUuid(fixture_r6.profileUuid)), " mr-1");
99
- i0.ɵɵadvance();
100
- i0.ɵɵtextInterpolate1("", fixture_r6.name, " ");
101
- } }
102
- function FixturePoolComponent_div_64_Template(rf, ctx) { if (rf & 1) {
103
- const _r7 = i0.ɵɵgetCurrentView();
104
- i0.ɵɵelementStart(0, "div", 63);
105
- i0.ɵɵlistener("mousedown", function FixturePoolComponent_div_64_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.channelMouseDown($event)); })("mouseover", function FixturePoolComponent_div_64_Template_div_mouseover_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.channelMouseOver($event)); });
106
- i0.ɵɵelementStart(1, "div", 64)(2, "div", 65)(3, "small");
107
- i0.ɵɵtext(4, "\u00A0");
108
- i0.ɵɵelementEnd()()()();
109
- } if (rf & 2) {
110
- const i_r8 = ctx.index;
111
- const ctx_r2 = i0.ɵɵnextContext();
112
- i0.ɵɵclassProp("dmx-channel-occupied", ctx_r2.channelOccupied(i_r8))("dmx-channel-occupied-start", ctx_r2.channelOccupiedStart(i_r8))("dmx-channel-occupied-end", ctx_r2.channelOccupiedEnd(i_r8))("dmx-channel-selected", ctx_r2.channelSelected(i_r8))("dmx-channel-overlapped", ctx_r2.channelOverlapped(i_r8));
113
- i0.ɵɵpropertyInterpolate("popover", i_r8 + 1);
114
- i0.ɵɵattribute("data-index", i_r8);
115
- i0.ɵɵadvance();
116
- i0.ɵɵclassProp("dmx-channel-text-visible", ctx_r2.showChannelNumbers);
117
- i0.ɵɵattribute("data-index", i_r8);
118
- i0.ɵɵadvance();
119
- i0.ɵɵattribute("data-index", i_r8);
120
- i0.ɵɵadvance();
121
- i0.ɵɵattribute("data-index", i_r8);
122
- } }
123
- function FixturePoolComponent_div_66_option_13_Template(rf, ctx) { if (rf & 1) {
124
- i0.ɵɵelementStart(0, "option", 72);
125
- i0.ɵɵtext(1);
126
- i0.ɵɵpipe(2, "translate");
127
- i0.ɵɵelementEnd();
128
- } if (rf & 2) {
129
- const mode_r10 = ctx.$implicit;
130
- const ctx_r2 = i0.ɵɵnextContext(2);
131
- i0.ɵɵproperty("ngValue", mode_r10.shortName || mode_r10.name);
132
- i0.ɵɵadvance();
133
- i0.ɵɵtextInterpolate3(" ", mode_r10.name, " - ", ctx_r2.fixtureService.getModeChannelCount(ctx_r2.selectedFixtureProfile, mode_r10), " ", i0.ɵɵpipeBind1(2, 4, "designer.fixture-pool.channels"), " ");
134
- } }
135
- function FixturePoolComponent_div_66_option_20_Template(rf, ctx) { if (rf & 1) {
136
- i0.ɵɵelementStart(0, "option", 72);
137
- i0.ɵɵtext(1);
138
- i0.ɵɵelementEnd();
139
- } if (rf & 2) {
140
- const i_r11 = ctx.index;
141
- i0.ɵɵproperty("ngValue", i_r11);
142
- i0.ɵɵadvance();
143
- i0.ɵɵtextInterpolate1(" ", i_r11 + 1, " ");
144
- } }
145
- function FixturePoolComponent_div_66_Template(rf, ctx) { if (rf & 1) {
146
- const _r9 = i0.ɵɵgetCurrentView();
147
- i0.ɵɵelementStart(0, "div")(1, "div", 20)(2, "label", 66);
148
- i0.ɵɵtext(3);
149
- i0.ɵɵpipe(4, "translate");
150
- i0.ɵɵelementEnd();
151
- i0.ɵɵelementStart(5, "div", 67)(6, "input", 68);
152
- i0.ɵɵtwoWayListener("ngModelChange", function FixturePoolComponent_div_66_Template_input_ngModelChange_6_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.selectedFixture.name, $event) || (ctx_r2.selectedFixture.name = $event); return i0.ɵɵresetView($event); });
153
- i0.ɵɵelementEnd()()();
154
- i0.ɵɵelementStart(7, "div", 20)(8, "label", 69);
155
- i0.ɵɵtext(9);
156
- i0.ɵɵpipe(10, "translate");
157
- i0.ɵɵelementEnd();
158
- i0.ɵɵelementStart(11, "div", 67)(12, "select", 70);
159
- i0.ɵɵlistener("ngModelChange", function FixturePoolComponent_div_66_Template_select_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectedFixture.modeShortName = $event); });
160
- i0.ɵɵtemplate(13, FixturePoolComponent_div_66_option_13_Template, 3, 6, "option", 71);
161
- i0.ɵɵelementEnd()()();
162
- i0.ɵɵelementStart(14, "div", 20)(15, "label", 69);
163
- i0.ɵɵtext(16);
164
- i0.ɵɵpipe(17, "translate");
165
- i0.ɵɵelementEnd();
166
- i0.ɵɵelementStart(18, "div", 67)(19, "select", 70);
167
- i0.ɵɵlistener("ngModelChange", function FixturePoolComponent_div_66_Template_select_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectedFixture.dmxFirstChannel = $event); });
168
- i0.ɵɵtemplate(20, FixturePoolComponent_div_66_option_20_Template, 2, 2, "option", 71);
169
- i0.ɵɵelementEnd()()();
170
- i0.ɵɵelementStart(21, "div", 20);
171
- i0.ɵɵelement(22, "label", 69);
172
- i0.ɵɵelementStart(23, "div", 67)(24, "button", 43);
173
- i0.ɵɵlistener("click", function FixturePoolComponent_div_66_Template_button_click_24_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.addCopy(ctx_r2.selectedFixture)); });
174
- i0.ɵɵtext(25);
175
- i0.ɵɵpipe(26, "translate");
176
- i0.ɵɵelementEnd()()()();
177
- } if (rf & 2) {
178
- const ctx_r2 = i0.ɵɵnextContext();
179
- i0.ɵɵadvance(3);
180
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 9, "designer.fixture-pool.fixture-name"));
181
- i0.ɵɵadvance(3);
182
- i0.ɵɵtwoWayProperty("ngModel", ctx_r2.selectedFixture.name);
183
- i0.ɵɵadvance(3);
184
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(10, 11, "designer.fixture-pool.mode"));
185
- i0.ɵɵadvance(3);
186
- i0.ɵɵproperty("ngModel", ctx_r2.selectedFixture.modeShortName);
187
- i0.ɵɵadvance();
188
- i0.ɵɵproperty("ngForOf", ctx_r2.selectedFixtureProfile.modes);
189
- i0.ɵɵadvance(3);
190
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(17, 13, "designer.fixture-pool.first-channel"));
191
- i0.ɵɵadvance(3);
192
- i0.ɵɵproperty("ngModel", ctx_r2.selectedFixture.dmxFirstChannel);
193
- i0.ɵɵadvance();
194
- i0.ɵɵproperty("ngForOf", ctx_r2.dmxChannels);
195
- i0.ɵɵadvance(5);
196
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(26, 15, "designer.fixture.add-copy"), " ");
197
- } }
198
- export class FixturePoolComponent {
199
- constructor(bsModalRef, fixtureService, uuidService, projectService, previewService, translateService, toastrService, presetService, configService, modalService) {
200
- this.bsModalRef = bsModalRef;
201
- this.fixtureService = fixtureService;
202
- this.uuidService = uuidService;
203
- this.projectService = projectService;
204
- this.previewService = previewService;
205
- this.translateService = translateService;
206
- this.toastrService = toastrService;
207
- this.presetService = presetService;
208
- this.configService = configService;
209
- this.modalService = modalService;
210
- this.loadingProfiles = false;
211
- this.dmxChannels = [];
212
- this.showChannelNumbers = false;
213
- this.onClose = new Subject();
214
- this.fixturePool = [...this.projectService.project.fixtures];
215
- if (this.fixturePool.length > 0) {
216
- this.selectFixture(this.fixturePool[0]);
217
- }
218
- }
219
- ngOnInit() {
220
- for (let i = 0; i < 512; i++) {
221
- this.dmxChannels.push(0);
222
- }
223
- this.loadProfiles();
224
- }
225
- loadProfiles() {
226
- this.loadingProfiles = true;
227
- this.fixtureService.getSearchProfiles().subscribe((profiles) => {
228
- this.profiles = profiles;
229
- this.filterProfiles();
230
- this.loadingProfiles = false;
231
- });
232
- }
233
- selectFixture(fixture) {
234
- this.selectedFixtureProfile = undefined;
235
- if (fixture) {
236
- this.selectedFixtureProfile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
237
- }
238
- this.selectedFixture = fixture;
239
- }
240
- filterProfiles() {
241
- if (!this.searchExpression || !this.profiles) {
242
- this.filteredProfiles = this.profiles;
243
- return;
244
- }
245
- this.filteredProfiles = [];
246
- const keywords = this.searchExpression.split(' ');
247
- for (const profile of this.profiles) {
248
- let foundKeywords = 0;
249
- for (const keyword of keywords) {
250
- if (profile.uuid.toLowerCase().indexOf(keyword.toLowerCase()) !== -1 ||
251
- profile.name.toLowerCase().indexOf(keyword.toLowerCase()) !== -1 ||
252
- profile.manufacturerName.toLowerCase().indexOf(keyword.toLowerCase()) !== -1) {
253
- foundKeywords++;
254
- }
255
- }
256
- if (foundKeywords === keywords.length) {
257
- this.filteredProfiles.push(profile);
258
- }
259
- }
260
- }
261
- addFixture(searchProfile) {
262
- // Load the profile details, if not already done. There is only a
263
- // minimal profile passed from the search.
264
- this.fixtureService.loadProfileByUuid(searchProfile.uuid).subscribe(() => {
265
- const profile = this.fixtureService.getProfileByUuid(searchProfile.uuid);
266
- const newFixture = this.fixtureService.addFixture(profile, this.fixturePool);
267
- if (newFixture) {
268
- this.selectFixture(newFixture);
269
- }
270
- });
271
- }
272
- addCopy(originalFixture) {
273
- const fixture = new Fixture();
274
- fixture.uuid = this.uuidService.getUuid();
275
- fixture.profileUuid = originalFixture.profileUuid;
276
- fixture.name = originalFixture.name;
277
- fixture.modeShortName = originalFixture.modeShortName;
278
- fixture.dmxFirstChannel = originalFixture.dmxFirstChannel;
279
- fixture.dmxUniverseUuid = originalFixture.dmxUniverseUuid;
280
- this.fixturePool.push(fixture);
281
- this.selectFixture(fixture);
282
- }
283
- removeFixture(fixture) {
284
- for (let i = 0; i < this.fixturePool.length; i++) {
285
- if (this.fixturePool[i].uuid === fixture.uuid) {
286
- if (this.selectedFixture === this.fixturePool[i]) {
287
- this.selectFixture(undefined);
288
- }
289
- this.fixturePool.splice(i, 1);
290
- break;
291
- }
292
- }
293
- if (!this.selectedFixture && this.fixturePool && this.fixturePool.length > 0) {
294
- this.selectFixture((this.selectedFixture = this.fixturePool[0]));
295
- }
296
- // remove unused profiles
297
- for (let i = 0; i < this.projectService.project.fixtureProfiles.length; i++) {
298
- let profileUsed = false;
299
- for (const fixtureInPool of this.fixturePool) {
300
- if (fixtureInPool.profileUuid === this.projectService.project.fixtureProfiles[i].uuid) {
301
- profileUsed = true;
302
- break;
303
- }
304
- }
305
- if (!profileUsed) {
306
- this.projectService.project.fixtureProfiles.splice(i, 1);
307
- }
308
- }
309
- }
310
- channelOccupied(index) {
311
- for (const fixture of this.fixturePool) {
312
- const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
313
- const mode = this.fixtureService.getModeByFixture(profile, fixture);
314
- const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
315
- if (index >= fixture.dmxFirstChannel && index < fixture.dmxFirstChannel + channelCount) {
316
- return true;
317
- }
318
- }
319
- return false;
320
- }
321
- channelOccupiedStart(index) {
322
- for (const fixture of this.fixturePool) {
323
- if (index === fixture.dmxFirstChannel) {
324
- return true;
325
- }
326
- }
327
- return false;
328
- }
329
- channelOccupiedEnd(index) {
330
- for (const fixture of this.fixturePool) {
331
- const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
332
- const mode = this.fixtureService.getModeByFixture(profile, fixture);
333
- const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
334
- if (index === fixture.dmxFirstChannel + channelCount - 1) {
335
- return true;
336
- }
337
- }
338
- return false;
339
- }
340
- channelOverlapped(index) {
341
- let occupiedFixture;
342
- for (const fixture of this.fixturePool) {
343
- const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
344
- const mode = this.fixtureService.getModeByFixture(profile, fixture);
345
- const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
346
- if (index >= fixture.dmxFirstChannel && index < fixture.dmxFirstChannel + channelCount) {
347
- if (occupiedFixture) {
348
- if (occupiedFixture.dmxFirstChannel !== fixture.dmxFirstChannel || occupiedFixture.modeShortName !== fixture.modeShortName) {
349
- // fixtures are allowed to overlap, if they start at the same channel and
350
- // use the same mode. otherwise it's not allowed.
351
- return true;
352
- }
353
- }
354
- else {
355
- occupiedFixture = fixture;
356
- }
357
- }
358
- }
359
- return false;
360
- }
361
- channelMouseDown(event) {
362
- // start dragging
363
- const selectedIndex = event.target.dataset.index;
364
- let newSelectedFixture;
365
- // find a dragging fixture and select it, but don't change the selection, if the
366
- // currently selected fixture might also be selected (on overlapped fixtures)
367
- for (const fixture of this.fixturePool) {
368
- const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
369
- const mode = this.fixtureService.getModeByFixture(profile, fixture);
370
- const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
371
- if (selectedIndex >= fixture.dmxFirstChannel && selectedIndex <= fixture.dmxFirstChannel + channelCount - 1) {
372
- if (this.selectedFixture === fixture) {
373
- newSelectedFixture = fixture;
374
- break;
375
- }
376
- if (!newSelectedFixture) {
377
- newSelectedFixture = fixture;
378
- }
379
- }
380
- }
381
- if (newSelectedFixture) {
382
- if (newSelectedFixture !== this.selectedFixture) {
383
- this.selectFixture(newSelectedFixture);
384
- }
385
- this.channelDragFixture = newSelectedFixture;
386
- this.channelDragOffset = selectedIndex - newSelectedFixture.dmxFirstChannel;
387
- }
388
- }
389
- channelSelected(index) {
390
- if (!this.selectedFixture) {
391
- return false;
392
- }
393
- if (index >= this.selectedFixture.dmxFirstChannel) {
394
- const profile = this.fixtureService.getProfileByUuid(this.selectedFixture.profileUuid);
395
- const mode = this.fixtureService.getModeByFixture(profile, this.selectedFixture);
396
- const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
397
- if (index < this.selectedFixture.dmxFirstChannel + channelCount) {
398
- return true;
399
- }
400
- }
401
- return false;
402
- }
403
- // register mouse up globally (e.g. also outside the DMX mapping)
404
- mouseUp(event) {
405
- // finish dragging
406
- this.channelDragFixture = undefined;
407
- this.channelDragOffset = undefined;
408
- }
409
- channelMouseOver(event) {
410
- if (!this.channelDragFixture) {
411
- return;
412
- }
413
- // perform dragging
414
- const selectedIndex = event.target.dataset.index;
415
- const profile = this.fixtureService.getProfileByUuid(this.channelDragFixture.profileUuid);
416
- const mode = this.fixtureService.getModeByFixture(profile, this.selectedFixture);
417
- const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
418
- if (selectedIndex - this.channelDragOffset >= 0 && selectedIndex - this.channelDragOffset + channelCount - 1 <= 511) {
419
- this.channelDragFixture.dmxFirstChannel = selectedIndex - this.channelDragOffset;
420
- }
421
- }
422
- ok() {
423
- // don't allow OK if overlapping fixtures exist
424
- for (let i = 0; i < this.dmxChannels.length; i++) {
425
- if (this.channelOverlapped(i)) {
426
- const msg = 'designer.fixture-pool.channel-occupied';
427
- const title = 'designer.fixture-pool.channel-occupied-title';
428
- this.translateService.get([msg, title]).subscribe((result) => {
429
- this.toastrService.error(result[msg], result[title]);
430
- });
431
- return;
432
- }
433
- }
434
- this.projectService.project.fixtures = this.fixturePool;
435
- // remove deleted fixtures from preset fixtures
436
- for (let i = this.projectService.project.presetFixtures.length - 1; i >= 0; i--) {
437
- let found = false;
438
- const presetFixture = this.projectService.project.presetFixtures[i];
439
- for (let fixture of this.projectService.project.fixtures) {
440
- if (presetFixture.fixtureUuid === fixture.uuid) {
441
- found = true;
442
- break;
443
- }
444
- }
445
- if (!found) {
446
- this.projectService.project.presetFixtures.splice(i, 1);
447
- }
448
- }
449
- // add the new fixtures to the preset fixtures
450
- for (let fixture of this.projectService.project.fixtures) {
451
- let found = false;
452
- for (let presetFixture of this.projectService.project.presetFixtures) {
453
- if (presetFixture.fixtureUuid === fixture.uuid) {
454
- found = true;
455
- break;
456
- }
457
- }
458
- if (!found) {
459
- if (this.fixtureService.fixtureHasGeneralChannel(fixture)) {
460
- const presetFixture = new PresetFixture();
461
- presetFixture.fixtureUuid = fixture.uuid;
462
- this.projectService.project.presetFixtures.push(presetFixture);
463
- }
464
- const pixelKeys = this.fixtureService.fixtureGetUniquePixelKeys(fixture);
465
- for (let pixelKey of pixelKeys) {
466
- const presetFixture = new PresetFixture();
467
- presetFixture.fixtureUuid = fixture.uuid;
468
- presetFixture.pixelKey = pixelKey;
469
- this.projectService.project.presetFixtures.push(presetFixture);
470
- }
471
- }
472
- }
473
- this.fixtureService.updateCachedFixtures();
474
- this.presetService.removeDeletedFixtures();
475
- this.previewService.updateFixtureSetup();
476
- this.presetService.updateFixtureSelection();
477
- this.presetService.fixtureSelectionChanged.next();
478
- this.presetService.previewLive();
479
- this.onClose.next(1);
480
- this.bsModalRef.hide();
481
- }
482
- cancel() {
483
- this.onClose.next(2);
484
- this.bsModalRef.hide();
485
- }
486
- updateProfiles() {
487
- this.updatingProfiles = true;
488
- // TODO
489
- this.fixtureService
490
- .updateProfiles()
491
- .pipe(finalize(() => {
492
- this.updatingProfiles = false;
493
- }), catchError(() => {
494
- const msg = 'designer.fixture-pool.profiles-update-error';
495
- const title = 'designer.fixture-pool.profiles-update-error-title';
496
- this.translateService.get([msg, title]).subscribe((result) => {
497
- this.toastrService.error(result[msg], result[title]);
498
- });
499
- return undefined;
500
- }))
501
- .subscribe(() => {
502
- this.loadProfiles();
503
- const msg = 'designer.fixture-pool.profiles-updated';
504
- const title = 'designer.fixture-pool.profiles-updated-title';
505
- this.translateService.get([msg, title]).subscribe((result) => {
506
- this.toastrService.success(result[msg], result[title]);
507
- });
508
- });
509
- }
510
- createFixtureFromProfileFile() {
511
- const bsModalRef = this.modalService.show(FixturePoolCreateFromFileComponent, { keyboard: true, ignoreBackdropClick: false });
512
- bsModalRef.content.onClose.subscribe((profile) => {
513
- const newFixture = this.fixtureService.addFixture(profile, this.fixturePool);
514
- this.selectFixture(newFixture);
515
- });
516
- }
517
- handleKeyboardEvent(event) {
518
- this.ok();
519
- }
520
- static { this.ɵfac = function FixturePoolComponent_Factory(t) { return new (t || FixturePoolComponent)(i0.ɵɵdirectiveInject(i1.BsModalRef), i0.ɵɵdirectiveInject(i2.FixtureService), i0.ɵɵdirectiveInject(i3.UuidService), i0.ɵɵdirectiveInject(i4.ProjectService), i0.ɵɵdirectiveInject(i5.PreviewService), i0.ɵɵdirectiveInject(i6.TranslateService), i0.ɵɵdirectiveInject(i7.ToastrService), i0.ɵɵdirectiveInject(i8.PresetService), i0.ɵɵdirectiveInject(i9.ConfigService), i0.ɵɵdirectiveInject(i1.BsModalService)); }; }
521
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FixturePoolComponent, selectors: [["lib-app-fixture-pool"]], hostBindings: function FixturePoolComponent_HostBindings(rf, ctx) { if (rf & 1) {
522
- i0.ɵɵlistener("mouseup", function FixturePoolComponent_mouseup_HostBindingHandler($event) { return ctx.mouseUp($event); }, false, i0.ɵɵresolveWindow)("keydown.enter", function FixturePoolComponent_keydown_enter_HostBindingHandler($event) { return ctx.handleKeyboardEvent($event); }, false, i0.ɵɵresolveDocument);
523
- } }, decls: 74, vars: 37, consts: [[1, "modal-header"], [1, "modal-title", "pull-left"], ["type", "button", "aria-label", "Close", 1, "close", "pull-right", 3, "click"], ["aria-hidden", "true"], [1, "modal-body"], [1, "row"], [1, "col-6"], ["type", "text", "id", "searchSet", 1, "form-control", "input-block", "mb-3", 3, "input", "placeholder"], [1, "card", "border-secondary", "w-100", 2, "height", "200px"], [1, "card-body", "p-0", "w-100"], [1, "list-group", "list-group-flush", "w-100"], ["class", "list-group-item flex-column align-items-start d-flex", 4, "ngIf"], ["class", "list-group-item", 4, "ngFor", "ngForOf"], [1, "d-inline-block", "mb-0", "mt-2"], ["href", "https://open-fixture-library.org/", "target", "_blank"], ["href", "https://open-fixture-library.org/fixture-editor", "target", "_blank", "role", "button", 1, "mt-2", "btn", "btn-secondary", "btn-sm", "float-right"], ["aria-hidden", "true", 1, "fa", "fa-file-o"], ["type", "button", "class", "mr-2 mt-2 btn btn-secondary btn-sm float-right", "role", "button", 3, "disabled", "click", 4, "ngIf"], ["type", "button", "role", "button", 1, "btn", "btn-secondary", 3, "click"], ["aria-hidden", "true", 1, "fa", "fa-plus"], [1, "form-group", "row"], [1, "col-lg-4", "col-form-label"], [1, "col-lg-8"], [1, "custom-select"], [1, "card", "border-secondary", 2, "height", "235px"], [1, "card-body", "p-0"], [1, "list-group", "list-group-flush", 3, "sortablejs"], ["class", "list-group-item", "style", "cursor: pointer", 3, "active", "click", 4, "ngFor", "ngForOf"], [1, "row", "mt-3"], [1, "col"], ["id", "myTab", "role", "tablist", 1, "nav", "nav-tabs", "mb-4"], [1, "nav-item"], ["id", "sets-tab", "data-toggle", "tab", "href", "#dmx", "role", "tab", 1, "nav-link", "active"], ["aria-hidden", "true", 1, "icon-ola"], ["id", "compositions-tab", "data-toggle", "tab", "href", "#settings", "role", "tab", 1, "nav-link"], ["aria-hidden", "true", 1, "fa", "fa-cog"], ["id", "myTabContent", 1, "tab-content"], ["id", "dmx", "role", "tabpanel", 1, "tab-pane", "show", "active"], ["class", "dmx-channel", "placement", "top", "triggers", "mouseenter:mouseleave", 3, "dmx-channel-occupied", "dmx-channel-occupied-start", "dmx-channel-occupied-end", "dmx-channel-selected", "dmx-channel-overlapped", "popover", "mousedown", "mouseover", 4, "ngFor", "ngForOf"], ["id", "settings", "role", "tabpanel", 1, "tab-pane"], [4, "ngIf"], [1, "modal-footer"], ["href", "#", "role", "button", 1, "mr-3", "my-auto", 3, "click"], ["type", "button", 1, "btn", "btn-primary", 3, "click"], [1, "list-group-item", "flex-column", "align-items-start", "d-flex"], [1, "mb-0", "mx-auto"], [1, "fa", "fa-spinner", "fa-pulse", "fa-fw"], [1, "list-group-item"], [1, "col-10", "col-auto", "my-auto", "pl-2"], [1, "mb-0"], [1, "col-2", "my-auto"], ["href", "#", "role", "button", 1, "btn", "btn-primary", "btn-sm", "float-right", 3, "click"], ["type", "button", "role", "button", 1, "mr-2", "mt-2", "btn", "btn-secondary", "btn-sm", "float-right", 3, "click", "disabled"], ["class", "fa fa-spinner fa-pulse fa-fw", "aria-hidden", "true", 4, "ngIf"], ["class", "fa fa-download fa-fw", "aria-hidden", "true", 4, "ngIf"], ["aria-hidden", "true", 1, "fa", "fa-spinner", "fa-pulse", "fa-fw"], ["aria-hidden", "true", 1, "fa", "fa-download", "fa-fw"], [1, "list-group-item", 2, "cursor", "pointer", 3, "click"], [1, "col-auto", "list-sort-handle", "my-auto", 2, "cursor", "move", "cursor", "-webkit-grabbing"], ["aria-hidden", "true", 1, "fa", "fa-bars"], [1, "col-auto", "flex-grow", "pl-0", "my-auto"], [1, "col-auto", "my-auto"], ["aria-hidden", "true", 1, "fa", "fa-minus"], ["placement", "top", "triggers", "mouseenter:mouseleave", 1, "dmx-channel", 3, "mousedown", "mouseover", "popover"], [1, "d-flex", "w-100", "dmx-channel-text"], [1, "m-auto", 2, "font-size", "11px"], ["for", "fixtureName", 1, "col-lg-3", "col-form-label"], [1, "col-lg-9"], ["type", "text", "maxlength", "200", "id", "fixtureName", 1, "form-control", 3, "ngModelChange", "ngModel"], [1, "col-lg-3", "col-form-label"], [1, "custom-select", 3, "ngModelChange", "ngModel"], [3, "ngValue", 4, "ngFor", "ngForOf"], [3, "ngValue"]], template: function FixturePoolComponent_Template(rf, ctx) { if (rf & 1) {
524
- i0.ɵɵelementStart(0, "div", 0)(1, "h4", 1);
525
- i0.ɵɵtext(2);
526
- i0.ɵɵpipe(3, "translate");
527
- i0.ɵɵelementEnd();
528
- i0.ɵɵelementStart(4, "button", 2);
529
- i0.ɵɵlistener("click", function FixturePoolComponent_Template_button_click_4_listener() { ctx.cancel(); return false; });
530
- i0.ɵɵelementStart(5, "span", 3);
531
- i0.ɵɵtext(6, "\u00D7");
532
- i0.ɵɵelementEnd()()();
533
- i0.ɵɵelementStart(7, "div", 4)(8, "div", 5)(9, "div", 6)(10, "input", 7);
534
- i0.ɵɵpipe(11, "translate");
535
- i0.ɵɵlistener("input", function FixturePoolComponent_Template_input_input_10_listener($event) { ctx.searchExpression = $event.target.value; return ctx.filterProfiles(); });
536
- i0.ɵɵelementEnd();
537
- i0.ɵɵelementStart(12, "div", 8)(13, "div", 9)(14, "div", 10);
538
- i0.ɵɵtemplate(15, FixturePoolComponent_a_15_Template, 3, 0, "a", 11)(16, FixturePoolComponent_div_16_Template, 9, 5, "div", 12);
539
- i0.ɵɵpipe(17, "sort");
540
- i0.ɵɵelementEnd()()();
541
- i0.ɵɵelementStart(18, "div")(19, "p", 13);
542
- i0.ɵɵtext(20, " Powered by the ");
543
- i0.ɵɵelementStart(21, "a", 14);
544
- i0.ɵɵtext(22, "Open Fixture Library");
545
- i0.ɵɵelementEnd()();
546
- i0.ɵɵelementStart(23, "a", 15);
547
- i0.ɵɵelement(24, "i", 16);
548
- i0.ɵɵtext(25);
549
- i0.ɵɵpipe(26, "translate");
550
- i0.ɵɵelementEnd();
551
- i0.ɵɵtemplate(27, FixturePoolComponent_button_27_Template, 5, 6, "button", 17);
552
- i0.ɵɵelementEnd()();
553
- i0.ɵɵelementStart(28, "div", 6)(29, "div", 5)(30, "div", 6)(31, "button", 18);
554
- i0.ɵɵlistener("click", function FixturePoolComponent_Template_button_click_31_listener() { return ctx.createFixtureFromProfileFile(); });
555
- i0.ɵɵelement(32, "i", 19);
556
- i0.ɵɵtext(33);
557
- i0.ɵɵpipe(34, "translate");
558
- i0.ɵɵelementEnd()();
559
- i0.ɵɵelementStart(35, "div", 6)(36, "div", 20)(37, "label", 21);
560
- i0.ɵɵtext(38);
561
- i0.ɵɵpipe(39, "translate");
562
- i0.ɵɵelementEnd();
563
- i0.ɵɵelementStart(40, "div", 22)(41, "select", 23)(42, "option");
564
- i0.ɵɵtext(43, "Universe 1");
565
- i0.ɵɵelementEnd()()()()()();
566
- i0.ɵɵelementStart(44, "div", 24)(45, "div", 25)(46, "div", 26);
567
- i0.ɵɵtemplate(47, FixturePoolComponent_div_47_Template, 11, 6, "div", 27);
568
- i0.ɵɵelementEnd()()()()();
569
- i0.ɵɵelementStart(48, "div", 28)(49, "div", 29)(50, "ul", 30)(51, "li", 31)(52, "a", 32);
570
- i0.ɵɵelement(53, "i", 33);
571
- i0.ɵɵtext(54);
572
- i0.ɵɵpipe(55, "translate");
573
- i0.ɵɵelementEnd()();
574
- i0.ɵɵelementStart(56, "li", 31)(57, "a", 34);
575
- i0.ɵɵelement(58, "i", 35);
576
- i0.ɵɵtext(59);
577
- i0.ɵɵpipe(60, "translate");
578
- i0.ɵɵelementEnd()()();
579
- i0.ɵɵelementStart(61, "div", 36)(62, "div", 37)(63, "div");
580
- i0.ɵɵtemplate(64, FixturePoolComponent_div_64_Template, 5, 17, "div", 38);
581
- i0.ɵɵelementEnd()();
582
- i0.ɵɵelementStart(65, "div", 39);
583
- i0.ɵɵtemplate(66, FixturePoolComponent_div_66_Template, 27, 17, "div", 40);
584
- i0.ɵɵelementEnd()()()()();
585
- i0.ɵɵelementStart(67, "div", 41)(68, "a", 42);
586
- i0.ɵɵlistener("click", function FixturePoolComponent_Template_a_click_68_listener() { ctx.cancel(); return false; });
587
- i0.ɵɵtext(69);
588
- i0.ɵɵpipe(70, "translate");
589
- i0.ɵɵelementEnd();
590
- i0.ɵɵelementStart(71, "button", 43);
591
- i0.ɵɵlistener("click", function FixturePoolComponent_Template_button_click_71_listener() { return ctx.ok(); });
592
- i0.ɵɵtext(72);
593
- i0.ɵɵpipe(73, "translate");
594
- i0.ɵɵelementEnd()();
595
- } if (rf & 2) {
596
- i0.ɵɵadvance(2);
597
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 16, "designer.fixture-pool.title"));
598
- i0.ɵɵadvance(8);
599
- i0.ɵɵpropertyInterpolate("placeholder", i0.ɵɵpipeBind1(11, 18, "designer.fixture-pool.search-profiles"));
600
- i0.ɵɵadvance(5);
601
- i0.ɵɵproperty("ngIf", ctx.loadingProfiles);
602
- i0.ɵɵadvance();
603
- i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind2(17, 20, ctx.filteredProfiles, "uuid"));
604
- i0.ɵɵadvance(9);
605
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(26, 23, "designer.fixture-pool.add-profile"), " ");
606
- i0.ɵɵadvance(2);
607
- i0.ɵɵproperty("ngIf", ctx.configService.localProfiles);
608
- i0.ɵɵadvance(6);
609
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(34, 25, "designer.fixture-pool.create-fixture-from-profile-file"), " ");
610
- i0.ɵɵadvance(5);
611
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(39, 27, "designer.fixture-pool.universe"));
612
- i0.ɵɵadvance(8);
613
- i0.ɵɵproperty("sortablejs", ctx.fixturePool);
614
- i0.ɵɵadvance();
615
- i0.ɵɵproperty("ngForOf", ctx.fixturePool);
616
- i0.ɵɵadvance(7);
617
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(55, 29, "designer.fixture-pool.dmx"), " ");
618
- i0.ɵɵadvance(5);
619
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(60, 31, "designer.fixture-pool.settings"), " ");
620
- i0.ɵɵadvance(5);
621
- i0.ɵɵproperty("ngForOf", ctx.dmxChannels);
622
- i0.ɵɵadvance(2);
623
- i0.ɵɵproperty("ngIf", ctx.selectedFixture && ctx.selectedFixtureProfile);
624
- i0.ɵɵadvance(3);
625
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(70, 33, "designer.misc.cancel"), " ");
626
- i0.ɵɵadvance(3);
627
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(73, 35, "designer.misc.ok"));
628
- } }, dependencies: [i10.NgForOf, i10.NgIf, i11.NgSelectOption, i11.ɵNgSelectMultipleOption, i11.DefaultValueAccessor, i11.SelectControlValueAccessor, i11.NgControlStatus, i11.MaxLengthValidator, i11.NgModel, i12.PopoverDirective, i13.SortablejsDirective, i6.TranslatePipe, i14.ArraySortPipe], styles: [".list-group-item[_ngcontent-%COMP%]{padding:.3rem 1.25rem}.dmx-channel[_ngcontent-%COMP%]{display:flex;float:left;width:28px;border:1px solid white;margin-left:-1px;margin-bottom:-1px;padding-bottom:2px}.dmx-channel-occupied[_ngcontent-%COMP%]{background-color:#63462e;border-left:none;border-right:none;cursor:move}.dmx-channel-occupied-start[_ngcontent-%COMP%]{border-left:1px solid white;border-top-left-radius:8px;border-bottom-left-radius:8px}.dmx-channel-occupied-end[_ngcontent-%COMP%]{border-right:1px solid white;border-top-right-radius:8px;border-bottom-right-radius:8px}.dmx-channel-selected[_ngcontent-%COMP%]{background-color:#fd7e14}.dmx-channel-overlapped[_ngcontent-%COMP%]{background-color:red;border:1px solid red;cursor:move}.card[_ngcontent-%COMP%]{overflow:auto}"] }); }
629
- }
630
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FixturePoolComponent, [{
631
- type: Component,
632
- args: [{ selector: 'lib-app-fixture-pool', template: "<div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">{{ 'designer.fixture-pool.title' | translate }}</h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"cancel(); (false)\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n</div>\n<div class=\"modal-body\">\n <div class=\"row\">\n <div class=\"col-6\">\n <!-- Search for profiles -->\n <input\n type=\"text\"\n class=\"form-control input-block mb-3\"\n id=\"searchSet\"\n placeholder=\"{{ 'designer.fixture-pool.search-profiles' | translate }}\"\n (input)=\"searchExpression = $event.target.value; filterProfiles()\"\n />\n\n <!-- Profiles -->\n <div class=\"card border-secondary w-100\" style=\"height: 200px\">\n <div class=\"card-body p-0 w-100\">\n <div class=\"list-group list-group-flush w-100\">\n <a *ngIf=\"loadingProfiles\" class=\"list-group-item flex-column align-items-start d-flex\">\n <p class=\"mb-0 mx-auto\">\n <i class=\"fa fa-spinner fa-pulse fa-fw\"></i>\n </p>\n </a>\n\n <div class=\"list-group-item\" *ngFor=\"let profile of filteredProfiles | sort : 'uuid'\">\n <div class=\"row\">\n <div class=\"col-10 col-auto my-auto pl-2\">\n <p class=\"mb-0\">\n <span class=\"icon-{{ fixtureService.getFixtureIconClass(profile) }} mr-1\"></span> {{ profile.manufacturerName }} -\n {{ profile.name }}\n </p>\n </div>\n <div class=\"col-2 my-auto\">\n <a class=\"btn btn-primary btn-sm float-right\" href=\"#\" role=\"button\" (click)=\"addFixture(profile); (false)\">\n <i class=\"fa fa-plus\" aria-hidden=\"true\"></i>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div>\n <p class=\"d-inline-block mb-0 mt-2\">\n Powered by the <a href=\"https://open-fixture-library.org/\" target=\"_blank\">Open Fixture Library</a>\n </p>\n <a\n class=\"mt-2 btn btn-secondary btn-sm float-right\"\n href=\"https://open-fixture-library.org/fixture-editor\"\n target=\"_blank\"\n role=\"button\"\n >\n <i class=\"fa fa-file-o\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.add-profile' | translate }}\n </a>\n <button\n *ngIf=\"configService.localProfiles\"\n type=\"button\"\n class=\"mr-2 mt-2 btn btn-secondary btn-sm float-right\"\n (click)=\"updateProfiles(); (false)\"\n [disabled]=\"updatingProfiles\"\n role=\"button\"\n >\n <i *ngIf=\"updatingProfiles\" class=\"fa fa-spinner fa-pulse fa-fw\" aria-hidden=\"true\"></i>\n <i *ngIf=\"!updatingProfiles\" class=\"fa fa-download fa-fw\" aria-hidden=\"true\"></i>\n {{ 'designer.fixture-pool.update-profiles' | translate }}\n </button>\n </div>\n </div>\n <div class=\"col-6\">\n <div class=\"row\">\n <!-- Add fixture from local profile -->\n <div class=\"col-6\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"createFixtureFromProfileFile()\" role=\"button\">\n <i class=\"fa fa-plus\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.create-fixture-from-profile-file' | translate }}\n </button>\n </div>\n\n <!-- Universe -->\n <div class=\"col-6\">\n <div class=\"form-group row\">\n <label class=\"col-lg-4 col-form-label\">{{ 'designer.fixture-pool.universe' | translate }}</label>\n <div class=\"col-lg-8\">\n <select class=\"custom-select\">\n <option>Universe 1</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Fixtures -->\n <div class=\"card border-secondary\" style=\"height: 235px\">\n <div class=\"card-body p-0\">\n <div class=\"list-group list-group-flush\" [sortablejs]=\"fixturePool\">\n <div\n class=\"list-group-item\"\n *ngFor=\"let fixture of fixturePool\"\n [class.active]=\"fixture == selectedFixture\"\n (click)=\"selectFixture(fixture)\"\n style=\"cursor: pointer\"\n >\n <div class=\"row\">\n <div class=\"col-auto list-sort-handle my-auto\" style=\"cursor: move; cursor: -webkit-grabbing\">\n <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"col-auto flex-grow pl-0 my-auto\">\n <p class=\"mb-0\">\n <span class=\"icon-{{ fixtureService.getFixtureIconClass(fixtureService.getProfileByUuid(fixture.profileUuid)) }} mr-1\">\n </span\n >{{ fixture.name }}\n </p>\n </div>\n <div class=\"col-auto my-auto\">\n <a class=\"btn btn-primary btn-sm float-right\" href=\"#\" role=\"button\" (click)=\"removeFixture(fixture); (false)\">\n <i class=\"fa fa-minus\" aria-hidden=\"true\"></i>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"row mt-3\">\n <div class=\"col\">\n <!-- Tab navigation -->\n <ul class=\"nav nav-tabs mb-4\" id=\"myTab\" role=\"tablist\">\n <li class=\"nav-item\">\n <a class=\"nav-link active\" id=\"sets-tab\" data-toggle=\"tab\" href=\"#dmx\" role=\"tab\">\n <i class=\"icon-ola\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.dmx' | translate }}\n </a>\n </li>\n <li class=\"nav-item\">\n <a class=\"nav-link\" id=\"compositions-tab\" data-toggle=\"tab\" href=\"#settings\" role=\"tab\">\n <i class=\"fa fa-cog\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.settings' | translate }}\n </a>\n </li>\n </ul>\n\n <!-- Tab content -->\n <div class=\"tab-content\" id=\"myTabContent\">\n <!-- DMX universe overview-->\n <div class=\"tab-pane show active\" id=\"dmx\" role=\"tabpanel\">\n <!-- Show all channel numbers -->\n <!-- <div class=\"form-group row\">\n <div class=\"col-auto flex-grow\"></div>\n <div class=\"col-lg-3 d-flex\">\n <div class=\"form-check my-auto ml-auto\">\n <input type=\"checkbox\" class=\"form-check-input\" id=\"showChannelNumbers\" [ngModel]=\"showChannelNumbers\"\n (ngModelChange)=\"showChannelNumbers = $event\">\n <label class=\"form-check-label\" for=\"showChannelNumbers\">Show channels</label>\n </div>\n </div>\n </div> -->\n\n <!-- List of DMX channels -->\n <div>\n <div\n *ngFor=\"let channel of dmxChannels; let i = index\"\n class=\"dmx-channel\"\n [class.dmx-channel-occupied]=\"channelOccupied(i)\"\n [class.dmx-channel-occupied-start]=\"channelOccupiedStart(i)\"\n [class.dmx-channel-occupied-end]=\"channelOccupiedEnd(i)\"\n [class.dmx-channel-selected]=\"channelSelected(i)\"\n [class.dmx-channel-overlapped]=\"channelOverlapped(i)\"\n (mousedown)=\"channelMouseDown($event)\"\n (mouseover)=\"channelMouseOver($event)\"\n [attr.data-index]=\"i\"\n popover=\"{{ i + 1 }}\"\n placement=\"top\"\n triggers=\"mouseenter:mouseleave\"\n >\n <div class=\"d-flex w-100 dmx-channel-text\" [attr.data-index]=\"i\" [class.dmx-channel-text-visible]=\"showChannelNumbers\">\n <div class=\"m-auto\" style=\"font-size: 11px\" [attr.data-index]=\"i\"><small [attr.data-index]=\"i\">&nbsp;</small></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Fixture settings -->\n <div class=\"tab-pane\" id=\"settings\" role=\"tabpanel\">\n <div *ngIf=\"selectedFixture && selectedFixtureProfile\">\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\" for=\"fixtureName\">{{ 'designer.fixture-pool.fixture-name' | translate }}</label>\n <div class=\"col-lg-9\">\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"selectedFixture.name\" maxlength=\"200\" id=\"fixtureName\" />\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\">{{ 'designer.fixture-pool.mode' | translate }}</label>\n <div class=\"col-lg-9\">\n <select\n class=\"custom-select\"\n [ngModel]=\"selectedFixture.modeShortName\"\n (ngModelChange)=\"selectedFixture.modeShortName = $event\"\n >\n <option *ngFor=\"let mode of selectedFixtureProfile.modes\" [ngValue]=\"mode.shortName || mode.name\">\n {{ mode.name }}\n - {{ fixtureService.getModeChannelCount(selectedFixtureProfile, mode) }}\n {{ 'designer.fixture-pool.channels' | translate }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\">{{ 'designer.fixture-pool.first-channel' | translate }}</label>\n <div class=\"col-lg-9\">\n <select\n class=\"custom-select\"\n [ngModel]=\"selectedFixture.dmxFirstChannel\"\n (ngModelChange)=\"selectedFixture.dmxFirstChannel = $event\"\n >\n <option *ngFor=\"let channel of dmxChannels; let i = index\" [ngValue]=\"i\">\n {{ i + 1 }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\"></label>\n <div class=\"col-lg-9\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"addCopy(selectedFixture)\">\n {{ 'designer.fixture.add-copy' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"modal-footer\">\n <a class=\"mr-3 my-auto\" href=\"#\" role=\"button\" (click)=\"cancel(); (false)\">\n {{ 'designer.misc.cancel' | translate }}\n </a>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"ok()\">{{ 'designer.misc.ok' | translate }}</button>\n</div>\n", styles: [".list-group-item{padding:.3rem 1.25rem}.dmx-channel{display:flex;float:left;width:28px;border:1px solid white;margin-left:-1px;margin-bottom:-1px;padding-bottom:2px}.dmx-channel-occupied{background-color:#63462e;border-left:none;border-right:none;cursor:move}.dmx-channel-occupied-start{border-left:1px solid white;border-top-left-radius:8px;border-bottom-left-radius:8px}.dmx-channel-occupied-end{border-right:1px solid white;border-top-right-radius:8px;border-bottom-right-radius:8px}.dmx-channel-selected{background-color:#fd7e14}.dmx-channel-overlapped{background-color:red;border:1px solid red;cursor:move}.card{overflow:auto}\n"] }]
633
- }], () => [{ type: i1.BsModalRef }, { type: i2.FixtureService }, { type: i3.UuidService }, { type: i4.ProjectService }, { type: i5.PreviewService }, { type: i6.TranslateService }, { type: i7.ToastrService }, { type: i8.PresetService }, { type: i9.ConfigService }, { type: i1.BsModalService }], { mouseUp: [{
634
- type: HostListener,
635
- args: ['window:mouseup', ['$event']]
636
- }], handleKeyboardEvent: [{
637
- type: HostListener,
638
- args: ['document:keydown.enter', ['$event']]
639
- }] }); })();
640
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FixturePoolComponent, { className: "FixturePoolComponent" }); })();
641
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1wb29sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbmVyL3NyYy9saWIvZml4dHVyZS1wb29sL2ZpeHR1cmUtcG9vbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL2ZpeHR1cmUtcG9vbC9maXh0dXJlLXBvb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0seUVBQXlFLENBQUM7QUFDN0gs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Q0FBQyxRQUFRLENBQUM7O2tGQXRadkMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiwgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRml4dHVyZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlJztcbmltcG9ydCB7IEZpeHR1cmVQcm9maWxlIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUtcHJvZmlsZSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgRml4dHVyZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9maXh0dXJlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJlc2V0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3ByZXNldC5zZXJ2aWNlJztcbmltcG9ydCB7IFByZXZpZXdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcHJldmlldy5zZXJ2aWNlJztcbmltcG9ydCB7IFByb2plY3RTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvamVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IFV1aWRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdXVpZC5zZXJ2aWNlJztcbmltcG9ydCB7IEZpeHR1cmVQb29sQ3JlYXRlRnJvbUZpbGVDb21wb25lbnQgfSBmcm9tICcuL2ZpeHR1cmUtcG9vbC1jcmVhdGUtZnJvbS1maWxlL2ZpeHR1cmUtcG9vbC1jcmVhdGUtZnJvbS1maWxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcmVzZXRGaXh0dXJlIH0gZnJvbSAnLi4vbW9kZWxzL3ByZXNldC1maXh0dXJlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWFwcC1maXh0dXJlLXBvb2wnLFxuICB0ZW1wbGF0ZVVybDogJy4vZml4dHVyZS1wb29sLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZml4dHVyZS1wb29sLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRml4dHVyZVBvb2xDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHByb2ZpbGVzOiBGaXh0dXJlUHJvZmlsZVtdO1xuICBwdWJsaWMgZmlsdGVyZWRQcm9maWxlczogRml4dHVyZVByb2ZpbGVbXTtcbiAgcHVibGljIGxvYWRpbmdQcm9maWxlcyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBmaXh0dXJlUG9vbDogRml4dHVyZVtdO1xuXG4gIHB1YmxpYyBkbXhDaGFubmVsczogbnVtYmVyW10gPSBbXTtcbiAgcHVibGljIHNlbGVjdGVkRml4dHVyZTogRml4dHVyZTtcbiAgcHVibGljIHNlbGVjdGVkRml4dHVyZVByb2ZpbGU6IEZpeHR1cmVQcm9maWxlO1xuICBwdWJsaWMgc2hvd0NoYW5uZWxOdW1iZXJzID0gZmFsc2U7XG4gIHB1YmxpYyBjaGFubmVsRHJhZ0ZpeHR1cmU6IEZpeHR1cmU7XG4gIHB1YmxpYyBjaGFubmVsRHJhZ09mZnNldDogbnVtYmVyO1xuXG4gIHB1YmxpYyBvbkNsb3NlOiBTdWJqZWN0PG51bWJlcj4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHB1YmxpYyBzZWFyY2hFeHByZXNzaW9uOiBzdHJpbmc7XG5cbiAgcHVibGljIHVwZGF0aW5nUHJvZmlsZXM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGJzTW9kYWxSZWY6IEJzTW9kYWxSZWYsXG4gICAgcHVibGljIGZpeHR1cmVTZXJ2aWNlOiBGaXh0dXJlU2VydmljZSxcbiAgICBwcml2YXRlIHV1aWRTZXJ2aWNlOiBVdWlkU2VydmljZSxcbiAgICBwdWJsaWMgcHJvamVjdFNlcnZpY2U6IFByb2plY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJldmlld1NlcnZpY2U6IFByZXZpZXdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0clNlcnZpY2U6IFRvYXN0clNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcmVzZXRTZXJ2aWNlOiBQcmVzZXRTZXJ2aWNlLFxuICAgIHB1YmxpYyBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZVxuICApIHtcbiAgICB0aGlzLmZpeHR1cmVQb29sID0gWy4uLnRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlc107XG5cbiAgICBpZiAodGhpcy5maXh0dXJlUG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdEZpeHR1cmUodGhpcy5maXh0dXJlUG9vbFswXSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1MTI7IGkrKykge1xuICAgICAgdGhpcy5kbXhDaGFubmVscy5wdXNoKDApO1xuICAgIH1cblxuICAgIHRoaXMubG9hZFByb2ZpbGVzKCk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRQcm9maWxlcygpIHtcbiAgICB0aGlzLmxvYWRpbmdQcm9maWxlcyA9IHRydWU7XG5cbiAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFNlYXJjaFByb2ZpbGVzKCkuc3Vic2NyaWJlKChwcm9maWxlcykgPT4ge1xuICAgICAgdGhpcy5wcm9maWxlcyA9IHByb2ZpbGVzO1xuICAgICAgdGhpcy5maWx0ZXJQcm9maWxlcygpO1xuICAgICAgdGhpcy5sb2FkaW5nUHJvZmlsZXMgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbGVjdEZpeHR1cmUoZml4dHVyZTogRml4dHVyZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlUHJvZmlsZSA9IHVuZGVmaW5lZDtcbiAgICBpZiAoZml4dHVyZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVQcm9maWxlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkRml4dHVyZSA9IGZpeHR1cmU7XG4gIH1cblxuICBmaWx0ZXJQcm9maWxlcygpIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoRXhwcmVzc2lvbiB8fCAhdGhpcy5wcm9maWxlcykge1xuICAgICAgdGhpcy5maWx0ZXJlZFByb2ZpbGVzID0gdGhpcy5wcm9maWxlcztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcmVkUHJvZmlsZXMgPSBbXTtcblxuICAgIGNvbnN0IGtleXdvcmRzID0gdGhpcy5zZWFyY2hFeHByZXNzaW9uLnNwbGl0KCcgJyk7XG5cbiAgICBmb3IgKGNvbnN0IHByb2ZpbGUgb2YgdGhpcy5wcm9maWxlcykge1xuICAgICAgbGV0IGZvdW5kS2V5d29yZHMgPSAwO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleXdvcmQgb2Yga2V5d29yZHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb2ZpbGUudXVpZC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoa2V5d29yZC50b0xvd2VyQ2FzZSgpKSAhPT0gLTEgfHxcbiAgICAgICAgICBwcm9maWxlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGtleXdvcmQudG9Mb3dlckNhc2UoKSkgIT09IC0xIHx8XG4gICAgICAgICAgcHJvZmlsZS5tYW51ZmFjdHVyZXJOYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihrZXl3b3JkLnRvTG93ZXJDYXNlKCkpICE9PSAtMVxuICAgICAgICApIHtcbiAgICAgICAgICBmb3VuZEtleXdvcmRzKys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZvdW5kS2V5d29yZHMgPT09IGtleXdvcmRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmZpbHRlcmVkUHJvZmlsZXMucHVzaChwcm9maWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRGaXh0dXJlKHNlYXJjaFByb2ZpbGU6IEZpeHR1cmVQcm9maWxlKSB7XG4gICAgLy8gTG9hZCB0aGUgcHJvZmlsZSBkZXRhaWxzLCBpZiBub3QgYWxyZWFkeSBkb25lLiBUaGVyZSBpcyBvbmx5IGFcbiAgICAvLyBtaW5pbWFsIHByb2ZpbGUgcGFzc2VkIGZyb20gdGhlIHNlYXJjaC5cbiAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlLmxvYWRQcm9maWxlQnlVdWlkKHNlYXJjaFByb2ZpbGUudXVpZCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoc2VhcmNoUHJvZmlsZS51dWlkKTtcbiAgICAgIGNvbnN0IG5ld0ZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmFkZEZpeHR1cmUocHJvZmlsZSwgdGhpcy5maXh0dXJlUG9vbCk7XG4gICAgICBpZiAobmV3Rml4dHVyZSkge1xuICAgICAgICB0aGlzLnNlbGVjdEZpeHR1cmUobmV3Rml4dHVyZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhZGRDb3B5KG9yaWdpbmFsRml4dHVyZTogRml4dHVyZSkge1xuICAgIGNvbnN0IGZpeHR1cmUgPSBuZXcgRml4dHVyZSgpO1xuXG4gICAgZml4dHVyZS51dWlkID0gdGhpcy51dWlkU2VydmljZS5nZXRVdWlkKCk7XG4gICAgZml4dHVyZS5wcm9maWxlVXVpZCA9IG9yaWdpbmFsRml4dHVyZS5wcm9maWxlVXVpZDtcbiAgICBmaXh0dXJlLm5hbWUgPSBvcmlnaW5hbEZpeHR1cmUubmFtZTtcbiAgICBmaXh0dXJlLm1vZGVTaG9ydE5hbWUgPSBvcmlnaW5hbEZpeHR1cmUubW9kZVNob3J0TmFtZTtcbiAgICBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCA9IG9yaWdpbmFsRml4dHVyZS5kbXhGaXJzdENoYW5uZWw7XG4gICAgZml4dHVyZS5kbXhVbml2ZXJzZVV1aWQgPSBvcmlnaW5hbEZpeHR1cmUuZG14VW5pdmVyc2VVdWlkO1xuXG4gICAgdGhpcy5maXh0dXJlUG9vbC5wdXNoKGZpeHR1cmUpO1xuICAgIHRoaXMuc2VsZWN0Rml4dHVyZShmaXh0dXJlKTtcbiAgfVxuXG4gIHJlbW92ZUZpeHR1cmUoZml4dHVyZTogRml4dHVyZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maXh0dXJlUG9vbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZml4dHVyZVBvb2xbaV0udXVpZCA9PT0gZml4dHVyZS51dWlkKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRml4dHVyZSA9PT0gdGhpcy5maXh0dXJlUG9vbFtpXSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0Rml4dHVyZSh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZml4dHVyZVBvb2wuc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaXh0dXJlICYmIHRoaXMuZml4dHVyZVBvb2wgJiYgdGhpcy5maXh0dXJlUG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdEZpeHR1cmUoKHRoaXMuc2VsZWN0ZWRGaXh0dXJlID0gdGhpcy5maXh0dXJlUG9vbFswXSkpO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSB1bnVzZWQgcHJvZmlsZXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlUHJvZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBwcm9maWxlVXNlZCA9IGZhbHNlO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmVJblBvb2wgb2YgdGhpcy5maXh0dXJlUG9vbCkge1xuICAgICAgICBpZiAoZml4dHVyZUluUG9vbC5wcm9maWxlVXVpZCA9PT0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVQcm9maWxlc1tpXS51dWlkKSB7XG4gICAgICAgICAgcHJvZmlsZVVzZWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghcHJvZmlsZVVzZWQpIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVQcm9maWxlcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2hhbm5lbE9jY3VwaWVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgdGhpcy5maXh0dXJlUG9vbCkge1xuICAgICAgY29uc3QgcHJvZmlsZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0UHJvZmlsZUJ5VXVpZChmaXh0dXJlLnByb2ZpbGVVdWlkKTtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVCeUZpeHR1cmUocHJvZmlsZSwgZml4dHVyZSk7XG4gICAgICBjb25zdCBjaGFubmVsQ291bnQgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVDaGFubmVsQ291bnQocHJvZmlsZSwgbW9kZSk7XG5cbiAgICAgIGlmIChpbmRleCA+PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCAmJiBpbmRleCA8IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICsgY2hhbm5lbENvdW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNoYW5uZWxPY2N1cGllZFN0YXJ0KGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgdGhpcy5maXh0dXJlUG9vbCkge1xuICAgICAgaWYgKGluZGV4ID09PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjaGFubmVsT2NjdXBpZWRFbmQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiB0aGlzLmZpeHR1cmVQb29sKSB7XG4gICAgICBjb25zdCBwcm9maWxlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZShwcm9maWxlLCBmaXh0dXJlKTtcbiAgICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUNoYW5uZWxDb3VudChwcm9maWxlLCBtb2RlKTtcblxuICAgICAgaWYgKGluZGV4ID09PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCArIGNoYW5uZWxDb3VudCAtIDEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2hhbm5lbE92ZXJsYXBwZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGxldCBvY2N1cGllZEZpeHR1cmU6IEZpeHR1cmU7XG5cbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgdGhpcy5maXh0dXJlUG9vbCkge1xuICAgICAgY29uc3QgcHJvZmlsZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0UHJvZmlsZUJ5VXVpZChmaXh0dXJlLnByb2ZpbGVVdWlkKTtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVCeUZpeHR1cmUocHJvZmlsZSwgZml4dHVyZSk7XG4gICAgICBjb25zdCBjaGFubmVsQ291bnQgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVDaGFubmVsQ291bnQocHJvZmlsZSwgbW9kZSk7XG5cbiAgICAgIGlmIChpbmRleCA+PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCAmJiBpbmRleCA8IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICsgY2hhbm5lbENvdW50KSB7XG4gICAgICAgIGlmIChvY2N1cGllZEZpeHR1cmUpIHtcbiAgICAgICAgICBpZiAob2NjdXBpZWRGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCAhPT0gZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgfHwgb2NjdXBpZWRGaXh0dXJlLm1vZGVTaG9ydE5hbWUgIT09IGZpeHR1cmUubW9kZVNob3J0TmFtZSkge1xuICAgICAgICAgICAgLy8gZml4dHVyZXMgYXJlIGFsbG93ZWQgdG8gb3ZlcmxhcCwgaWYgdGhleSBzdGFydCBhdCB0aGUgc2FtZSBjaGFubmVsIGFuZFxuICAgICAgICAgICAgLy8gdXNlIHRoZSBzYW1lIG1vZGUuIG90aGVyd2lzZSBpdCdzIG5vdCBhbGxvd2VkLlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9jY3VwaWVkRml4dHVyZSA9IGZpeHR1cmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjaGFubmVsTW91c2VEb3duKGV2ZW50OiBhbnkpIHtcbiAgICAvLyBzdGFydCBkcmFnZ2luZ1xuICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSBldmVudC50YXJnZXQuZGF0YXNldC5pbmRleDtcbiAgICBsZXQgbmV3U2VsZWN0ZWRGaXh0dXJlOiBGaXh0dXJlO1xuXG4gICAgLy8gZmluZCBhIGRyYWdnaW5nIGZpeHR1cmUgYW5kIHNlbGVjdCBpdCwgYnV0IGRvbid0IGNoYW5nZSB0aGUgc2VsZWN0aW9uLCBpZiB0aGVcbiAgICAvLyBjdXJyZW50bHkgc2VsZWN0ZWQgZml4dHVyZSBtaWdodCBhbHNvIGJlIHNlbGVjdGVkIChvbiBvdmVybGFwcGVkIGZpeHR1cmVzKVxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiB0aGlzLmZpeHR1cmVQb29sKSB7XG4gICAgICBjb25zdCBwcm9maWxlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZShwcm9maWxlLCBmaXh0dXJlKTtcbiAgICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUNoYW5uZWxDb3VudChwcm9maWxlLCBtb2RlKTtcblxuICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPj0gZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgJiYgc2VsZWN0ZWRJbmRleCA8PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCArIGNoYW5uZWxDb3VudCAtIDEpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaXh0dXJlID09PSBmaXh0dXJlKSB7XG4gICAgICAgICAgbmV3U2VsZWN0ZWRGaXh0dXJlID0gZml4dHVyZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmV3U2VsZWN0ZWRGaXh0dXJlKSB7XG4gICAgICAgICAgbmV3U2VsZWN0ZWRGaXh0dXJlID0gZml4dHVyZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZXdTZWxlY3RlZEZpeHR1cmUpIHtcbiAgICAgIGlmIChuZXdTZWxlY3RlZEZpeHR1cmUgIT09IHRoaXMuc2VsZWN0ZWRGaXh0dXJlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Rml4dHVyZShuZXdTZWxlY3RlZEZpeHR1cmUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNoYW5uZWxEcmFnRml4dHVyZSA9IG5ld1NlbGVjdGVkRml4dHVyZTtcbiAgICAgIHRoaXMuY2hhbm5lbERyYWdPZmZzZXQgPSBzZWxlY3RlZEluZGV4IC0gbmV3U2VsZWN0ZWRGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbDtcbiAgICB9XG4gIH1cblxuICBjaGFubmVsU2VsZWN0ZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZEZpeHR1cmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPj0gdGhpcy5zZWxlY3RlZEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsKSB7XG4gICAgICBjb25zdCBwcm9maWxlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKHRoaXMuc2VsZWN0ZWRGaXh0dXJlLnByb2ZpbGVVdWlkKTtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVCeUZpeHR1cmUocHJvZmlsZSwgdGhpcy5zZWxlY3RlZEZpeHR1cmUpO1xuICAgICAgY29uc3QgY2hhbm5lbENvdW50ID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRNb2RlQ2hhbm5lbENvdW50KHByb2ZpbGUsIG1vZGUpO1xuXG4gICAgICBpZiAoaW5kZXggPCB0aGlzLnNlbGVjdGVkRml4dHVyZS5kbXhGaXJzdENoYW5uZWwgKyBjaGFubmVsQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gcmVnaXN0ZXIgbW91c2UgdXAgZ2xvYmFsbHkgKGUuZy4gYWxzbyBvdXRzaWRlIHRoZSBETVggbWFwcGluZylcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93Om1vdXNldXAnLCBbJyRldmVudCddKVxuICBtb3VzZVVwKGV2ZW50OiBhbnkpIHtcbiAgICAvLyBmaW5pc2ggZHJhZ2dpbmdcbiAgICB0aGlzLmNoYW5uZWxEcmFnRml4dHVyZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNoYW5uZWxEcmFnT2Zmc2V0ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgY2hhbm5lbE1vdXNlT3ZlcihldmVudDogYW55KSB7XG4gICAgaWYgKCF0aGlzLmNoYW5uZWxEcmFnRml4dHVyZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHBlcmZvcm0gZHJhZ2dpbmdcbiAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuaW5kZXg7XG4gICAgY29uc3QgcHJvZmlsZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0UHJvZmlsZUJ5VXVpZCh0aGlzLmNoYW5uZWxEcmFnRml4dHVyZS5wcm9maWxlVXVpZCk7XG4gICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZShwcm9maWxlLCB0aGlzLnNlbGVjdGVkRml4dHVyZSk7XG4gICAgY29uc3QgY2hhbm5lbENvdW50ID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRNb2RlQ2hhbm5lbENvdW50KHByb2ZpbGUsIG1vZGUpO1xuXG4gICAgaWYgKHNlbGVjdGVkSW5kZXggLSB0aGlzLmNoYW5uZWxEcmFnT2Zmc2V0ID49IDAgJiYgc2VsZWN0ZWRJbmRleCAtIHRoaXMuY2hhbm5lbERyYWdPZmZzZXQgKyBjaGFubmVsQ291bnQgLSAxIDw9IDUxMSkge1xuICAgICAgdGhpcy5jaGFubmVsRHJhZ0ZpeHR1cmUuZG14Rmlyc3RDaGFubmVsID0gc2VsZWN0ZWRJbmRleCAtIHRoaXMuY2hhbm5lbERyYWdPZmZzZXQ7XG4gICAgfVxuICB9XG5cbiAgb2soKSB7XG4gICAgLy8gZG9uJ3QgYWxsb3cgT0sgaWYgb3ZlcmxhcHBpbmcgZml4dHVyZXMgZXhpc3RcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZG14Q2hhbm5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoYW5uZWxPdmVybGFwcGVkKGkpKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9ICdkZXNpZ25lci5maXh0dXJlLXBvb2wuY2hhbm5lbC1vY2N1cGllZCc7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5jaGFubmVsLW9jY3VwaWVkLXRpdGxlJztcblxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFttc2csIHRpdGxlXSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2UuZXJyb3IocmVzdWx0W21zZ10sIHJlc3VsdFt0aXRsZV0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVzID0gdGhpcy5maXh0dXJlUG9vbDtcblxuICAgIC8vIHJlbW92ZSBkZWxldGVkIGZpeHR1cmVzIGZyb20gcHJlc2V0IGZpeHR1cmVzXG4gICAgZm9yIChsZXQgaSA9IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRGaXh0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICBjb25zdCBwcmVzZXRGaXh0dXJlID0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldEZpeHR1cmVzW2ldO1xuICAgICAgZm9yIChsZXQgZml4dHVyZSBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMpIHtcbiAgICAgICAgaWYgKHByZXNldEZpeHR1cmUuZml4dHVyZVV1aWQgPT09IGZpeHR1cmUudXVpZCkge1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJlc2V0Rml4dHVyZXMuc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFkZCB0aGUgbmV3IGZpeHR1cmVzIHRvIHRoZSBwcmVzZXQgZml4dHVyZXNcbiAgICBmb3IgKGxldCBmaXh0dXJlIG9mIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlcykge1xuICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBwcmVzZXRGaXh0dXJlIG9mIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRGaXh0dXJlcykge1xuICAgICAgICBpZiAocHJlc2V0Rml4dHVyZS5maXh0dXJlVXVpZCA9PT0gZml4dHVyZS51dWlkKSB7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIGlmICh0aGlzLmZpeHR1cmVTZXJ2aWNlLmZpeHR1cmVIYXNHZW5lcmFsQ2hhbm5lbChmaXh0dXJlKSkge1xuICAgICAgICAgIGNvbnN0IHByZXNldEZpeHR1cmUgPSBuZXcgUHJlc2V0Rml4dHVyZSgpO1xuICAgICAgICAgIHByZXNldEZpeHR1cmUuZml4dHVyZVV1aWQgPSBmaXh0dXJlLnV1aWQ7XG4gICAgICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldEZpeHR1cmVzLnB1c2gocHJlc2V0Rml4dHVyZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwaXhlbEtleXMgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmZpeHR1cmVHZXRVbmlxdWVQaXhlbEtleXMoZml4dHVyZSk7XG5cbiAgICAgICAgZm9yIChsZXQgcGl4ZWxLZXkgb2YgcGl4ZWxLZXlzKSB7XG4gICAgICAgICAgY29uc3QgcHJlc2V0Rml4dHVyZSA9IG5ldyBQcmVzZXRGaXh0dXJlKCk7XG4gICAgICAgICAgcHJlc2V0Rml4dHVyZS5maXh0dXJlVXVpZCA9IGZpeHR1cmUudXVpZDtcbiAgICAgICAgICBwcmVzZXRGaXh0dXJlLnBpeGVsS2V5ID0gcGl4ZWxLZXk7XG4gICAgICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldEZpeHR1cmVzLnB1c2gocHJlc2V0Rml4dHVyZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlLnVwZGF0ZUNhY2hlZEZpeHR1cmVzKCk7XG4gICAgdGhpcy5wcmVzZXRTZXJ2aWNlLnJlbW92ZURlbGV0ZWRGaXh0dXJlcygpO1xuICAgIHRoaXMucHJldmlld1NlcnZpY2UudXBkYXRlRml4dHVyZVNldHVwKCk7XG4gICAgdGhpcy5wcmVzZXRTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVTZWxlY3Rpb24oKTtcbiAgICB0aGlzLnByZXNldFNlcnZpY2UuZml4dHVyZVNlbGVjdGlvbkNoYW5nZWQubmV4dCgpO1xuICAgIHRoaXMucHJlc2V0U2VydmljZS5wcmV2aWV3TGl2ZSgpO1xuXG4gICAgdGhpcy5vbkNsb3NlLm5leHQoMSk7XG4gICAgdGhpcy5ic01vZGFsUmVmLmhpZGUoKTtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLm9uQ2xvc2UubmV4dCgyKTtcbiAgICB0aGlzLmJzTW9kYWxSZWYuaGlkZSgpO1xuICB9XG5cbiAgdXBkYXRlUHJvZmlsZXMoKSB7XG4gICAgdGhpcy51cGRhdGluZ1Byb2ZpbGVzID0gdHJ1ZTtcblxuICAgIC8vIFRPRE9cbiAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlXG4gICAgICAudXBkYXRlUHJvZmlsZXMoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0aW5nUHJvZmlsZXMgPSBmYWxzZTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG1zZyA9ICdkZXNpZ25lci5maXh0dXJlLXBvb2wucHJvZmlsZXMtdXBkYXRlLWVycm9yJztcbiAgICAgICAgICBjb25zdCB0aXRsZSA9ICdkZXNpZ25lci5maXh0dXJlLXBvb2wucHJvZmlsZXMtdXBkYXRlLWVycm9yLXRpdGxlJztcblxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoW21zZywgdGl0bGVdKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLmVycm9yKHJlc3VsdFttc2ddLCByZXN1bHRbdGl0bGVdKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkUHJvZmlsZXMoKTtcblxuICAgICAgICBjb25zdCBtc2cgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLnByb2ZpbGVzLXVwZGF0ZWQnO1xuICAgICAgICBjb25zdCB0aXRsZSA9ICdkZXNpZ25lci5maXh0dXJlLXBvb2wucHJvZmlsZXMtdXBkYXRlZC10aXRsZSc7XG5cbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChbbXNnLCB0aXRsZV0pLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnN1Y2Nlc3MocmVzdWx0W21zZ10sIHJlc3VsdFt0aXRsZV0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlRml4dHVyZUZyb21Qcm9maWxlRmlsZSgpIHtcbiAgICBjb25zdCBic01vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhGaXh0dXJlUG9vbENyZWF0ZUZyb21GaWxlQ29tcG9uZW50LCB7IGtleWJvYXJkOiB0cnVlLCBpZ25vcmVCYWNrZHJvcENsaWNrOiBmYWxzZSB9KTtcbiAgICAoYnNNb2RhbFJlZi5jb250ZW50IGFzIEZpeHR1cmVQb29sQ3JlYXRlRnJvbUZpbGVDb21wb25lbnQpLm9uQ2xvc2Uuc3Vic2NyaWJlKChwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSkgPT4ge1xuICAgICAgY29uc3QgbmV3Rml4dHVyZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuYWRkRml4dHVyZShwcm9maWxlLCB0aGlzLmZpeHR1cmVQb29sKTtcbiAgICAgIHRoaXMuc2VsZWN0Rml4dHVyZShuZXdGaXh0dXJlKTtcbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZW50ZXInLCBbJyRldmVudCddKVxuICBoYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm9rKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGUgcHVsbC1sZWZ0XCI+e3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC50aXRsZScgfCB0cmFuc2xhdGUgfX08L2g0PlxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlIHB1bGwtcmlnaHRcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwiY2FuY2VsKCk7IChmYWxzZSlcIj5cbiAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxuICA8L2J1dHRvbj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgPCEtLSBTZWFyY2ggZm9yIHByb2ZpbGVzIC0tPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgaW5wdXQtYmxvY2sgbWItM1wiXG4gICAgICAgIGlkPVwic2VhcmNoU2V0XCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLnNlYXJjaC1wcm9maWxlcycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAoaW5wdXQpPVwic2VhcmNoRXhwcmVzc2lvbiA9ICRldmVudC50YXJnZXQudmFsdWU7IGZpbHRlclByb2ZpbGVzKClcIlxuICAgICAgLz5cblxuICAgICAgPCEtLSBQcm9maWxlcyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci1zZWNvbmRhcnkgdy0xMDBcIiBzdHlsZT1cImhlaWdodDogMjAwcHhcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTAgdy0xMDBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoIHctMTAwXCI+XG4gICAgICAgICAgICA8YSAqbmdJZj1cImxvYWRpbmdQcm9maWxlc1wiIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0IGQtZmxleFwiPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTAgbXgtYXV0b1wiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc3Bpbm5lciBmYS1wdWxzZSBmYS1md1wiPjwvaT5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9hPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCIgKm5nRm9yPVwibGV0IHByb2ZpbGUgb2YgZmlsdGVyZWRQcm9maWxlcyB8IHNvcnQgOiAndXVpZCdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTAgY29sLWF1dG8gbXktYXV0byBwbC0yXCI+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLXt7IGZpeHR1cmVTZXJ2aWNlLmdldEZpeHR1cmVJY29uQ2xhc3MocHJvZmlsZSkgfX0gbXItMVwiPjwvc3Bhbj4ge3sgcHJvZmlsZS5tYW51ZmFjdHVyZXJOYW1lIH19IC1cbiAgICAgICAgICAgICAgICAgICAge3sgcHJvZmlsZS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIG15LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBmbG9hdC1yaWdodFwiIGhyZWY9XCIjXCIgcm9sZT1cImJ1dHRvblwiIChjbGljayk9XCJhZGRGaXh0dXJlKHByb2ZpbGUpOyAoZmFsc2UpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxwIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgbWItMCBtdC0yXCI+XG4gICAgICAgICAgUG93ZXJlZCBieSB0aGUgPGEgaHJlZj1cImh0dHBzOi8vb3Blbi1maXh0dXJlLWxpYnJhcnkub3JnL1wiIHRhcmdldD1cIl9ibGFua1wiPk9wZW4gRml4dHVyZSBMaWJyYXJ5PC9hPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxhXG4gICAgICAgICAgY2xhc3M9XCJtdC0yIGJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbSBmbG9hdC1yaWdodFwiXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vb3Blbi1maXh0dXJlLWxpYnJhcnkub3JnL2ZpeHR1cmUtZWRpdG9yXCJcbiAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1maWxlLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+IHt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wuYWRkLXByb2ZpbGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwiY29uZmlnU2VydmljZS5sb2NhbFByb2ZpbGVzXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cIm1yLTIgbXQtMiBidG4gYnRuLXNlY29uZGFyeSBidG4tc20gZmxvYXQtcmlnaHRcIlxuICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVQcm9maWxlcygpOyAoZmFsc2UpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwidXBkYXRpbmdQcm9maWxlc1wiXG4gICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSAqbmdJZj1cInVwZGF0aW5nUHJvZmlsZXNcIiBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtcHVsc2UgZmEtZndcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgPGkgKm5nSWY9XCIhdXBkYXRpbmdQcm9maWxlc1wiIGNsYXNzPVwiZmEgZmEtZG93bmxvYWQgZmEtZndcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAge3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC51cGRhdGUtcHJvZmlsZXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDwhLS0gQWRkIGZpeHR1cmUgZnJvbSBsb2NhbCBwcm9maWxlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImNyZWF0ZUZpeHR1cmVGcm9tUHJvZmlsZUZpbGUoKVwiIHJvbGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4ge3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5jcmVhdGUtZml4dHVyZS1mcm9tLXByb2ZpbGUtZmlsZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBVbml2ZXJzZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wudW5pdmVyc2UnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctOFwiPlxuICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiY3VzdG9tLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24+VW5pdmVyc2UgMTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEZpeHR1cmVzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLXNlY29uZGFyeVwiIHN0eWxlPVwiaGVpZ2h0OiAyMzVweFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIiBbc29ydGFibGVqc109XCJmaXh0dXJlUG9vbFwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmaXh0dXJlIG9mIGZpeHR1cmVQb29sXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJmaXh0dXJlID09IHNlbGVjdGVkRml4dHVyZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RGaXh0dXJlKGZpeHR1cmUpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIGxpc3Qtc29ydC1oYW5kbGUgbXktYXV0b1wiIHN0eWxlPVwiY3Vyc29yOiBtb3ZlOyBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYmFyc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gZmxleC1ncm93IHBsLTAgbXktYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi17eyBmaXh0dXJlU2VydmljZS5nZXRGaXh0dXJlSWNvbkNsYXNzKGZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCkpIH19IG1yLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID57eyBmaXh0dXJlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gbXktYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtIGZsb2F0LXJpZ2h0XCIgaHJlZj1cIiNcIiByb2xlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInJlbW92ZUZpeHR1cmUoZml4dHVyZSk7IChmYWxzZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1taW51c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJyb3cgbXQtM1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgIDwhLS0gVGFiIG5hdmlnYXRpb24gLS0+XG4gICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgbWItNFwiIGlkPVwibXlUYWJcIiByb2xlPVwidGFibGlzdFwiPlxuICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwibmF2LWxpbmsgYWN0aXZlXCIgaWQ9XCJzZXRzLXRhYlwiIGRhdGEtdG9nZ2xlPVwidGFiXCIgaHJlZj1cIiNkbXhcIiByb2xlPVwidGFiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImljb24tb2xhXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiB7eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLmRteCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJuYXYtbGlua1wiIGlkPVwiY29tcG9zaXRpb25zLXRhYlwiIGRhdGEtdG9nZ2xlPVwidGFiXCIgaHJlZj1cIiNzZXR0aW5nc1wiIHJvbGU9XCJ0YWJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY29nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiB7eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLnNldHRpbmdzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG5cbiAgICAgIDwhLS0gVGFiIGNvbnRlbnQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnRcIiBpZD1cIm15VGFiQ29udGVudFwiPlxuICAgICAgICA8IS0tIERNWCB1bml2ZXJzZSBvdmVydmlldy0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUgc2hvdyBhY3RpdmVcIiBpZD1cImRteFwiIHJvbGU9XCJ0YWJwYW5lbFwiPlxuICAgICAgICAgIDwhLS0gU2hvdyBhbGwgY2hhbm5lbCBudW1iZXJzIC0tPlxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gZmxleC1ncm93XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTMgZC1mbGV4XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG15LWF1dG8gbWwtYXV0b1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBpZD1cInNob3dDaGFubmVsTnVtYmVyc1wiIFtuZ01vZGVsXT1cInNob3dDaGFubmVsTnVtYmVyc1wiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzaG93Q2hhbm5lbE51bWJlcnMgPSAkZXZlbnRcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwic2hvd0NoYW5uZWxOdW1iZXJzXCI+U2hvdyBjaGFubmVsczwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgPCEtLSBMaXN0IG9mIERNWCBjaGFubmVscyAtLT5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2hhbm5lbCBvZiBkbXhDaGFubmVsczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZG14LWNoYW5uZWxcIlxuICAgICAgICAgICAgICBbY2xhc3MuZG14LWNoYW5uZWwtb2NjdXBpZWRdPVwiY2hhbm5lbE9jY3VwaWVkKGkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRteC1jaGFubmVsLW9jY3VwaWVkLXN0YXJ0XT1cImNoYW5uZWxPY2N1cGllZFN0YXJ0KGkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRteC1jaGFubmVsLW9jY3VwaWVkLWVuZF09XCJjaGFubmVsT2NjdXBpZWRFbmQoaSlcIlxuICAgICAgICAgICAgICBbY2xhc3MuZG14LWNoYW5uZWwtc2VsZWN0ZWRdPVwiY2hhbm5lbFNlbGVjdGVkKGkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRteC1jaGFubmVsLW92ZXJsYXBwZWRdPVwiY2hhbm5lbE92ZXJsYXBwZWQoaSlcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cImNoYW5uZWxNb3VzZURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwiY2hhbm5lbE1vdXNlT3ZlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pbmRleF09XCJpXCJcbiAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7IGkgKyAxIH19XCJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJtb3VzZWVudGVyOm1vdXNlbGVhdmVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGRteC1jaGFubmVsLXRleHRcIiBbYXR0ci5kYXRhLWluZGV4XT1cImlcIiBbY2xhc3MuZG14LWNoYW5uZWwtdGV4dC12aXNpYmxlXT1cInNob3dDaGFubmVsTnVtYmVyc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWF1dG9cIiBzdHlsZT1cImZvbnQtc2l6ZTogMTFweFwiIFthdHRyLmRhdGEtaW5kZXhdPVwiaVwiPjxzbWFsbCBbYXR0ci5kYXRhLWluZGV4XT1cImlcIj4mbmJzcDs8L3NtYWxsPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEZpeHR1cmUgc2V0dGluZ3MgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItcGFuZVwiIGlkPVwic2V0dGluZ3NcIiByb2xlPVwidGFicGFuZWxcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRGaXh0dXJlICYmIHNlbGVjdGVkRml4dHVyZVByb2ZpbGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctMyBjb2wtZm9ybS1sYWJlbFwiIGZvcj1cImZpeHR1cmVOYW1lXCI+e3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5maXh0dXJlLW5hbWUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy05XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRml4dHVyZS5uYW1lXCIgbWF4bGVuZ3RoPVwiMjAwXCIgaWQ9XCJmaXh0dXJlTmFtZVwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctMyBjb2wtZm9ybS1sYWJlbFwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wubW9kZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTlcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRGaXh0dXJlLm1vZGVTaG9ydE5hbWVcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VsZWN0ZWRGaXh0dXJlLm1vZGVTaG9ydE5hbWUgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG1vZGUgb2Ygc2VsZWN0ZWRGaXh0dXJlUHJvZmlsZS5tb2Rlc1wiIFtuZ1ZhbHVlXT1cIm1vZGUuc2hvcnROYW1lIHx8IG1vZGUubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBtb2RlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgLSB7eyBmaXh0dXJlU2VydmljZS5nZXRNb2RlQ2hhbm5lbENvdW50KHNlbGVjdGVkRml4dHVyZVByb2ZpbGUsIG1vZGUpIH19XG4gICAgICAgICAgICAgICAgICAgIHt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wuY2hhbm5lbHMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1sZy0zIGNvbC1mb3JtLWxhYmVsXCI+e3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5maXJzdC1jaGFubmVsJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctOVwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNlbGVjdGVkRml4dHVyZS5kbXhGaXJzdENoYW5uZWwgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNoYW5uZWwgb2YgZG14Q2hhbm5lbHM7IGxldCBpID0gaW5kZXhcIiBbbmdWYWx1ZV09XCJpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGkgKyAxIH19XG4gICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1sZy0zIGNvbC1mb3JtLWxhYmVsXCI+PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy05XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiYWRkQ29weShzZWxlY3RlZEZpeHR1cmUpXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnZGVzaWduZXIuZml4dHVyZS5hZGQtY29weScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgPGEgY2xhc3M9XCJtci0zIG15LWF1dG9cIiBocmVmPVwiI1wiIHJvbGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2FuY2VsKCk7IChmYWxzZSlcIj5cbiAgICB7eyAnZGVzaWduZXIubWlzYy5jYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gIDwvYT5cbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwib2soKVwiPnt7ICdkZXNpZ25lci5taXNjLm9rJyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=