coer-elements 0.0.64 → 0.0.66

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. package/README.md +63 -0
  2. package/components/lib/coer-accordion/coer-accordion.component.d.ts +1 -1
  3. package/components/lib/coer-datebox/coer-datebox.component.d.ts +49 -0
  4. package/components/lib/coer-filebox/coer-filebox.component.d.ts +1 -1
  5. package/components/lib/coer-grid/coer-grid.extension.d.ts +2 -2
  6. package/components/lib/coer-modal/coer-modal.component.d.ts +1 -1
  7. package/components/lib/components.module.d.ts +37 -33
  8. package/components/public-api.d.ts +1 -0
  9. package/fesm2022/coer-elements-components.mjs +256 -93
  10. package/fesm2022/coer-elements-components.mjs.map +1 -1
  11. package/fesm2022/coer-elements-directives.mjs +14 -12
  12. package/fesm2022/coer-elements-directives.mjs.map +1 -1
  13. package/fesm2022/coer-elements-pipes.mjs +16 -16
  14. package/fesm2022/coer-elements-pipes.mjs.map +1 -1
  15. package/fesm2022/coer-elements-tools.mjs +20 -14
  16. package/fesm2022/coer-elements-tools.mjs.map +1 -1
  17. package/fesm2022/coer-elements.mjs +4 -4
  18. package/fesm2022/coer-elements.mjs.map +1 -1
  19. package/package.json +3 -17
  20. package/styles/angular-material.scss +18 -13
  21. package/styles/bootstrap.scss +1 -6
  22. package/styles/coer-elements.css +993 -2866
  23. package/styles/colors.scss +50 -60
  24. package/styles/index.scss +9 -9
  25. package/styles/layout.scss +10 -0
  26. package/styles/scroll-bar.scss +5 -5
  27. package/tools/lib/date-time.class.d.ts +3 -1
  28. package/tools/lib/page.class.d.ts +1 -1
  29. package/tools/lib/section.class.d.ts +1 -1
  30. package/tools/lib/tools.d.ts +9 -9
  31. package/esm2022/coer-elements.mjs +0 -5
  32. package/esm2022/components/coer-elements-components.mjs +0 -5
  33. package/esm2022/components/lib/coer-accordion/coer-accordion.component.mjs +0 -53
  34. package/esm2022/components/lib/coer-button/coer-button.component.mjs +0 -138
  35. package/esm2022/components/lib/coer-checkbox/coer-checkbox.component.mjs +0 -83
  36. package/esm2022/components/lib/coer-filebox/coer-filebox.component.mjs +0 -102
  37. package/esm2022/components/lib/coer-form/coer-form.component.mjs +0 -107
  38. package/esm2022/components/lib/coer-grid/coer-grid.component.mjs +0 -512
  39. package/esm2022/components/lib/coer-grid/coer-grid.extension.mjs +0 -409
  40. package/esm2022/components/lib/coer-list/coer-list.component.mjs +0 -130
  41. package/esm2022/components/lib/coer-modal/coer-modal.component.mjs +0 -107
  42. package/esm2022/components/lib/coer-numberbox/coer-numberbox.component.mjs +0 -258
  43. package/esm2022/components/lib/coer-page-title/coer-page-title.component.mjs +0 -44
  44. package/esm2022/components/lib/coer-selectbox/coer-selectbox.component.mjs +0 -342
  45. package/esm2022/components/lib/coer-sidenav/coer-menu-option/coer-menu-option.component.mjs +0 -103
  46. package/esm2022/components/lib/coer-sidenav/coer-sidenav.component.mjs +0 -194
  47. package/esm2022/components/lib/coer-sidenav/coer-toolbar/coer-toolbar.component.mjs +0 -33
  48. package/esm2022/components/lib/coer-sidenav/coer-tree-accordion/coer-tree-accordion.component.mjs +0 -116
  49. package/esm2022/components/lib/coer-switch/coer-switch.component.mjs +0 -93
  50. package/esm2022/components/lib/coer-tab/coer-tab.component.mjs +0 -120
  51. package/esm2022/components/lib/coer-textarea/coer-textarea.component.mjs +0 -156
  52. package/esm2022/components/lib/coer-textbox/coer-textbox.component.mjs +0 -221
  53. package/esm2022/components/lib/components.module.mjs +0 -188
  54. package/esm2022/components/public-api.mjs +0 -20
  55. package/esm2022/directives/coer-elements-directives.mjs +0 -5
  56. package/esm2022/directives/lib/coer-ref.directive.mjs +0 -23
  57. package/esm2022/directives/lib/directives.module.mjs +0 -25
  58. package/esm2022/directives/lib/life-cycle.directive.mjs +0 -33
  59. package/esm2022/directives/public-api.mjs +0 -4
  60. package/esm2022/index.mjs +0 -54
  61. package/esm2022/interfaces/coer-elements-interfaces.mjs +0 -5
  62. package/esm2022/interfaces/lib/app-source.interface.mjs +0 -2
  63. package/esm2022/interfaces/lib/box-button.interface.mjs +0 -2
  64. package/esm2022/interfaces/lib/bulk-load.interface.mjs +0 -2
  65. package/esm2022/interfaces/lib/coer-filebox/file-image.interface.mjs +0 -2
  66. package/esm2022/interfaces/lib/coer-filebox/file.interface.mjs +0 -2
  67. package/esm2022/interfaces/lib/coer-grid/grid-button-by-row.interface.mjs +0 -2
  68. package/esm2022/interfaces/lib/coer-grid/grid-checkbox.interface.mjs +0 -2
  69. package/esm2022/interfaces/lib/coer-grid/grid-coer-numberbox.interface.mjs +0 -2
  70. package/esm2022/interfaces/lib/coer-grid/grid-coer-selectbox.interface.mjs +0 -2
  71. package/esm2022/interfaces/lib/coer-grid/grid-coer-switch.interface.mjs +0 -2
  72. package/esm2022/interfaces/lib/coer-grid/grid-coer-textbox.interface.mjs +0 -2
  73. package/esm2022/interfaces/lib/coer-grid/grid-column.interface.mjs +0 -2
  74. package/esm2022/interfaces/lib/coer-grid/grid-data-source.interface.mjs +0 -2
  75. package/esm2022/interfaces/lib/coer-grid/grid-header-button.interface.mjs +0 -2
  76. package/esm2022/interfaces/lib/coer-grid/grid-header-export-button.interface.mjs +0 -2
  77. package/esm2022/interfaces/lib/coer-grid/grid-header.interface.mjs +0 -2
  78. package/esm2022/interfaces/lib/coer-grid/grid-import.interface.mjs +0 -2
  79. package/esm2022/interfaces/lib/coer-grid/grid-input-checkbox.interface.mjs +0 -2
  80. package/esm2022/interfaces/lib/coer-grid/grid-input-switch-change.interface.mjs +0 -2
  81. package/esm2022/interfaces/lib/coer-grid/grid-input-textbox.interface.mjs +0 -2
  82. package/esm2022/interfaces/lib/coer-grid/grid-item.interface.mjs +0 -2
  83. package/esm2022/interfaces/lib/coer-grid/grid-keyup-enter.interface.mjs +0 -2
  84. package/esm2022/interfaces/lib/coer-grid/grid-length.interface.mjs +0 -2
  85. package/esm2022/interfaces/lib/coer-grid/grid-search.interface.mjs +0 -2
  86. package/esm2022/interfaces/lib/coer-grid/grid-sort.interface.mjs +0 -2
  87. package/esm2022/interfaces/lib/coer-menu/menu-option-selected.interface.mjs +0 -2
  88. package/esm2022/interfaces/lib/coer-menu/menu-selected.interface.mjs +0 -2
  89. package/esm2022/interfaces/lib/coer-menu/menu.interface.mjs +0 -2
  90. package/esm2022/interfaces/lib/coer-ref.interface.mjs +0 -2
  91. package/esm2022/interfaces/lib/image.interface.mjs +0 -2
  92. package/esm2022/interfaces/lib/page-title/breadcrumb.interface.mjs +0 -2
  93. package/esm2022/interfaces/lib/page-title/go-back.interface.mjs +0 -2
  94. package/esm2022/interfaces/lib/screen-size.interface.mjs +0 -2
  95. package/esm2022/interfaces/lib/service/http-request.interface.mjs +0 -2
  96. package/esm2022/interfaces/lib/service/http-response.interface.mjs +0 -2
  97. package/esm2022/interfaces/lib/service/patch.interface.mjs +0 -2
  98. package/esm2022/interfaces/public-api.mjs +0 -42
  99. package/esm2022/pipes/coer-elements-pipes.mjs +0 -5
  100. package/esm2022/pipes/lib/html.pipe.mjs +0 -18
  101. package/esm2022/pipes/lib/no-image.pipe.mjs +0 -23
  102. package/esm2022/pipes/lib/numeric-format.pipe.mjs +0 -15
  103. package/esm2022/pipes/lib/pipes.module.mjs +0 -31
  104. package/esm2022/pipes/public-api.mjs +0 -5
  105. package/esm2022/signals/coer-elements-signals.mjs +0 -5
  106. package/esm2022/signals/lib/breakpoint.signal.mjs +0 -4
  107. package/esm2022/signals/lib/is-loading.signal.mjs +0 -3
  108. package/esm2022/signals/lib/is-menu-open.signal.mjs +0 -3
  109. package/esm2022/signals/lib/is-modal-open.signal.mjs +0 -3
  110. package/esm2022/signals/lib/navigation.signal.mjs +0 -3
  111. package/esm2022/signals/public-api.mjs +0 -6
  112. package/esm2022/tools/coer-elements-tools.mjs +0 -5
  113. package/esm2022/tools/lib/breadcrumbs.class.mjs +0 -63
  114. package/esm2022/tools/lib/coer-alert/coer-alert.component.mjs +0 -229
  115. package/esm2022/tools/lib/coer-grid.templates.mjs +0 -34
  116. package/esm2022/tools/lib/colors.class.mjs +0 -68
  117. package/esm2022/tools/lib/control-value.class.mjs +0 -46
  118. package/esm2022/tools/lib/date-time.class.mjs +0 -29
  119. package/esm2022/tools/lib/files.class.mjs +0 -91
  120. package/esm2022/tools/lib/filters.class.mjs +0 -57
  121. package/esm2022/tools/lib/menu.class.mjs +0 -23
  122. package/esm2022/tools/lib/page.class.mjs +0 -187
  123. package/esm2022/tools/lib/screen.class.mjs +0 -51
  124. package/esm2022/tools/lib/section.class.mjs +0 -60
  125. package/esm2022/tools/lib/service.class.mjs +0 -408
  126. package/esm2022/tools/lib/source.class.mjs +0 -80
  127. package/esm2022/tools/lib/tools.mjs +0 -232
  128. package/esm2022/tools/public-api.mjs +0 -16
@@ -1,408 +0,0 @@
1
- import { inject } from "@angular/core";
2
- import { HttpClient, HttpRequest } from "@angular/common/http";
3
- import { CoerAlert } from "./coer-alert/coer-alert.component";
4
- import { Tools } from "./tools";
5
- export class Service {
6
- constructor() {
7
- //Injections
8
- this.alert = inject(CoerAlert);
9
- this.http = inject(HttpClient);
10
- this.httpCode = {
11
- Ok: 200,
12
- Created: 201,
13
- NoContent: 204,
14
- BadRequest: 400,
15
- Unauthorize: 401,
16
- NotFound: 404,
17
- NotAllowed: 405,
18
- NotAcceptable: 406,
19
- Conflict: 409,
20
- PayloadTooLarge: 413,
21
- InnerError: 500
22
- };
23
- }
24
- /** */
25
- ReleaseSubscription(subscription) {
26
- if (subscription && !subscription.closed)
27
- subscription.unsubscribe();
28
- }
29
- /** HTTP GET */
30
- HTTP_GET(request, cancelPrevious = true) {
31
- return new Promise(Resolve => {
32
- if (cancelPrevious) {
33
- this.ReleaseSubscription(this._GET$);
34
- this._GET$ = this.http.request(new HttpRequest("GET", request.url, { params: request.queryParams, headers: request.headers })).subscribe({
35
- next: (response) => {
36
- if (response.type > 0) {
37
- Resolve({
38
- body: Tools.BreakReference(response.body),
39
- status: response.status,
40
- message: response.statusText,
41
- ok: true
42
- });
43
- }
44
- },
45
- error: (httpError) => {
46
- this.ReleaseSubscription(this._GET$);
47
- this.AlertError(httpError, request.alertError);
48
- Resolve({
49
- body: {},
50
- status: httpError.status,
51
- message: httpError.error?.message || httpError.error,
52
- ok: false
53
- });
54
- },
55
- complete: () => {
56
- this.ReleaseSubscription(this._GET$);
57
- if (Tools.IsNotOnlyWhiteSpace(request.alertSuccess)) {
58
- this.alert.Success(request.alertSuccess);
59
- }
60
- }
61
- });
62
- }
63
- else {
64
- const subscription = this.http.request(new HttpRequest("GET", request.url, { params: request.queryParams, headers: request.headers })).subscribe({
65
- next: (response) => {
66
- if (response.type > 0) {
67
- Resolve({
68
- body: Tools.BreakReference(response.body),
69
- status: response.status,
70
- message: response.statusText,
71
- ok: true
72
- });
73
- }
74
- },
75
- error: (httpError) => {
76
- this.ReleaseSubscription(subscription);
77
- this.AlertError(httpError, request.alertError);
78
- Resolve({
79
- body: {},
80
- status: httpError.status,
81
- message: httpError.error?.message || httpError.error,
82
- ok: false
83
- });
84
- },
85
- complete: () => {
86
- this.ReleaseSubscription(subscription);
87
- if (Tools.IsNotOnlyWhiteSpace(request.alertSuccess)) {
88
- this.alert.Success(request.alertSuccess);
89
- }
90
- }
91
- });
92
- }
93
- });
94
- }
95
- /** HTTP POST */
96
- HTTP_POST(request, cancelPrevious = true) {
97
- return new Promise(Resolve => {
98
- if (cancelPrevious) {
99
- this.ReleaseSubscription(this._POST$);
100
- this._POST$ = this.http.request(new HttpRequest("POST", request.url, request.body, { params: request.queryParams, headers: request.headers })).subscribe({
101
- next: (response) => {
102
- if (response.type > 0) {
103
- Resolve({
104
- body: Tools.BreakReference(response.body),
105
- status: response.status,
106
- message: response.statusText,
107
- ok: true
108
- });
109
- }
110
- },
111
- error: (httpError) => {
112
- this.ReleaseSubscription(this._POST$);
113
- this.AlertError(httpError, request.alertError);
114
- Resolve({
115
- body: {},
116
- status: httpError.status,
117
- message: httpError.error?.message || httpError.error,
118
- ok: false
119
- });
120
- },
121
- complete: () => {
122
- this.ReleaseSubscription(this._POST$);
123
- if (Tools.IsNotOnlyWhiteSpace(request.alertSuccess)) {
124
- this.alert.Success(request.alertSuccess);
125
- }
126
- }
127
- });
128
- }
129
- else {
130
- const subscription = this.http.request(new HttpRequest("POST", request.url, request.body, { params: request.queryParams, headers: request.headers })).subscribe({
131
- next: (response) => {
132
- if (response.type > 0) {
133
- Resolve({
134
- body: Tools.BreakReference(response.body),
135
- status: response.status,
136
- message: response.statusText,
137
- ok: true
138
- });
139
- }
140
- },
141
- error: (httpError) => {
142
- this.ReleaseSubscription(subscription);
143
- this.AlertError(httpError, request.alertError);
144
- Resolve({
145
- body: {},
146
- status: httpError.status,
147
- message: httpError.error?.message || httpError.error,
148
- ok: false
149
- });
150
- },
151
- complete: () => {
152
- this.ReleaseSubscription(subscription);
153
- if (Tools.IsNotOnlyWhiteSpace(request.alertSuccess)) {
154
- this.alert.Success(request.alertSuccess);
155
- }
156
- }
157
- });
158
- }
159
- });
160
- }
161
- /** HTTP PUT */
162
- HTTP_PUT(request, cancelPrevious = true) {
163
- return new Promise(Resolve => {
164
- if (cancelPrevious) {
165
- this.ReleaseSubscription(this._PUT$);
166
- this._PUT$ = this.http.request(new HttpRequest("PUT", request.url, request.body, { params: request.queryParams, headers: request.headers })).subscribe({
167
- next: (response) => {
168
- if (response.type > 0) {
169
- Resolve({
170
- body: {},
171
- status: response.status,
172
- message: response.statusText,
173
- ok: true
174
- });
175
- }
176
- },
177
- error: (httpError) => {
178
- this.ReleaseSubscription(this._PUT$);
179
- this.AlertError(httpError, request.alertError);
180
- Resolve({
181
- body: {},
182
- status: httpError.status,
183
- message: httpError.error?.message || httpError.error,
184
- ok: false
185
- });
186
- },
187
- complete: () => {
188
- this.ReleaseSubscription(this._PUT$);
189
- if (Tools.IsNotOnlyWhiteSpace(request.alertSuccess)) {
190
- this.alert.Success(request.alertSuccess, 'Updated', 'fa-solid fa-arrows-rotate fa-spin');
191
- }
192
- }
193
- });
194
- }
195
- else {
196
- const subscription = this.http.request(new HttpRequest("PUT", request.url, request.body, { params: request.queryParams, headers: request.headers })).subscribe({
197
- next: (response) => {
198
- if (response.type > 0) {
199
- Resolve({
200
- body: {},
201
- status: response.status,
202
- message: response.statusText,
203
- ok: true
204
- });
205
- }
206
- },
207
- error: (httpError) => {
208
- this.ReleaseSubscription(subscription);
209
- this.AlertError(httpError, request.alertError);
210
- Resolve({
211
- body: {},
212
- status: httpError.status,
213
- message: httpError.error?.message || httpError.error,
214
- ok: false
215
- });
216
- },
217
- complete: () => {
218
- this.ReleaseSubscription(subscription);
219
- if (Tools.IsNotOnlyWhiteSpace(request.alertSuccess)) {
220
- this.alert.Success(request.alertSuccess, 'Updated', 'fa-solid fa-arrows-rotate fa-spin');
221
- }
222
- }
223
- });
224
- }
225
- });
226
- }
227
- /** HTTP PATCH */
228
- HTTP_PATCH(request, cancelPrevious = true) {
229
- return new Promise(Resolve => {
230
- if (cancelPrevious) {
231
- this.ReleaseSubscription(this._PATCH$);
232
- this._PATCH$ = this.http.request(new HttpRequest("PATCH", request.url, request.body, { params: request.queryParams, headers: request.headers })).subscribe({
233
- next: (response) => {
234
- if (response.type > 0) {
235
- Resolve({
236
- body: {},
237
- status: response.status,
238
- message: response.statusText,
239
- ok: true
240
- });
241
- }
242
- },
243
- error: (httpError) => {
244
- this.ReleaseSubscription(this._PATCH$);
245
- this.AlertError(httpError, request.alertError);
246
- Resolve({
247
- body: {},
248
- status: httpError.status,
249
- message: httpError.error?.message || httpError.error,
250
- ok: false
251
- });
252
- },
253
- complete: () => {
254
- this.ReleaseSubscription(this._PATCH$);
255
- if (Tools.IsNotOnlyWhiteSpace(request.alertSuccess)) {
256
- this.alert.Success(request.alertSuccess, 'Updated', 'fa-solid fa-arrows-rotate fa-spin');
257
- }
258
- }
259
- });
260
- }
261
- else {
262
- const subscription = this.http.request(new HttpRequest("PATCH", request.url, request.body, { params: request.queryParams, headers: request.headers })).subscribe({
263
- next: (response) => {
264
- if (response.type > 0) {
265
- Resolve({
266
- body: {},
267
- status: response.status,
268
- message: response.statusText,
269
- ok: true
270
- });
271
- }
272
- },
273
- error: (httpError) => {
274
- this.ReleaseSubscription(subscription);
275
- this.AlertError(httpError, request.alertError);
276
- Resolve({
277
- body: {},
278
- status: httpError.status,
279
- message: httpError.error?.message || httpError.error,
280
- ok: false
281
- });
282
- },
283
- complete: () => {
284
- this.ReleaseSubscription(subscription);
285
- if (Tools.IsNotOnlyWhiteSpace(request.alertSuccess)) {
286
- this.alert.Success(request.alertSuccess, 'Updated', 'fa-solid fa-arrows-rotate fa-spin');
287
- }
288
- }
289
- });
290
- }
291
- });
292
- }
293
- /** HTTP DELETE */
294
- HTTP_DELETE(request, cancelPrevious = true) {
295
- return new Promise(Resolve => {
296
- if (cancelPrevious) {
297
- this.ReleaseSubscription(this._DELETE$);
298
- this._DELETE$ = this.http.request(new HttpRequest("DELETE", request.url, { params: request.queryParams, headers: request.headers })).subscribe({
299
- next: (response) => {
300
- if (response.type > 0) {
301
- Resolve({
302
- body: {},
303
- status: response.status,
304
- message: response.statusText,
305
- ok: true
306
- });
307
- }
308
- },
309
- error: (httpError) => {
310
- this.ReleaseSubscription(this._DELETE$);
311
- this.AlertError(httpError, request.alertError);
312
- Resolve({
313
- body: {},
314
- status: httpError.status,
315
- message: httpError.error?.message || httpError.error,
316
- ok: false
317
- });
318
- },
319
- complete: () => {
320
- this.ReleaseSubscription(this._DELETE$);
321
- if (Tools.IsNotOnlyWhiteSpace(request.alertSuccess)) {
322
- this.alert.Success(request.alertSuccess, 'Deleted', 'fa-regular fa-trash-can');
323
- }
324
- }
325
- });
326
- }
327
- else {
328
- const subscription = this.http.request(new HttpRequest("DELETE", request.url, { params: request.queryParams, headers: request.headers })).subscribe({
329
- next: (response) => {
330
- if (response.type > 0) {
331
- Resolve({
332
- body: {},
333
- status: response.status,
334
- message: response.statusText,
335
- ok: true
336
- });
337
- }
338
- },
339
- error: (httpError) => {
340
- this.ReleaseSubscription(subscription);
341
- this.AlertError(httpError, request.alertError);
342
- Resolve({
343
- body: {},
344
- status: httpError.status,
345
- message: httpError.error?.message || httpError.error,
346
- ok: false
347
- });
348
- },
349
- complete: () => {
350
- this.ReleaseSubscription(subscription);
351
- if (Tools.IsNotOnlyWhiteSpace(request.alertSuccess)) {
352
- this.alert.Success(request.alertSuccess, 'Deleted', 'fa-regular fa-trash-can');
353
- }
354
- }
355
- });
356
- }
357
- });
358
- }
359
- /** */
360
- AlertError(httpError, message) {
361
- if (httpError.status >= 500) {
362
- if (Tools.IsNotOnlyWhiteSpace(message)) {
363
- this.alert.Error(message, `BUG ${httpError.status}`, 'fa-solid fa-bug', null);
364
- }
365
- }
366
- else if (httpError.status < 500) {
367
- switch (httpError.status) {
368
- case 400: {
369
- this.alert.Warning(httpError.error?.message || httpError.error, 'Bad Request', 'fa-regular fa-face-grin-beam-sweat fa-lg');
370
- break;
371
- }
372
- case 401: {
373
- this.alert.Warning(httpError.error?.message || httpError.error, 'Unauthorize', 'fa-regular fa-face-rolling-eyes fa-lg');
374
- break;
375
- }
376
- case 404: {
377
- this.alert.Warning(httpError.error?.message || httpError.error, 'Not Found', 'fa-regular fa-face-meh fa-lg');
378
- break;
379
- }
380
- case 405: {
381
- this.alert.Warning(httpError.error?.message || httpError.error, 'Not Allowed', 'fa-regular fa-face-grimace fa-lg');
382
- break;
383
- }
384
- case 406: {
385
- this.alert.Warning(httpError.error?.message || httpError.error, 'Not Acceptable', 'fa-regular fa-face-frown-open fa-lg');
386
- break;
387
- }
388
- case 409: {
389
- this.alert.Warning(httpError.error?.message || httpError.error, 'Conflict', 'fa-regular fa-face-dizzy fa-lg');
390
- break;
391
- }
392
- case 413: {
393
- this.alert.Warning(httpError.error?.message || httpError.error, 'Too Large', 'fa-regular fa-face-flushed fa-lg');
394
- break;
395
- }
396
- default: {
397
- if (httpError.status <= 0) {
398
- this.alert.Warning('Without Connection', 'WEB API DOWN', 'fa-solid fa-plug-circle-xmark fa-lg', null);
399
- }
400
- else
401
- this.alert.Warning(httpError.error?.message || httpError.error);
402
- break;
403
- }
404
- }
405
- }
406
- }
407
- }
408
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvZXItZWxlbWVudHMvdG9vbHMvbGliL3NlcnZpY2UuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsVUFBVSxFQUFnQyxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUdoQyxNQUFNLE9BQU8sT0FBTztJQUFwQjtRQUVJLFlBQVk7UUFDTyxVQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFCLFNBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFbkMsYUFBUSxHQUFHO1lBQ2pCLEVBQUUsRUFBRSxHQUFHO1lBQ1AsT0FBTyxFQUFFLEdBQUc7WUFDWixTQUFTLEVBQUUsR0FBRztZQUNkLFVBQVUsRUFBRSxHQUFHO1lBQ2YsV0FBVyxFQUFFLEdBQUc7WUFDaEIsUUFBUSxFQUFFLEdBQUc7WUFDYixVQUFVLEVBQUUsR0FBRztZQUNmLGFBQWEsRUFBRSxHQUFHO1lBQ2xCLFFBQVEsRUFBRSxHQUFHO1lBQ2IsZUFBZSxFQUFFLEdBQUc7WUFDcEIsVUFBVSxFQUFFLEdBQUc7U0FDbEIsQ0FBQTtJQTZjTCxDQUFDO0lBbGNHLE1BQU07SUFDRSxtQkFBbUIsQ0FBQyxZQUEwQjtRQUNsRCxJQUFJLFlBQVksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNO1lBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3pFLENBQUM7SUFHRCxlQUFlO0lBQ0wsUUFBUSxDQUFJLE9BQXdCLEVBQUUsaUJBQTBCLElBQUk7UUFDMUUsT0FBTyxJQUFJLE9BQU8s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LEtBQUssRUFBRSxPQUFPLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO29CQUN6SCxNQUFNO2dCQUNWLENBQUM7Z0JBRUQsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNQLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLGdDQUFnQyxDQUFDLENBQUM7b0JBQzlHLE1BQU07Z0JBQ1YsQ0FBQztnQkFFRCxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ1AsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztvQkFDakgsTUFBTTtnQkFDVixDQUFDO2dCQUVELE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ04sSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO3dCQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxjQUFjLEVBQUUscUNBQXFDLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQzFHLENBQUM7O3dCQUVJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDckUsTUFBTTtnQkFDVixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwUmVxdWVzdCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBDb2VyQWxlcnQgfSBmcm9tIFwiLi9jb2VyLWFsZXJ0L2NvZXItYWxlcnQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElIdHRwUmVxdWVzdCwgSUh0dHBSZXNwb25zZSB9IGZyb20gXCJjb2VyLWVsZW1lbnRzL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHsgVG9vbHMgfSBmcm9tIFwiLi90b29sc1wiO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlcnZpY2Uge1xyXG5cclxuICAgIC8vSW5qZWN0aW9uc1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFsZXJ0ID0gaW5qZWN0KENvZXJBbGVydCk7XHJcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgaHR0cENvZGUgPSB7XHJcbiAgICAgICAgT2s6IDIwMCxcclxuICAgICAgICBDcmVhdGVkOiAyMDEsXHJcbiAgICAgICAgTm9Db250ZW50OiAyMDQsXHJcbiAgICAgICAgQmFkUmVxdWVzdDogNDAwLFxyXG4gICAgICAgIFVuYXV0aG9yaXplOiA0MDEsXHJcbiAgICAgICAgTm90Rm91bmQ6IDQwNCxcclxuICAgICAgICBOb3RBbGxvd2VkOiA0MDUsXHJcbiAgICAgICAgTm90QWNjZXB0YWJsZTogNDA2LFxyXG4gICAgICAgIENvbmZsaWN0OiA0MDksXHJcbiAgICAgICAgUGF5bG9hZFRvb0xhcmdlOiA0MTMsXHJcbiAgICAgICAgSW5uZXJFcnJvcjogNTAwXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vU3Vic2NyaXB0aW9uc1xyXG4gICAgcHJpdmF0ZSBfR0VUJCE6IFN1YnNjcmlwdGlvbjtcclxuICAgIHByaXZhdGUgX1BPU1QkITogU3Vic2NyaXB0aW9uO1xyXG4gICAgcHJpdmF0ZSBfUFVUJCE6IFN1YnNjcmlwdGlvbjtcclxuICAgIHByaXZhdGUgX1BBVENIJCE6IFN1YnNjcmlwdGlvbjtcclxuICAgIHByaXZhdGUgX0RFTEVURSQhOiBTdWJzY3JpcHRpb247XHJcblxyXG5cclxuICAgIC8qKiAqL1xyXG4gICAgcHJpdmF0ZSBSZWxlYXNlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiAmJiAhc3Vic2NyaXB0aW9uLmNsb3NlZCkgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiBIVFRQIEdFVCAqL1xyXG4gICAgcHJvdGVjdGVkIEhUVFBfR0VUPFQ+KHJlcXVlc3Q6IElIdHRwUmVxdWVzdDxUPiwgY2FuY2VsUHJldmlvdXM6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPElIdHRwUmVzcG9uc2U8VD4+KFJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBpZihjYW5jZWxQcmV2aW91cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZWxlYXNlU3Vic2NyaXB0aW9uKHRoaXMuX0dFVCQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9HRVQkID0gdGhpcy5odHRwLnJlcXVlc3Q8VD4obmV3IEh0dHBSZXF1ZXN0KFwiR0VUXCIsIHJlcXVlc3QudXJsLCB7IHBhcmFtczogcmVxdWVzdC5xdWVyeVBhcmFtcywgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzIH0pKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IChyZXNwb25zZTogSHR0cEV2ZW50PFQ+IHwgYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS50eXBlID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogVG9vbHMuQnJlYWtSZWZlcmVuY2U8VD4ocmVzcG9uc2UuYm9keSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChodHRwRXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmVsZWFzZVN1YnNjcmlwdGlvbih0aGlzLl9HRVQkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5BbGVydEVycm9yKGh0dHBFcnJvciwgcmVxdWVzdC5hbGVydEVycm9yKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHt9IGFzIGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogaHR0cEVycm9yLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGh0dHBFcnJvci5lcnJvcj8ubWVzc2FnZSB8fCBodHRwRXJyb3IuZXJyb3IsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmVsZWFzZVN1YnNjcmlwdGlvbih0aGlzLl9HRVQkKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVG9vbHMuSXNOb3RPbmx5V2hpdGVTcGFjZShyZXF1ZXN0LmFsZXJ0U3VjY2VzcykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQuU3VjY2VzcyhyZXF1ZXN0LmFsZXJ0U3VjY2Vzcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmh0dHAucmVxdWVzdDxUPihuZXcgSHR0cFJlcXVlc3QoXCJHRVRcIiwgcmVxdWVzdC51cmwsIHsgcGFyYW1zOiByZXF1ZXN0LnF1ZXJ5UGFyYW1zLCBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMgfSkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBIdHRwRXZlbnQ8VD4gfCBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnR5cGUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBUb29scy5CcmVha1JlZmVyZW5jZTxUPihyZXNwb25zZS5ib2R5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5zdGF0dXNUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGh0dHBFcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZWxlYXNlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQWxlcnRFcnJvcihodHRwRXJyb3IsIHJlcXVlc3QuYWxlcnRFcnJvcik7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5OiB7fSBhcyBhbnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IGh0dHBFcnJvci5zdGF0dXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBodHRwRXJyb3IuZXJyb3I/Lm1lc3NhZ2UgfHwgaHR0cEVycm9yLmVycm9yLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2s6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJlbGVhc2VTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVG9vbHMuSXNOb3RPbmx5V2hpdGVTcGFjZShyZXF1ZXN0LmFsZXJ0U3VjY2VzcykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQuU3VjY2VzcyhyZXF1ZXN0LmFsZXJ0U3VjY2Vzcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKiogSFRUUCBQT1NUICovXHJcbiAgICBwcm90ZWN0ZWQgSFRUUF9QT1NUPFQ+KHJlcXVlc3Q6IElIdHRwUmVxdWVzdDxUPiwgY2FuY2VsUHJldmlvdXM6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPElIdHRwUmVzcG9uc2U8VD4+KFJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBpZihjYW5jZWxQcmV2aW91cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZWxlYXNlU3Vic2NyaXB0aW9uKHRoaXMuX1BPU1QkKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fUE9TVCQgPSB0aGlzLmh0dHAucmVxdWVzdDxUPihuZXcgSHR0cFJlcXVlc3QoXCJQT1NUXCIsIHJlcXVlc3QudXJsLCByZXF1ZXN0LmJvZHksIHsgcGFyYW1zOiByZXF1ZXN0LnF1ZXJ5UGFyYW1zLCBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMgfSkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBIdHRwRXZlbnQ8VD4gfCBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnR5cGUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBUb29scy5CcmVha1JlZmVyZW5jZTxUPihyZXNwb25zZS5ib2R5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5zdGF0dXNUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGh0dHBFcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZWxlYXNlU3Vic2NyaXB0aW9uKHRoaXMuX1BPU1QkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5BbGVydEVycm9yKGh0dHBFcnJvciwgcmVxdWVzdC5hbGVydEVycm9yKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHt9IGFzIGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogaHR0cEVycm9yLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGh0dHBFcnJvci5lcnJvcj8ubWVzc2FnZSB8fCBodHRwRXJyb3IuZXJyb3IsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmVsZWFzZVN1YnNjcmlwdGlvbih0aGlzLl9QT1NUJCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRvb2xzLklzTm90T25seVdoaXRlU3BhY2UocmVxdWVzdC5hbGVydFN1Y2Nlc3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0LlN1Y2Nlc3MocmVxdWVzdC5hbGVydFN1Y2Nlc3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5odHRwLnJlcXVlc3Q8VD4obmV3IEh0dHBSZXF1ZXN0KFwiUE9TVFwiLCByZXF1ZXN0LnVybCwgcmVxdWVzdC5ib2R5LCB7IHBhcmFtczogcmVxdWVzdC5xdWVyeVBhcmFtcywgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzIH0pKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IChyZXNwb25zZTogSHR0cEV2ZW50PFQ+IHwgYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS50eXBlID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogVG9vbHMuQnJlYWtSZWZlcmVuY2U8VD4ocmVzcG9uc2UuYm9keSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChodHRwRXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmVsZWFzZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFsZXJ0RXJyb3IoaHR0cEVycm9yLCByZXF1ZXN0LmFsZXJ0RXJyb3IpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keToge30gYXMgYW55LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBodHRwRXJyb3Iuc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogaHR0cEVycm9yLmVycm9yPy5tZXNzYWdlIHx8IGh0dHBFcnJvci5lcnJvcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZWxlYXNlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRvb2xzLklzTm90T25seVdoaXRlU3BhY2UocmVxdWVzdC5hbGVydFN1Y2Nlc3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0LlN1Y2Nlc3MocmVxdWVzdC5hbGVydFN1Y2Nlc3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqIEhUVFAgUFVUICovXHJcbiAgICBwcm90ZWN0ZWQgSFRUUF9QVVQ8VD4ocmVxdWVzdDogSUh0dHBSZXF1ZXN0PFQ+LCBjYW5jZWxQcmV2aW91czogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8SUh0dHBSZXNwb25zZTx2b2lkPj4oUmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIGlmKGNhbmNlbFByZXZpb3VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlJlbGVhc2VTdWJzY3JpcHRpb24odGhpcy5fUFVUJCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIHRoaXMuX1BVVCQgPSB0aGlzLmh0dHAucmVxdWVzdDxUPihuZXcgSHR0cFJlcXVlc3QoXCJQVVRcIiwgcmVxdWVzdC51cmwsIHJlcXVlc3QuYm9keSwgeyBwYXJhbXM6IHJlcXVlc3QucXVlcnlQYXJhbXMsIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyB9KSkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IEh0dHBFdmVudDxUPiB8IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UudHlwZSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHt9IGFzIGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZS5zdGF0dXNUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGh0dHBFcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZWxlYXNlU3Vic2NyaXB0aW9uKHRoaXMuX1BVVCQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFsZXJ0RXJyb3IoaHR0cEVycm9yLCByZXF1ZXN0LmFsZXJ0RXJyb3IpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keToge30gYXMgYW55LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBodHRwRXJyb3Iuc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogaHR0cEVycm9yLmVycm9yPy5tZXNzYWdlIHx8IGh0dHBFcnJvci5lcnJvcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZWxlYXNlU3Vic2NyaXB0aW9uKHRoaXMuX1BVVCQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUb29scy5Jc05vdE9ubHlXaGl0ZVNwYWNlKHJlcXVlc3QuYWxlcnRTdWNjZXNzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC5TdWNjZXNzKHJlcXVlc3QuYWxlcnRTdWNjZXNzLCAnVXBkYXRlZCcsICdmYS1zb2xpZCBmYS1hcnJvd3Mtcm90YXRlIGZhLXNwaW4nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuaHR0cC5yZXF1ZXN0PFQ+KG5ldyBIdHRwUmVxdWVzdChcIlBVVFwiLCByZXF1ZXN0LnVybCwgcmVxdWVzdC5ib2R5LCB7IHBhcmFtczogcmVxdWVzdC5xdWVyeVBhcmFtcywgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzIH0pKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IChyZXNwb25zZTogSHR0cEV2ZW50PFQ+IHwgYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS50eXBlID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keToge30gYXMgYW55LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLnN0YXR1c1RleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2s6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiAoaHR0cEVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJlbGVhc2VTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5BbGVydEVycm9yKGh0dHBFcnJvciwgcmVxdWVzdC5hbGVydEVycm9yKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHt9IGFzIGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogaHR0cEVycm9yLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGh0dHBFcnJvci5lcnJvcj8ubWVzc2FnZSB8fCBodHRwRXJyb3IuZXJyb3IsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmVsZWFzZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUb29scy5Jc05vdE9ubHlXaGl0ZVNwYWNlKHJlcXVlc3QuYWxlcnRTdWNjZXNzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC5TdWNjZXNzKHJlcXVlc3QuYWxlcnRTdWNjZXNzLCAnVXBkYXRlZCcsICdmYS1zb2xpZCBmYS1hcnJvd3Mtcm90YXRlIGZhLXNwaW4nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiBIVFRQIFBBVENIICovXHJcbiAgICBwcm90ZWN0ZWQgSFRUUF9QQVRDSDxUPihyZXF1ZXN0OiBJSHR0cFJlcXVlc3Q8VD4sIGNhbmNlbFByZXZpb3VzOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxJSHR0cFJlc3BvbnNlPHZvaWQ+PihSZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgaWYoY2FuY2VsUHJldmlvdXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVsZWFzZVN1YnNjcmlwdGlvbih0aGlzLl9QQVRDSCQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9QQVRDSCQgPSB0aGlzLmh0dHAucmVxdWVzdDxUPihuZXcgSHR0cFJlcXVlc3QoXCJQQVRDSFwiLCByZXF1ZXN0LnVybCwgcmVxdWVzdC5ib2R5LCB7IHBhcmFtczogcmVxdWVzdC5xdWVyeVBhcmFtcywgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzIH0pKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IChyZXNwb25zZTogSHR0cEV2ZW50PFQ+IHwgYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS50eXBlID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keToge30gYXMgYW55LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLnN0YXR1c1RleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2s6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiAoaHR0cEVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJlbGVhc2VTdWJzY3JpcHRpb24odGhpcy5fUEFUQ0gkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5BbGVydEVycm9yKGh0dHBFcnJvciwgcmVxdWVzdC5hbGVydEVycm9yKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHt9IGFzIGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogaHR0cEVycm9yLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGh0dHBFcnJvci5lcnJvcj8ubWVzc2FnZSB8fCBodHRwRXJyb3IuZXJyb3IsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmVsZWFzZVN1YnNjcmlwdGlvbih0aGlzLl9QQVRDSCQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUb29scy5Jc05vdE9ubHlXaGl0ZVNwYWNlKHJlcXVlc3QuYWxlcnRTdWNjZXNzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC5TdWNjZXNzKHJlcXVlc3QuYWxlcnRTdWNjZXNzLCAnVXBkYXRlZCcsICdmYS1zb2xpZCBmYS1hcnJvd3Mtcm90YXRlIGZhLXNwaW4nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuaHR0cC5yZXF1ZXN0PFQ+KG5ldyBIdHRwUmVxdWVzdChcIlBBVENIXCIsIHJlcXVlc3QudXJsLCByZXF1ZXN0LmJvZHksIHsgcGFyYW1zOiByZXF1ZXN0LnF1ZXJ5UGFyYW1zLCBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMgfSkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBIdHRwRXZlbnQ8VD4gfCBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnR5cGUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5OiB7fSBhcyBhbnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChodHRwRXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmVsZWFzZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFsZXJ0RXJyb3IoaHR0cEVycm9yLCByZXF1ZXN0LmFsZXJ0RXJyb3IpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keToge30gYXMgYW55LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBodHRwRXJyb3Iuc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogaHR0cEVycm9yLmVycm9yPy5tZXNzYWdlIHx8IGh0dHBFcnJvci5lcnJvcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZWxlYXNlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRvb2xzLklzTm90T25seVdoaXRlU3BhY2UocmVxdWVzdC5hbGVydFN1Y2Nlc3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0LlN1Y2Nlc3MocmVxdWVzdC5hbGVydFN1Y2Nlc3MsICdVcGRhdGVkJywgJ2ZhLXNvbGlkIGZhLWFycm93cy1yb3RhdGUgZmEtc3BpbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqIEhUVFAgREVMRVRFICovXHJcbiAgICBwcm90ZWN0ZWQgSFRUUF9ERUxFVEU8VD4ocmVxdWVzdDogSUh0dHBSZXF1ZXN0PFQ+LCBjYW5jZWxQcmV2aW91czogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8SUh0dHBSZXNwb25zZTx2b2lkPj4oUmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIGlmKGNhbmNlbFByZXZpb3VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlJlbGVhc2VTdWJzY3JpcHRpb24odGhpcy5fREVMRVRFJCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIHRoaXMuX0RFTEVURSQgPSB0aGlzLmh0dHAucmVxdWVzdDxUPihuZXcgSHR0cFJlcXVlc3QoXCJERUxFVEVcIiwgcmVxdWVzdC51cmwsIHsgcGFyYW1zOiByZXF1ZXN0LnF1ZXJ5UGFyYW1zLCBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMgfSkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBIdHRwRXZlbnQ8VD4gfCBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnR5cGUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5OiB7fSBhcyBhbnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChodHRwRXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmVsZWFzZVN1YnNjcmlwdGlvbih0aGlzLl9ERUxFVEUkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5BbGVydEVycm9yKGh0dHBFcnJvciwgcmVxdWVzdC5hbGVydEVycm9yKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHt9IGFzIGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogaHR0cEVycm9yLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGh0dHBFcnJvci5lcnJvcj8ubWVzc2FnZSB8fCBodHRwRXJyb3IuZXJyb3IsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmVsZWFzZVN1YnNjcmlwdGlvbih0aGlzLl9ERUxFVEUkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRvb2xzLklzTm90T25seVdoaXRlU3BhY2UocmVxdWVzdC5hbGVydFN1Y2Nlc3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0LlN1Y2Nlc3MocmVxdWVzdC5hbGVydFN1Y2Nlc3MsICdEZWxldGVkJywgJ2ZhLXJlZ3VsYXIgZmEtdHJhc2gtY2FuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmh0dHAucmVxdWVzdDxUPihuZXcgSHR0cFJlcXVlc3QoXCJERUxFVEVcIiwgcmVxdWVzdC51cmwsIHsgcGFyYW1zOiByZXF1ZXN0LnF1ZXJ5UGFyYW1zLCBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMgfSkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBIdHRwRXZlbnQ8VD4gfCBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnR5cGUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5OiB7fSBhcyBhbnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChodHRwRXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmVsZWFzZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFsZXJ0RXJyb3IoaHR0cEVycm9yLCByZXF1ZXN0LmFsZXJ0RXJyb3IpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keToge30gYXMgYW55LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBodHRwRXJyb3Iuc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogaHR0cEVycm9yLmVycm9yPy5tZXNzYWdlIHx8IGh0dHBFcnJvci5lcnJvcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZWxlYXNlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUb29scy5Jc05vdE9ubHlXaGl0ZVNwYWNlKHJlcXVlc3QuYWxlcnRTdWNjZXNzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC5TdWNjZXNzKHJlcXVlc3QuYWxlcnRTdWNjZXNzLCAnRGVsZXRlZCcsICdmYS1yZWd1bGFyIGZhLXRyYXNoLWNhbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqICovXHJcbiAgICBwcml2YXRlIEFsZXJ0RXJyb3IoaHR0cEVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSwgbWVzc2FnZT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmIChodHRwRXJyb3Iuc3RhdHVzID49IDUwMCkge1xyXG4gICAgICAgICAgICBpZiAoVG9vbHMuSXNOb3RPbmx5V2hpdGVTcGFjZShtZXNzYWdlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbGVydC5FcnJvcihtZXNzYWdlLCBgQlVHICR7aHR0cEVycm9yLnN0YXR1c31gLCAnZmEtc29saWQgZmEtYnVnJywgbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsc2UgaWYgKGh0dHBFcnJvci5zdGF0dXMgPCA1MDApIHtcclxuICAgICAgICAgICAgc3dpdGNoKGh0dHBFcnJvci5zdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgNDAwOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydC5XYXJuaW5nKGh0dHBFcnJvci5lcnJvcj8ubWVzc2FnZSB8fCBodHRwRXJyb3IuZXJyb3IsICdCYWQgUmVxdWVzdCcsICdmYS1yZWd1bGFyIGZhLWZhY2UtZ3Jpbi1iZWFtLXN3ZWF0IGZhLWxnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSA0MDE6IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0Lldhcm5pbmcoaHR0cEVycm9yLmVycm9yPy5tZXNzYWdlIHx8IGh0dHBFcnJvci5lcnJvciwgJ1VuYXV0aG9yaXplJywgJ2ZhLXJlZ3VsYXIgZmEtZmFjZS1yb2xsaW5nLWV5ZXMgZmEtbGcnKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlIDQwNDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQuV2FybmluZyhodHRwRXJyb3IuZXJyb3I/Lm1lc3NhZ2UgfHwgaHR0cEVycm9yLmVycm9yLCAnTm90IEZvdW5kJywgJ2ZhLXJlZ3VsYXIgZmEtZmFjZS1tZWggZmEtbGcnKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlIDQwNToge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQuV2FybmluZyhodHRwRXJyb3IuZXJyb3I/Lm1lc3NhZ2UgfHwgaHR0cEVycm9yLmVycm9yLCAnTm90IEFsbG93ZWQnLCAnZmEtcmVndWxhciBmYS1mYWNlLWdyaW1hY2UgZmEtbGcnKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlIDQwNjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQuV2FybmluZyhodHRwRXJyb3IuZXJyb3I/Lm1lc3NhZ2UgfHwgaHR0cEVycm9yLmVycm9yLCAnTm90IEFjY2VwdGFibGUnLCAnZmEtcmVndWxhciBmYS1mYWNlLWZyb3duLW9wZW4gZmEtbGcnKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlIDQwOToge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQuV2FybmluZyhodHRwRXJyb3IuZXJyb3I/Lm1lc3NhZ2UgfHwgaHR0cEVycm9yLmVycm9yLCAnQ29uZmxpY3QnLCAnZmEtcmVndWxhciBmYS1mYWNlLWRpenp5IGZhLWxnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSA0MTM6IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0Lldhcm5pbmcoaHR0cEVycm9yLmVycm9yPy5tZXNzYWdlIHx8IGh0dHBFcnJvci5lcnJvciwgJ1RvbyBMYXJnZScsICdmYS1yZWd1bGFyIGZhLWZhY2UtZmx1c2hlZCBmYS1sZycpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaHR0cEVycm9yLnN0YXR1cyA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxlcnQuV2FybmluZygnV2l0aG91dCBDb25uZWN0aW9uJywgJ1dFQiBBUEkgRE9XTicsICdmYS1zb2xpZCBmYS1wbHVnLWNpcmNsZS14bWFyayBmYS1sZycsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB0aGlzLmFsZXJ0Lldhcm5pbmcoaHR0cEVycm9yLmVycm9yPy5tZXNzYWdlIHx8IGh0dHBFcnJvci5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=
@@ -1,80 +0,0 @@
1
- import { inject } from "@angular/core";
2
- import { Router } from '@angular/router';
3
- import { Breadcrumbs } from "./breadcrumbs.class";
4
- import { Tools } from "./tools";
5
- export class Source {
6
- static { this.storage = 'COER-System'; }
7
- /** */
8
- static Set(page) {
9
- const ROUTER = inject(Router);
10
- let path = ROUTER.url;
11
- if (path.includes('?'))
12
- path = path.split('?')[0];
13
- Breadcrumbs.Add(page, path);
14
- const breadcrumbs = Breadcrumbs.Get();
15
- if (breadcrumbs.length >= 2) {
16
- breadcrumbs.pop();
17
- const breadcrumb = breadcrumbs.pop();
18
- this.Save({ page: breadcrumb.page, path: breadcrumb.path });
19
- }
20
- else
21
- this.Save(null);
22
- }
23
- /** */
24
- static Save(source) {
25
- let storage = sessionStorage.getItem(this.storage);
26
- if (storage)
27
- storage = JSON.parse(storage);
28
- storage = Object.assign({}, storage, { source });
29
- sessionStorage.setItem(this.storage, JSON.stringify(storage));
30
- }
31
- /** */
32
- static Get() {
33
- let storage = sessionStorage.getItem(this.storage);
34
- if (storage) {
35
- storage = JSON.parse(storage);
36
- if (storage.hasOwnProperty('source')) {
37
- return storage.source;
38
- }
39
- }
40
- return null;
41
- }
42
- /** */
43
- static GetRoot() {
44
- const breadcrumbs = Breadcrumbs.Get();
45
- return (breadcrumbs.length > 0) ? breadcrumbs.shift() : null;
46
- }
47
- /** */
48
- static SetPageResponse(pageResponse) {
49
- let storage = sessionStorage.getItem(this.storage);
50
- storage = JSON.parse(storage);
51
- storage = Object.assign({}, storage, { pageResponse });
52
- sessionStorage.setItem(this.storage, JSON.stringify(storage));
53
- }
54
- /** */
55
- static GetPageResponse() {
56
- let storage = sessionStorage.getItem(this.storage);
57
- if (storage) {
58
- storage = JSON.parse(storage);
59
- if (storage.hasOwnProperty('pageResponse')) {
60
- return Tools.BreakReference(storage.pageResponse);
61
- }
62
- }
63
- return null;
64
- }
65
- /** */
66
- static ClearPageResponse() {
67
- let storage = sessionStorage.getItem(this.storage);
68
- storage = JSON.parse(storage);
69
- if (storage.hasOwnProperty('pageResponse')) {
70
- delete storage.pageResponse;
71
- }
72
- storage = Object.assign({}, storage);
73
- sessionStorage.setItem(this.storage, JSON.stringify(storage));
74
- }
75
- /** */
76
- static Reset() {
77
- sessionStorage.removeItem(this.storage);
78
- }
79
- }
80
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29lci1lbGVtZW50cy90b29scy9saWIvc291cmNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE1BQU0sT0FBTyxNQUFNO2FBRVMsWUFBTyxHQUFHLGFBQWEsQ0FBQztJQUVoRCxNQUFNO0lBQ0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFZO1FBQzFCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU5QixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ3RCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsRCxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUU1QixNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFdEMsSUFBRyxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3pCLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNsQixNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFHLENBQUM7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLENB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QUM7WUFDekMsT0FBTyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBQ2hDLENBQUM7UUFFRCxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBR0QsTUFBTTtJQUNDLE1BQU0sQ0FBQyxLQUFLO1FBQ2YsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IElBcHBTb3VyY2UgfSBmcm9tIFwiY29lci1lbGVtZW50cy9pbnRlcmZhY2VzXCI7XHJcbmltcG9ydCB7IEJyZWFkY3J1bWJzIH0gZnJvbSBcIi4vYnJlYWRjcnVtYnMuY2xhc3NcIjtcclxuaW1wb3J0IHsgVG9vbHMgfSBmcm9tIFwiLi90b29sc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNvdXJjZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RvcmFnZSA9ICdDT0VSLVN5c3RlbSc7XHJcblxyXG4gICAgLyoqICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNldChwYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBST1VURVIgPSBpbmplY3QoUm91dGVyKTtcclxuXHJcbiAgICAgICAgbGV0IHBhdGggPSBST1VURVIudXJsO1xyXG4gICAgICAgIGlmIChwYXRoLmluY2x1ZGVzKCc/JykpIHBhdGggPSBwYXRoLnNwbGl0KCc/JylbMF07XHJcblxyXG4gICAgICAgIEJyZWFkY3J1bWJzLkFkZChwYWdlLCBwYXRoKTtcclxuXHJcbiAgICAgICAgY29uc3QgYnJlYWRjcnVtYnMgPSBCcmVhZGNydW1icy5HZXQoKTtcclxuXHJcbiAgICAgICAgaWYoYnJlYWRjcnVtYnMubGVuZ3RoID49IDIpIHtcclxuICAgICAgICAgICAgYnJlYWRjcnVtYnMucG9wKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGJyZWFkY3J1bWIgPSBicmVhZGNydW1icy5wb3AoKSE7XHJcbiAgICAgICAgICAgIHRoaXMuU2F2ZSh7IHBhZ2U6IGJyZWFkY3J1bWIucGFnZSwgcGF0aDogYnJlYWRjcnVtYi5wYXRoIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZWxzZSB0aGlzLlNhdmUobnVsbCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgU2F2ZShzb3VyY2U6IElBcHBTb3VyY2UgfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHN0b3JhZ2UgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuc3RvcmFnZSkgYXMgYW55O1xyXG4gICAgICAgIGlmIChzdG9yYWdlKSBzdG9yYWdlID0gSlNPTi5wYXJzZShzdG9yYWdlKTtcclxuICAgICAgICBzdG9yYWdlID0gT2JqZWN0LmFzc2lnbih7fSwgc3RvcmFnZSwgeyBzb3VyY2UgfSk7XHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnN0b3JhZ2UsIEpTT04uc3RyaW5naWZ5KHN0b3JhZ2UpKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldCgpOiBJQXBwU291cmNlIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IHN0b3JhZ2UgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuc3RvcmFnZSkgYXMgYW55O1xyXG5cclxuICAgICAgICBpZiAoc3RvcmFnZSkge1xyXG4gICAgICAgICAgICBzdG9yYWdlID0gSlNPTi5wYXJzZShzdG9yYWdlKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdG9yYWdlLmhhc093blByb3BlcnR5KCdzb3VyY2UnKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2Uuc291cmNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldFJvb3QoKTogSUFwcFNvdXJjZSB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGJyZWFkY3J1bWJzID0gQnJlYWRjcnVtYnMuR2V0KCk7XHJcbiAgICAgICAgcmV0dXJuIChicmVhZGNydW1icy5sZW5ndGggPiAwKSA/IGJyZWFkY3J1bWJzLnNoaWZ0KCkhIDogbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNldFBhZ2VSZXNwb25zZTxUPihwYWdlUmVzcG9uc2U6IFQpOiB2b2lkIHtcclxuICAgICAgICBsZXQgc3RvcmFnZSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlKSBhcyBhbnk7XHJcbiAgICAgICAgc3RvcmFnZSA9IEpTT04ucGFyc2Uoc3RvcmFnZSk7XHJcbiAgICAgICAgc3RvcmFnZSA9IE9iamVjdC5hc3NpZ24oe30sIHN0b3JhZ2UsIHsgcGFnZVJlc3BvbnNlIH0pO1xyXG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5zdG9yYWdlLCBKU09OLnN0cmluZ2lmeShzdG9yYWdlKSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBHZXRQYWdlUmVzcG9uc2U8VD4oKTogVCB8IG51bGwge1xyXG4gICAgICAgIGxldCBzdG9yYWdlID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnN0b3JhZ2UpIGFzIGFueTtcclxuXHJcbiAgICAgICAgaWYgKHN0b3JhZ2UpIHtcclxuICAgICAgICAgICAgc3RvcmFnZSA9IEpTT04ucGFyc2Uoc3RvcmFnZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3RvcmFnZS5oYXNPd25Qcm9wZXJ0eSgncGFnZVJlc3BvbnNlJykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBUb29scy5CcmVha1JlZmVyZW5jZShzdG9yYWdlLnBhZ2VSZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKiogKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgQ2xlYXJQYWdlUmVzcG9uc2UoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHN0b3JhZ2UgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuc3RvcmFnZSkgYXMgYW55O1xyXG4gICAgICAgIHN0b3JhZ2UgPSBKU09OLnBhcnNlKHN0b3JhZ2UpO1xyXG5cclxuICAgICAgICBpZiAoc3RvcmFnZS5oYXNPd25Qcm9wZXJ0eSgncGFnZVJlc3BvbnNlJykpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHN0b3JhZ2UucGFnZVJlc3BvbnNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RvcmFnZSA9IE9iamVjdC5hc3NpZ24oe30sIHN0b3JhZ2UpO1xyXG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5zdG9yYWdlLCBKU09OLnN0cmluZ2lmeShzdG9yYWdlKSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBSZXNldCgpOiB2b2lkIHtcclxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuc3RvcmFnZSk7XHJcbiAgICB9XHJcbn0iXX0=