cloud-ide-core 0.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +49 -10
  2. package/fesm2022/cloud-ide-core-general-master-type.component-BNYoP_bS.mjs +609 -0
  3. package/fesm2022/cloud-ide-core-general-master-type.component-BNYoP_bS.mjs.map +1 -0
  4. package/fesm2022/cloud-ide-core-general-master-type.service-8JWTVijZ.mjs +206 -0
  5. package/fesm2022/cloud-ide-core-general-master-type.service-8JWTVijZ.mjs.map +1 -0
  6. package/fesm2022/cloud-ide-core-general-master.component-CFGGHinl.mjs +901 -0
  7. package/fesm2022/cloud-ide-core-general-master.component-CFGGHinl.mjs.map +1 -0
  8. package/fesm2022/cloud-ide-core-page-form.component-vfE-LkTS.mjs +215 -0
  9. package/fesm2022/cloud-ide-core-page-form.component-vfE-LkTS.mjs.map +1 -0
  10. package/fesm2022/cloud-ide-core.mjs +1280 -1105
  11. package/fesm2022/cloud-ide-core.mjs.map +1 -1
  12. package/index.d.ts +1736 -3
  13. package/package.json +3 -5
  14. package/esm2022/cloud-ide-core.mjs +0 -5
  15. package/esm2022/lib/cloud-ide-core.component.mjs +0 -19
  16. package/esm2022/lib/cloud-ide-core.service.mjs +0 -14
  17. package/esm2022/lib/core/department-management/components/department-list/department-list.component.mjs +0 -768
  18. package/esm2022/lib/core/department-management/index.mjs +0 -5
  19. package/esm2022/lib/core/department-management/services/department-management.service.mjs +0 -187
  20. package/esm2022/lib/core/designation-management/components/designation-list/designation-list.component.mjs +0 -1122
  21. package/esm2022/lib/core/designation-management/index.mjs +0 -5
  22. package/esm2022/lib/core/designation-management/services/designation-management.service.mjs +0 -194
  23. package/esm2022/lib/core/grade-level-management/components/grade-level-list/grade-level-list.component.mjs +0 -794
  24. package/esm2022/lib/core/grade-level-management/index.mjs +0 -5
  25. package/esm2022/lib/core/grade-level-management/services/grade-level-management.service.mjs +0 -172
  26. package/esm2022/lib/core/menu-management/components/menu-list/menu-list.component.mjs +0 -1135
  27. package/esm2022/lib/core/menu-management/index.mjs +0 -10
  28. package/esm2022/lib/core/menu-management/interfaces/menu-item.interface.mjs +0 -11
  29. package/esm2022/lib/core/menu-management/mock-data/menu-items.json +0 -311
  30. package/esm2022/lib/core/menu-management/services/menu-management.service.mjs +0 -230
  31. package/esm2022/lib/core/page-management/components/page-controls/page-controls.component.mjs +0 -483
  32. package/esm2022/lib/core/page-management/components/page-list/page-list.component.mjs +0 -393
  33. package/esm2022/lib/core/page-management/components/page-theme/page-theme.component.mjs +0 -767
  34. package/esm2022/lib/core/page-management/index.mjs +0 -10
  35. package/esm2022/lib/core/page-management/services/page-controls.service.mjs +0 -136
  36. package/esm2022/lib/core/page-management/services/page-management.service.mjs +0 -98
  37. package/esm2022/lib/core/page-management/services/page-theme.service.mjs +0 -107
  38. package/esm2022/public-api.mjs +0 -16
  39. package/lib/cloud-ide-core.component.d.ts +0 -5
  40. package/lib/cloud-ide-core.service.d.ts +0 -6
  41. package/lib/core/department-management/components/department-list/department-list.component.d.ts +0 -178
  42. package/lib/core/department-management/index.d.ts +0 -2
  43. package/lib/core/department-management/services/department-management.service.d.ts +0 -68
  44. package/lib/core/designation-management/components/designation-list/designation-list.component.d.ts +0 -242
  45. package/lib/core/designation-management/index.d.ts +0 -2
  46. package/lib/core/designation-management/services/designation-management.service.d.ts +0 -69
  47. package/lib/core/grade-level-management/components/grade-level-list/grade-level-list.component.d.ts +0 -199
  48. package/lib/core/grade-level-management/index.d.ts +0 -2
  49. package/lib/core/grade-level-management/services/grade-level-management.service.d.ts +0 -69
  50. package/lib/core/menu-management/components/menu-list/menu-list.component.d.ts +0 -278
  51. package/lib/core/menu-management/index.d.ts +0 -3
  52. package/lib/core/menu-management/interfaces/menu-item.interface.d.ts +0 -30
  53. package/lib/core/menu-management/services/menu-management.service.d.ts +0 -85
  54. package/lib/core/page-management/components/page-controls/page-controls.component.d.ts +0 -126
  55. package/lib/core/page-management/components/page-list/page-list.component.d.ts +0 -91
  56. package/lib/core/page-management/components/page-theme/page-theme.component.d.ts +0 -189
  57. package/lib/core/page-management/index.d.ts +0 -6
  58. package/lib/core/page-management/services/page-controls.service.d.ts +0 -54
  59. package/lib/core/page-management/services/page-management.service.d.ts +0 -42
  60. package/lib/core/page-management/services/page-theme.service.d.ts +0 -43
  61. package/public-api.d.ts +0 -7
@@ -1,767 +0,0 @@
1
- import { Component, signal, computed, viewChild, DestroyRef, inject } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { Validators, ReactiveFormsModule, NonNullableFormBuilder, FormsModule } from '@angular/forms';
4
- import { ActivatedRoute, Router } from '@angular/router';
5
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
- import { PageThemeService } from '../../services/page-theme.service';
7
- import { AppStateHelperService } from 'cloud-ide-layout';
8
- import { CideEleButtonComponent, CideEleDataGridComponent, CideIconComponent, CideInputComponent, CideSelectComponent, CideTextareaComponent, CideEleDropdownComponent, CideEleJsonEditorComponent, CideSelectOptionComponent } from 'cloud-ide-element';
9
- import { generateObjectFromString } from 'cloud-ide-lms-model';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@angular/common";
12
- import * as i2 from "@angular/forms";
13
- export class PageThemeComponent {
14
- constructor() {
15
- // Dependency injection
16
- this.destroyRef = inject(DestroyRef);
17
- this.themeService = inject(PageThemeService);
18
- this.appState = inject(AppStateHelperService);
19
- this.fb = inject(NonNullableFormBuilder);
20
- this.router = inject(Router);
21
- this.route = inject(ActivatedRoute);
22
- // Modern ViewChild signals for template renderers (Angular 20 approach)
23
- this.themeDetailsRendererTemplate = viewChild.required('themeDetailsRendererTemplate');
24
- this.themeStatusRendererTemplate = viewChild.required('themeStatusRendererTemplate');
25
- this.actionsDropdownRendererTemplate = viewChild.required('actionsDropdownRendererTemplate');
26
- // Make Math available in template
27
- this.Math = Math;
28
- // Signals for reactive state management
29
- this.themes = signal([]);
30
- this.loading = signal(false);
31
- this.error = signal(null);
32
- this.selectedItems = signal([]);
33
- this.searchTerm = signal('');
34
- // Derived list filtered by searchTerm
35
- this.filteredThemes = computed(() => {
36
- const q = (this.searchTerm() || '').toLowerCase().trim();
37
- const items = this.themes() || [];
38
- if (!q)
39
- return items;
40
- return items.filter(t => {
41
- const title = (t.sytm_title || '').toLowerCase();
42
- const code = (t.sytm_theme_code || '').toLowerCase();
43
- const desc = (t.sytm_desc || '').toLowerCase();
44
- return title.includes(q) || code.includes(q) || desc.includes(q);
45
- });
46
- });
47
- // Page information
48
- this.pageId = signal('');
49
- this.pageTitle = signal('');
50
- // Form state
51
- this.isEditMode = signal(false);
52
- this.editingThemeId = signal(null);
53
- this.retrievedTheme = signal(null);
54
- // Pagination signals
55
- this.currentPage = signal(1);
56
- this.pageSize = signal(10);
57
- this.totalItems = signal(0);
58
- // Modern reactive forms with signals
59
- this.themeForm = this.fb.group({
60
- sytm_title: ['', [Validators.required]],
61
- sytm_desc: [''],
62
- sytm_theme_code: ['', [Validators.required]],
63
- sytm_preview_id_fm: [''],
64
- sytm_sub_title: [''],
65
- sytm_configuration: ['{}'],
66
- sytm_entity_id_syen: [''],
67
- sytm_isselected: [false],
68
- sytm_layout: this.fb.group({
69
- sytm_layout_sidebar: this.fb.group({ status: [true] }),
70
- sytm_layout_header: this.fb.group({ status: [true] }),
71
- sytm_layout_footer: this.fb.group({ status: [false] }),
72
- sytm_layout_breadcrumb: this.fb.group({ status: [true] }),
73
- sytm_layout_console: this.fb.group({ status: [false] }),
74
- sytm_layout_request: this.fb.group({ status: [false] }),
75
- sytm_layout_drawer: this.fb.array([])
76
- }),
77
- sytm_isactive: [true]
78
- });
79
- // Computed values
80
- this.isFormDirty = computed(() => this.themeForm.dirty);
81
- // Multi-select options for layout sections
82
- this.layoutOptions = [
83
- { value: 'sidebar', label: 'Sidebar' },
84
- { value: 'header', label: 'Header' },
85
- { value: 'footer', label: 'Footer' },
86
- { value: 'breadcrumb', label: 'Breadcrumb' },
87
- { value: 'console', label: 'Console' },
88
- { value: 'request', label: 'Request' }
89
- ];
90
- // Grid configuration signal
91
- this.gridConfig = signal({
92
- id: 'theme-list-grid',
93
- title: '',
94
- subtitle: '',
95
- columns: [
96
- {
97
- key: 'details',
98
- header: 'Theme Details',
99
- type: 'custom',
100
- width: 'auto',
101
- truncate: true,
102
- align: 'left',
103
- renderer: 'themeDetailsRenderer'
104
- },
105
- {
106
- key: 'sytm_theme_code',
107
- header: 'Theme Code',
108
- type: 'text',
109
- width: '150px',
110
- truncate: true,
111
- align: 'left'
112
- },
113
- {
114
- key: 'sytm_isactive',
115
- header: 'Status',
116
- type: 'custom',
117
- width: '100px',
118
- truncate: false,
119
- align: 'center',
120
- renderer: 'themeStatusRenderer'
121
- },
122
- {
123
- key: 'actions',
124
- header: '',
125
- type: 'custom',
126
- width: '120px',
127
- truncate: false,
128
- align: 'center',
129
- renderer: 'actionsDropdownRenderer'
130
- }
131
- ],
132
- data: [],
133
- trackBy: '_id',
134
- pagination: {
135
- enabled: true,
136
- pageSize: 10,
137
- pageSizeOptions: [10, 25, 50, 100],
138
- showQuickJump: true,
139
- showPageInfo: true,
140
- showRefresh: true
141
- },
142
- search: {
143
- enabled: true,
144
- placeholder: 'Search themes...',
145
- searchableColumns: ['sytm_title', 'sytm_desc', 'sytm_theme_code'],
146
- debounceMs: 300
147
- },
148
- loading: {
149
- useDefer: true,
150
- skeletonRows: 5,
151
- showOverlay: false
152
- },
153
- scroll: {
154
- enabled: true,
155
- maxHeight: '',
156
- minHeight: '',
157
- stickyHeader: true,
158
- virtualScroll: false,
159
- rowHeight: 50
160
- },
161
- responsive: true,
162
- striped: false,
163
- bordered: true,
164
- compact: false,
165
- tableClass: 'tw-table-fixed tw-w-full tw-rounded-none'
166
- });
167
- // Action handlers for grid
168
- this.actionHandlers = {
169
- onEdit: (item) => this.editTheme(item),
170
- onDelete: (item) => this.deleteTheme(item),
171
- onToggleStatus: (item) => this.toggleThemeStatus(item)
172
- };
173
- // ===== Drawer (sytm_layout_drawer) helpers =====
174
- this.drawerConfigOptions = [
175
- { value: 'drawer_notes', label: 'Drawer Notes' },
176
- { value: 'drawer_theme', label: 'Drawer Theme' }
177
- ];
178
- }
179
- // Helper to resolve preview image URL safely
180
- getPreviewUrl(theme) {
181
- const id = theme?.sytm_preview_id_fm || '';
182
- if (!id)
183
- return '';
184
- const svcUnknown = this.themeService;
185
- const hasGetPreviewUrl = (svc) => typeof svc === 'object' && svc !== null &&
186
- 'getPreviewUrl' in svc &&
187
- typeof svc['getPreviewUrl'] === 'function';
188
- if (hasGetPreviewUrl(svcUnknown)) {
189
- return svcUnknown.getPreviewUrl(id);
190
- }
191
- return '';
192
- }
193
- // Input handler to avoid $any casts in template
194
- onGallerySearchInput(event) {
195
- const target = event.target;
196
- this.searchTerm.set(target?.value ?? '');
197
- }
198
- // Read enabled selections from form values
199
- enabledLayoutSelections() {
200
- const layout = this.themeForm.get('sytm_layout');
201
- if (!layout)
202
- return [];
203
- const selections = [];
204
- const getBool = (path) => Boolean(this.themeForm.get(path)?.value);
205
- if (getBool('sytm_layout.sytm_layout_sidebar.status'))
206
- selections.push('sidebar');
207
- if (getBool('sytm_layout.sytm_layout_header.status'))
208
- selections.push('header');
209
- if (getBool('sytm_layout.sytm_layout_footer.status'))
210
- selections.push('footer');
211
- if (getBool('sytm_layout.sytm_layout_breadcrumb.status'))
212
- selections.push('breadcrumb');
213
- if (getBool('sytm_layout.sytm_layout_console.status'))
214
- selections.push('console');
215
- if (getBool('sytm_layout.sytm_layout_request.status'))
216
- selections.push('request');
217
- return selections;
218
- }
219
- // Update form booleans from multi-select change
220
- onEnabledLayoutChange(values) {
221
- const setBool = (path, val) => this.themeForm.get(path)?.setValue(val);
222
- const selected = new Set(values);
223
- setBool('sytm_layout.sytm_layout_sidebar.status', selected.has('sidebar'));
224
- setBool('sytm_layout.sytm_layout_header.status', selected.has('header'));
225
- setBool('sytm_layout.sytm_layout_footer.status', selected.has('footer'));
226
- setBool('sytm_layout.sytm_layout_breadcrumb.status', selected.has('breadcrumb'));
227
- setBool('sytm_layout.sytm_layout_console.status', selected.has('console'));
228
- setBool('sytm_layout.sytm_layout_request.status', selected.has('request'));
229
- }
230
- ngOnInit() {
231
- this.initializeComponent();
232
- }
233
- /**
234
- * Initialize component
235
- */
236
- initializeComponent() {
237
- // Get page information from route
238
- this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => {
239
- console.log('🔍 Query params:', params);
240
- const queryParams = params['query'];
241
- const queryData = generateObjectFromString(queryParams);
242
- this.pageId.set(queryData?.sypg_id || '');
243
- this.pageTitle.set(queryData?.sypg_title || '');
244
- if (this.pageId()) {
245
- this.loadThemes();
246
- this.setupFormSubscriptions();
247
- }
248
- else {
249
- this.error.set('No page ID provided');
250
- }
251
- });
252
- }
253
- /**
254
- * Load themes from API
255
- */
256
- loadThemes() {
257
- this.loading.set(true);
258
- this.error.set(null);
259
- const request = {
260
- sytm_page_id_sypg: this.pageId()
261
- };
262
- this.themeService.getThemeList(request)
263
- .pipe(takeUntilDestroyed(this.destroyRef))
264
- .subscribe({
265
- next: (response) => {
266
- if (response.success) {
267
- this.themes.set(response.data || []);
268
- this.totalItems.set(response.total || 0);
269
- this.updateGridData();
270
- }
271
- else {
272
- this.error.set(response.message || 'Failed to load themes');
273
- }
274
- this.loading.set(false);
275
- },
276
- error: (error) => {
277
- console.error('Error loading themes:', error);
278
- this.error.set('Failed to load themes. Please try again.');
279
- this.loading.set(false);
280
- }
281
- });
282
- }
283
- /**
284
- * Setup form subscriptions
285
- */
286
- setupFormSubscriptions() {
287
- // Watch for form changes to enable/disable save button
288
- this.themeForm.valueChanges
289
- .pipe(takeUntilDestroyed(this.destroyRef))
290
- .subscribe(() => {
291
- // Form validation is handled by computed signals
292
- });
293
- }
294
- /**
295
- * Update grid data
296
- */
297
- updateGridData() {
298
- this.gridConfig.update(config => ({
299
- ...config,
300
- data: this.themes()
301
- }));
302
- }
303
- /**
304
- * Get custom renderers for grid
305
- */
306
- /**
307
- * Get template renderers for grid
308
- */
309
- getTemplateRenderers() {
310
- return {
311
- themeDetailsRenderer: this.themeDetailsRendererTemplate(),
312
- themeStatusRenderer: this.themeStatusRendererTemplate(),
313
- actionsDropdownRenderer: this.actionsDropdownRendererTemplate()
314
- };
315
- }
316
- /**
317
- * Handle grid events
318
- */
319
- onGridEvent(event) {
320
- switch (event.type) {
321
- case 'pageChange':
322
- if (event.data && typeof event.data === 'object' && 'pageIndex' in event.data && 'pageSize' in event.data) {
323
- this.currentPage.set(event.data['pageIndex']);
324
- this.pageSize.set(event.data['pageSize']);
325
- this.loadThemes();
326
- }
327
- break;
328
- case 'search':
329
- if (event.data && typeof event.data === 'string') {
330
- this.searchTerm.set(event.data);
331
- this.currentPage.set(1);
332
- this.loadThemes();
333
- }
334
- break;
335
- case 'refresh':
336
- this.loadThemes();
337
- break;
338
- case 'action':
339
- // Handle action events if needed
340
- console.log('Action event:', event);
341
- break;
342
- case 'rowClick':
343
- // Handle row click events if needed
344
- console.log('Row click event:', event);
345
- break;
346
- case 'sort':
347
- // Handle sort events if needed
348
- console.log('Sort event:', event);
349
- break;
350
- case 'export':
351
- // Handle export events if needed
352
- console.log('Export event:', event);
353
- break;
354
- case 'rowReorder':
355
- // Handle row reorder events if needed
356
- console.log('Row reorder event:', event);
357
- break;
358
- }
359
- }
360
- /**
361
- * Create new theme
362
- */
363
- createTheme() {
364
- if (!this.themeForm.valid) {
365
- this.markFormAsTouched();
366
- return;
367
- }
368
- const formValue = this.themeForm.getRawValue();
369
- const newTheme = {
370
- sytm_title: formValue.sytm_title,
371
- sytm_desc: formValue.sytm_desc,
372
- sytm_theme_code: formValue.sytm_theme_code,
373
- sytm_preview_id_fm: formValue.sytm_preview_id_fm,
374
- sytm_page_id_sypg: this.pageId(),
375
- sytm_configuration: JSON.parse(formValue.sytm_configuration),
376
- sytm_sub_title: formValue.sytm_sub_title,
377
- sytm_entity_id_syen: formValue.sytm_entity_id_syen || this.appState.getActiveEntityId(),
378
- sytm_isselected: Boolean(formValue.sytm_isselected),
379
- sytm_layout: {
380
- sytm_layout_sidebar: { status: Boolean(formValue.sytm_layout.sytm_layout_sidebar.status) },
381
- sytm_layout_header: { status: Boolean(formValue.sytm_layout.sytm_layout_header.status) },
382
- sytm_layout_footer: { status: Boolean(formValue.sytm_layout.sytm_layout_footer.status) },
383
- sytm_layout_breadcrumb: { status: Boolean(formValue.sytm_layout.sytm_layout_breadcrumb.status) },
384
- sytm_layout_console: { status: Boolean(formValue.sytm_layout.sytm_layout_console.status) },
385
- sytm_layout_request: { status: Boolean(formValue.sytm_layout.sytm_layout_request.status) },
386
- sytm_layout_drawer: formValue.sytm_layout.sytm_layout_drawer
387
- },
388
- sytm_isactive: formValue.sytm_isactive
389
- };
390
- this.loading.set(true);
391
- this.themeService.createTheme(newTheme)
392
- .pipe(takeUntilDestroyed(this.destroyRef))
393
- .subscribe({
394
- next: (response) => {
395
- if (response.success) {
396
- this.resetForm();
397
- this.loadThemes();
398
- console.log('✅ Theme created successfully');
399
- }
400
- else {
401
- console.error('❌ Failed to create theme:', response.message);
402
- }
403
- this.loading.set(false);
404
- },
405
- error: (error) => {
406
- console.error('Error creating theme:', error);
407
- console.error('❌ Failed to create theme. Please try again.');
408
- this.loading.set(false);
409
- }
410
- });
411
- }
412
- /**
413
- * Update existing theme
414
- */
415
- updateTheme() {
416
- if (!this.themeForm.valid || !this.editingThemeId()) {
417
- this.markFormAsTouched();
418
- return;
419
- }
420
- const formValue = this.themeForm.getRawValue();
421
- const updatedTheme = {
422
- _id: this.editingThemeId() || '',
423
- sytm_title: formValue.sytm_title,
424
- sytm_desc: formValue.sytm_desc,
425
- sytm_theme_code: formValue.sytm_theme_code,
426
- sytm_preview_id_fm: formValue.sytm_preview_id_fm,
427
- sytm_page_id_sypg: this.pageId(),
428
- sytm_configuration: JSON.parse(formValue.sytm_configuration),
429
- sytm_sub_title: formValue.sytm_sub_title,
430
- sytm_entity_id_syen: formValue.sytm_entity_id_syen || this.appState.getActiveEntityId(),
431
- sytm_isselected: Boolean(formValue.sytm_isselected),
432
- sytm_layout: {
433
- sytm_layout_sidebar: { status: Boolean(formValue.sytm_layout.sytm_layout_sidebar.status) },
434
- sytm_layout_header: { status: Boolean(formValue.sytm_layout.sytm_layout_header.status) },
435
- sytm_layout_footer: { status: Boolean(formValue.sytm_layout.sytm_layout_footer.status) },
436
- sytm_layout_breadcrumb: { status: Boolean(formValue.sytm_layout.sytm_layout_breadcrumb.status) },
437
- sytm_layout_console: { status: Boolean(formValue.sytm_layout.sytm_layout_console.status) },
438
- sytm_layout_request: { status: Boolean(formValue.sytm_layout.sytm_layout_request.status) },
439
- sytm_layout_drawer: formValue.sytm_layout.sytm_layout_drawer
440
- },
441
- sytm_isactive: formValue.sytm_isactive
442
- };
443
- this.loading.set(true);
444
- this.themeService.updateTheme(updatedTheme)
445
- .pipe(takeUntilDestroyed(this.destroyRef))
446
- .subscribe({
447
- next: (response) => {
448
- if (response.success) {
449
- this.resetForm();
450
- this.loadThemes();
451
- console.log('✅ Theme updated successfully');
452
- }
453
- else {
454
- console.error('❌ Failed to update theme:', response.message);
455
- }
456
- this.loading.set(false);
457
- },
458
- error: (error) => {
459
- console.error('Error updating theme:', error);
460
- console.error('❌ Failed to update theme. Please try again.');
461
- this.loading.set(false);
462
- }
463
- });
464
- }
465
- /**
466
- * Edit theme
467
- */
468
- editTheme(theme) {
469
- this.isEditMode.set(true);
470
- this.editingThemeId.set(theme._id || null);
471
- this.retrievedTheme.set(theme);
472
- this.themeForm.patchValue({
473
- sytm_title: theme.sytm_title || '',
474
- sytm_desc: theme.sytm_desc || '',
475
- sytm_theme_code: theme.sytm_theme_code || '',
476
- sytm_preview_id_fm: theme.sytm_preview_id_fm || '',
477
- sytm_sub_title: theme.sytm_sub_title || '',
478
- sytm_configuration: JSON.stringify(theme.sytm_configuration || {}, null, 2),
479
- sytm_entity_id_syen: theme.sytm_entity_id_syen || this.appState.getActiveEntityId(),
480
- sytm_isselected: theme.sytm_isselected ?? false,
481
- sytm_layout: {
482
- sytm_layout_sidebar: { status: theme.sytm_layout?.sytm_layout_sidebar?.status ?? true },
483
- sytm_layout_header: { status: theme.sytm_layout?.sytm_layout_header?.status ?? true },
484
- sytm_layout_footer: { status: theme.sytm_layout?.sytm_layout_footer?.status ?? false },
485
- sytm_layout_breadcrumb: { status: theme.sytm_layout?.sytm_layout_breadcrumb?.status ?? true },
486
- sytm_layout_console: { status: theme.sytm_layout?.sytm_layout_console?.status ?? false },
487
- sytm_layout_request: { status: theme.sytm_layout?.sytm_layout_request?.status ?? false },
488
- sytm_layout_drawer: theme.sytm_layout?.sytm_layout_drawer || []
489
- },
490
- sytm_isactive: theme.sytm_isactive ?? true
491
- });
492
- // Rebuild drawer array controls from data
493
- while (this.drawerArray.length) {
494
- this.drawerArray.removeAt(0);
495
- }
496
- (theme.sytm_layout?.sytm_layout_drawer || []).forEach(d => {
497
- this.drawerArray.push(this.createDrawerGroup({
498
- syth_status: d?.syth_status ?? true,
499
- syth_config_syco_for: d?.syth_config_syco_for ?? 'drawer_notes'
500
- }));
501
- });
502
- this.themeForm.markAsPristine();
503
- }
504
- /**
505
- * Delete theme
506
- */
507
- deleteTheme(theme) {
508
- if (confirm(`Are you sure you want to delete the theme "${theme.sytm_title}"?`)) {
509
- this.loading.set(true);
510
- this.themeService.deleteTheme(theme._id || '')
511
- .pipe(takeUntilDestroyed(this.destroyRef))
512
- .subscribe({
513
- next: (response) => {
514
- if (response.success) {
515
- this.loadThemes();
516
- console.log('✅ Theme deleted successfully');
517
- }
518
- else {
519
- console.error('❌ Failed to delete theme:', response.message);
520
- }
521
- this.loading.set(false);
522
- },
523
- error: (error) => {
524
- console.error('Error deleting theme:', error);
525
- console.error('❌ Failed to delete theme. Please try again.');
526
- this.loading.set(false);
527
- }
528
- });
529
- }
530
- }
531
- /**
532
- * Toggle theme status
533
- */
534
- toggleThemeStatus(theme) {
535
- this.loading.set(true);
536
- this.themeService.toggleThemeStatus({ sytm_id: theme._id || '', sytm_isactive: !theme.sytm_isactive })
537
- .pipe(takeUntilDestroyed(this.destroyRef))
538
- .subscribe({
539
- next: (response) => {
540
- if (response.success) {
541
- this.loadThemes();
542
- console.log(`✅ Theme ${theme.sytm_isactive ? 'deactivated' : 'activated'} successfully`);
543
- }
544
- else {
545
- console.error('❌ Failed to toggle theme status:', response.message);
546
- }
547
- this.loading.set(false);
548
- },
549
- error: (error) => {
550
- console.error('Error toggling theme status:', error);
551
- console.error('❌ Failed to toggle theme status. Please try again.');
552
- this.loading.set(false);
553
- }
554
- });
555
- }
556
- /**
557
- * Save theme (create or update)
558
- */
559
- saveTheme() {
560
- if (this.isEditMode()) {
561
- this.updateTheme();
562
- }
563
- else {
564
- this.createTheme();
565
- }
566
- }
567
- /**
568
- * Cancel form
569
- */
570
- cancelForm() {
571
- this.resetForm();
572
- }
573
- /**
574
- * Go back to page list
575
- */
576
- goBack() {
577
- this.router.navigate(['/core/page']);
578
- }
579
- /**
580
- * Reset form
581
- */
582
- resetForm() {
583
- this.themeForm.reset({
584
- sytm_title: '',
585
- sytm_desc: '',
586
- sytm_theme_code: '',
587
- sytm_preview_id_fm: '',
588
- sytm_sub_title: '',
589
- sytm_configuration: '{}',
590
- sytm_entity_id_syen: '',
591
- sytm_isselected: false,
592
- sytm_layout: {
593
- sytm_layout_sidebar: { status: true },
594
- sytm_layout_header: { status: true },
595
- sytm_layout_footer: { status: false },
596
- sytm_layout_breadcrumb: { status: true },
597
- sytm_layout_console: { status: false },
598
- sytm_layout_request: { status: false },
599
- sytm_layout_drawer: []
600
- },
601
- sytm_isactive: true
602
- });
603
- // Explicitly clear the FormArray for drawers
604
- while (this.drawerArray.length) {
605
- this.drawerArray.removeAt(0);
606
- }
607
- this.isEditMode.set(false);
608
- this.editingThemeId.set(null);
609
- this.retrievedTheme.set(null);
610
- this.themeForm.markAsPristine();
611
- this.themeForm.markAsUntouched();
612
- }
613
- /**
614
- * Mark form as touched to trigger validation display
615
- */
616
- markFormAsTouched() {
617
- Object.keys(this.themeForm.controls).forEach(key => {
618
- const control = this.themeForm.get(key);
619
- control?.markAsTouched();
620
- });
621
- }
622
- /**
623
- * Get dropdown items for actions
624
- */
625
- getActionDropdownItems(theme) {
626
- return [
627
- {
628
- id: 'edit',
629
- label: 'Edit',
630
- icon: 'edit',
631
- disabled: false
632
- },
633
- {
634
- id: 'toggle',
635
- label: theme.sytm_isactive ? 'Deactivate' : 'Activate',
636
- icon: theme.sytm_isactive ? 'block' : 'check_circle',
637
- disabled: false
638
- },
639
- {
640
- id: 'delete',
641
- label: 'Delete',
642
- icon: 'delete',
643
- disabled: false
644
- }
645
- ];
646
- }
647
- /**
648
- * Handle dropdown item click
649
- * This method handles clicks on dropdown menu items in the actions column
650
- */
651
- onDropdownItemClick(item, row) {
652
- console.log('🔵 onDropdownItemClick called with:', item, row);
653
- switch (item.id) {
654
- case 'edit':
655
- console.log('🔵 Calling editTheme with:', row);
656
- this.editTheme(row);
657
- break;
658
- case 'toggle':
659
- console.log('🔵 Calling toggleThemeStatus with:', row);
660
- this.toggleThemeStatus(row);
661
- break;
662
- case 'delete':
663
- console.log('🔵 Calling deleteTheme with:', row);
664
- this.deleteTheme(row);
665
- break;
666
- default:
667
- console.log('🔵 Unknown action:', item.id);
668
- }
669
- // Close all dropdowns after action
670
- this.closeAllDropdowns();
671
- }
672
- /**
673
- * Close all dropdowns
674
- */
675
- closeAllDropdowns() {
676
- // Close all dropdowns by clicking outside
677
- const event = new MouseEvent('click', { bubbles: true });
678
- document.dispatchEvent(event);
679
- }
680
- get drawerArray() {
681
- return this.themeForm.get('sytm_layout.sytm_layout_drawer');
682
- }
683
- createDrawerGroup(drawer) {
684
- return this.fb.group({
685
- syth_status: [drawer?.syth_status ?? true],
686
- syth_config_syco_for: [drawer?.syth_config_syco_for ?? 'drawer_notes']
687
- });
688
- }
689
- addDrawer() {
690
- this.drawerArray.push(this.createDrawerGroup());
691
- this.themeForm.markAsDirty();
692
- }
693
- removeDrawer(index) {
694
- if (index >= 0 && index < this.drawerArray.length) {
695
- this.drawerArray.removeAt(index);
696
- this.themeForm.markAsDirty();
697
- }
698
- }
699
- /**
700
- * Set selected theme (only one can be selected per page)
701
- */
702
- setSelectedTheme(theme) {
703
- if (!theme || theme.sytm_isselected)
704
- return; // already selected
705
- const previouslySelected = this.themes().find(t => t.sytm_isselected && t._id !== theme._id);
706
- // Disable previous selection (best-effort)
707
- if (previouslySelected) {
708
- const disablePayload = {
709
- _id: previouslySelected._id || '',
710
- sytm_title: previouslySelected.sytm_title || '',
711
- sytm_desc: previouslySelected.sytm_desc || '',
712
- sytm_theme_code: previouslySelected.sytm_theme_code || '',
713
- sytm_preview_id_fm: previouslySelected.sytm_preview_id_fm || '',
714
- sytm_page_id_sypg: this.pageId(),
715
- sytm_configuration: previouslySelected.sytm_configuration || {},
716
- sytm_sub_title: previouslySelected.sytm_sub_title || '',
717
- sytm_entity_id_syen: previouslySelected.sytm_entity_id_syen || this.appState.getActiveEntityId(),
718
- sytm_isselected: false,
719
- sytm_layout: previouslySelected.sytm_layout,
720
- sytm_isactive: previouslySelected.sytm_isactive ?? true
721
- };
722
- this.themeService.updateTheme(disablePayload).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({ next: () => { }, error: () => { } });
723
- }
724
- // Enable current selection
725
- const enablePayload = {
726
- _id: theme._id || '',
727
- sytm_title: theme.sytm_title || '',
728
- sytm_desc: theme.sytm_desc || '',
729
- sytm_theme_code: theme.sytm_theme_code || '',
730
- sytm_preview_id_fm: theme.sytm_preview_id_fm || '',
731
- sytm_page_id_sypg: this.pageId(),
732
- sytm_configuration: theme.sytm_configuration || {},
733
- sytm_sub_title: theme.sytm_sub_title || '',
734
- sytm_entity_id_syen: theme.sytm_entity_id_syen || this.appState.getActiveEntityId(),
735
- sytm_isselected: true,
736
- sytm_layout: theme.sytm_layout,
737
- sytm_isactive: theme.sytm_isactive ?? true
738
- };
739
- this.loading.set(true);
740
- this.themeService.updateTheme(enablePayload)
741
- .pipe(takeUntilDestroyed(this.destroyRef))
742
- .subscribe({
743
- next: () => { this.loadThemes(); this.loading.set(false); },
744
- error: () => { this.loading.set(false); }
745
- });
746
- }
747
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PageThemeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
748
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: PageThemeComponent, isStandalone: true, selector: "cide-core-app-page-theme", viewQueries: [{ propertyName: "themeDetailsRendererTemplate", first: true, predicate: ["themeDetailsRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "themeStatusRendererTemplate", first: true, predicate: ["themeStatusRendererTemplate"], descendants: true, isSignal: true }, { propertyName: "actionsDropdownRendererTemplate", first: true, predicate: ["actionsDropdownRendererTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Page Theme Container -->\r\n<div class=\"tw-flex tw-h-full tw-w-full\">\r\n \r\n <!-- Left: Form and header (60%) -->\r\n <div class=\"tw-w-full lg:tw-w-3/5 tw-flex tw-flex-col tw-border-r tw-border-gray-200\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n\r\n <!-- Title and Back Button -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-4\">\r\n <button cideEleButton variant=\"ghost\" size=\"sm\" (click)=\"goBack()\" class=\"tw-text-gray-600 hover:tw-text-gray-900\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">arrow_back</cide-ele-icon>\r\n </button>\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">palette</cide-ele-icon>\r\n <div>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Theme Management</h5>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-m-0\">Page: {{ pageTitle() }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n @if (error()) {\r\n <div class=\"tw-mt-4 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-md\">\r\n <div class=\"tw-flex tw-items-start\">\r\n <cide-ele-icon name=\"error\" class=\"tw-text-red-400 tw-w-5 tw-h-5 tw-mt-0.5 tw-flex-shrink-0\"></cide-ele-icon>\r\n <div class=\"tw-ml-3\">\r\n <h3 class=\"tw-text-sm tw-font-medium tw-text-red-800 tw-m-0\">Error</h3>\r\n <p class=\"tw-text-sm tw-text-red-700 tw-mt-1 tw-m-0\">{{ error() }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Quick Add/Edit Form Section -->\r\n <div class=\"tw-px-6 tw-py-4 tw-bg-white tw-overflow-auto\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">{{ isEditMode() ? 'edit' : 'add' }}</cide-ele-icon>\r\n <h6 class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-m-0\">{{ isEditMode() ? 'Edit Theme' : 'Quick Add Theme' }}</h6>\r\n </div>\r\n </div>\r\n\r\n <!-- Form (kept as-is) -->\r\n <form [formGroup]=\"themeForm\" (ngSubmit)=\"saveTheme()\" class=\"tw-space-y-4\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 lg:tw-grid-cols-3 tw-gap-4\">\r\n <!-- Theme Title -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_title\" formControlName=\"sytm_title\" placeholder=\"Enter theme title\" label=\"Theme Title*\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Theme Code -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_theme_code\" formControlName=\"sytm_theme_code\" placeholder=\"Enter theme code\" label=\"Theme Code*\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Status -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input\r\n id=\"sytm_isactive_cb\"\r\n type=\"checkbox\"\r\n label=\"Active\"\r\n size=\"sm\"\r\n formControlName=\"sytm_isactive\">\r\n </cide-ele-input>\r\n </div>\r\n <!-- Sub Title -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_sub_title\" formControlName=\"sytm_sub_title\" placeholder=\"Enter sub title\" label=\"Sub Title\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Preview ID -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_preview_id_fm\" formControlName=\"sytm_preview_id_fm\" placeholder=\"Enter preview image ID\" label=\"Preview Image ID\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Description -->\r\n <div class=\"tw-space-y-2 md:tw-col-span-2\">\r\n <cide-ele-textarea id=\"sytm_desc\" formControlName=\"sytm_desc\" placeholder=\"Enter theme description\" rows=\"2\" label=\"Description\" size=\"sm\"></cide-ele-textarea>\r\n </div>\r\n <!-- Configuration JSON -->\r\n <div class=\"tw-space-y-2 md:tw-col-span-3\">\r\n <cide-ele-json-editor label=\"Configuration JSON\" formControlName=\"sytm_configuration\" [required]=\"true\" [config]=\"{\r\n showLineNumbers: true,\r\n autoFormat: true,\r\n validateOnChange: true,\r\n minHeight: 150,\r\n maxHeight: 300,\r\n placeholder: 'Enter theme configuration JSON...'\r\n }\" helperText=\"Enter valid JSON configuration for the theme\"></cide-ele-json-editor>\r\n </div>\r\n <!-- Layout Configuration + Selection: right-side checkbox list -->\r\n <div class=\"lg:tw-col-span-1 tw-space-y-2\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Layout & Selection</div>\r\n <!-- Selected toggle -->\r\n <div class=\"tw-bg-white tw-border tw-border-gray-200 tw-rounded-md tw-px-3 tw-py-2\">\r\n <cide-ele-input\r\n id=\"sytm_isselected\"\r\n type=\"checkbox\"\r\n label=\"Selected (Default)\"\r\n size=\"sm\"\r\n formControlName=\"sytm_isselected\">\r\n </cide-ele-input>\r\n </div>\r\n <div formGroupName=\"sytm_layout\" class=\"tw-bg-white tw-border tw-border-gray-200 tw-rounded-md tw-divide-y tw-overflow-hidden\">\r\n <!-- Sidebar -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_sidebar\">\r\n <cide-ele-input id=\"layout_sidebar_status\" type=\"checkbox\" label=\"Sidebar\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Header -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_header\">\r\n <cide-ele-input id=\"layout_header_status\" type=\"checkbox\" label=\"Header\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Footer -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_footer\">\r\n <cide-ele-input id=\"layout_footer_status\" type=\"checkbox\" label=\"Footer\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Breadcrumb -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_breadcrumb\">\r\n <cide-ele-input id=\"layout_breadcrumb_status\" type=\"checkbox\" label=\"Breadcrumb\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Console -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_console\">\r\n <cide-ele-input id=\"layout_console_status\" type=\"checkbox\" label=\"Console\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Request -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_request\">\r\n <cide-ele-input id=\"layout_request_status\" type=\"checkbox\" label=\"Request\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n </div>\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-pt-1\">Toggle active sections. Only one theme can be selected as default. More options can be added here later.</p>\r\n </div>\r\n <!-- Drawer Configuration -->\r\n <div class=\"tw-space-y-2 md:tw-col-span-3\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Drawers</div>\r\n <button cideEleButton type=\"button\" size=\"xs\" variant=\"outline\" (click)=\"addDrawer()\">\r\n Add Drawer\r\n </button>\r\n </div>\r\n\r\n <div formGroupName=\"sytm_layout\">\r\n <div class=\"tw-space-y-2\" formArrayName=\"sytm_layout_drawer\">\r\n <div *ngFor=\"let drawerGrp of drawerArray.controls; let i = index\" [formGroupName]=\"i\" class=\"tw-border tw-border-gray-200 tw-rounded-md tw-p-3 tw-flex tw-items-center tw-gap-3\">\r\n <cide-ele-input id=\"drawer_active_{{i}}\" type=\"checkbox\" label=\"Active\" size=\"sm\" formControlName=\"syth_status\"></cide-ele-input>\r\n <div class=\"tw-flex-1\">\r\n <cide-ele-select\r\n id=\"drawer_config_{{i}}\"\r\n label=\"Drawer For\"\r\n size=\"sm\"\r\n [options]=\"drawerConfigOptions\"\r\n formControlName=\"syth_config_syco_for\">\r\n </cide-ele-select>\r\n </div>\r\n <button cideEleButton type=\"button\" size=\"xs\" variant=\"ghost\" (click)=\"removeDrawer(i)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">delete</cide-ele-icon>\r\n </button>\r\n </div>\r\n <p class=\"tw-text-xs tw-text-gray-500\">Configure multiple drawers as needed.</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Form Actions -->\r\n <div class=\"tw-flex tw-flex-col tw-gap-2 tw-pt-4 tw-border-t tw-border-gray-200\">\r\n <div class=\"tw-flex tw-items-center tw-justify-end tw-space-x-3\">\r\n <button cideEleButton type=\"button\" variant=\"outline\" (click)=\"cancelForm()\" [disabled]=\"loading()\">Cancel</button>\r\n <button cideEleButton type=\"submit\" variant=\"primary\" leftIcon=\"add\" [disabled]=\"!themeForm.valid || loading()\" [loading]=\"loading()\">\r\n {{ isEditMode() ? 'Update Theme' : 'Create Theme' }}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Right: Theme gallery (40%) -->\r\n <div class=\"tw-hidden lg:tw-flex tw-w-2/5 tw-flex-col\">\r\n <!-- (Header consolidated above) -->\r\n\r\n <!-- Gallery list -->\r\n <div class=\"tw-flex-1 tw-overflow-auto tw-bg-gray-50\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3 tw-p-4\">\r\n @for (theme of filteredThemes(); track theme._id) {\r\n <div class=\"tw-rounded-md tw-transition tw-cursor-pointer tw-relative\"\r\n [ngClass]=\"theme.sytm_isselected\r\n ? 'tw-border tw-border-blue-500 tw-ring-2 tw-ring-blue-200 tw-bg-blue-50/50'\r\n : 'tw-bg-white tw-border tw-border-gray-200 hover:tw-shadow-sm'\"\r\n (click)=\"editTheme(theme)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-selected]=\"theme.sytm_isselected ? 'true' : 'false'\"\r\n [attr.aria-label]=\"'Edit theme ' + (theme.sytm_title || theme.sytm_theme_code)\"\r\n (keydown.enter)=\"editTheme(theme)\"\r\n (keydown.space)=\"$event.preventDefault(); editTheme(theme)\">\r\n\r\n <!-- Selected badge -->\r\n <div *ngIf=\"theme.sytm_isselected\"\r\n class=\"tw-absolute tw-top-2 tw-right-2 tw-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-full tw-bg-blue-600 tw-text-white\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">check</cide-ele-icon>\r\n </div>\r\n \r\n <div class=\"tw-aspect-[16/9] tw-bg-gray-100 tw-rounded-t-md tw-overflow-hidden tw-flex tw-items-center tw-justify-center\">\r\n @if (getPreviewUrl(theme)) {\r\n <img [src]=\"getPreviewUrl(theme)\" class=\"tw-w-full tw-h-full tw-object-cover\" alt=\"Preview\" />\r\n } @else {\r\n <div class=\"tw-text-gray-400 tw-text-xs\">No preview</div>\r\n }\r\n </div>\r\n <div class=\"tw-p-3 tw-space-y-1\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\" [title]=\"theme.sytm_title\">{{ theme.sytm_title || 'Untitled Theme' }}</div>\r\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate\" [title]=\"theme.sytm_theme_code\">{{ theme.sytm_theme_code }}</div>\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-pt-1\">\r\n <span class=\"tw-inline-flex tw-items-center tw-gap-1 tw-text-xs\" [ngClass]=\"theme.sytm_isactive ? 'tw-text-green-700' : 'tw-text-red-700'\">\r\n <span class=\"tw-w-1.5 tw-h-1.5 tw-rounded-full\" [ngClass]=\"theme.sytm_isactive ? 'tw-bg-green-500' : 'tw-bg-red-500'\"></span>\r\n {{ theme.sytm_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n <div class=\"tw-flex tw-items-center tw-gap-1\">\r\n <!-- Set Selected Button - Clear and Simple -->\r\n @if (theme.sytm_isselected) {\r\n <span class=\"tw-inline-flex tw-items-center tw-gap-1 tw-px-2 tw-py-1 tw-bg-green-100 tw-text-green-800 tw-rounded-md tw-text-xs tw-font-medium\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3\">check</cide-ele-icon>\r\n Selected\r\n </span>\r\n } @else {\r\n <button cideEleButton \r\n variant=\"outline\" \r\n size=\"xs\"\r\n (click)=\"$event.stopPropagation(); setSelectedTheme(theme)\"\r\n [attr.aria-label]=\"'Select ' + (theme.sytm_title || theme.sytm_theme_code) + ' theme'\"\r\n class=\"tw-text-xs\">\r\n Select\r\n </button>\r\n }\r\n <button cideEleButton variant=\"ghost\" size=\"xs\" (click)=\"$event.stopPropagation(); editTheme(theme)\"\r\n [attr.aria-label]=\"'Edit theme ' + (theme.sytm_title || theme.sytm_theme_code)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">edit</cide-ele-icon>\r\n </button>\r\n <button cideEleButton variant=\"ghost\" size=\"xs\" (click)=\"$event.stopPropagation(); deleteTheme(theme)\"\r\n [attr.aria-label]=\"'Delete theme ' + (theme.sytm_title || theme.sytm_theme_code)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">delete</cide-ele-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (!loading() && filteredThemes().length === 0) {\r\n <div class=\"tw-col-span-full tw-text-center tw-text-xs tw-text-gray-500 tw-py-8\">No themes found</div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- \r\n Angular Template References for Grid Renderers (Best Practice)\r\n \r\n These ng-template elements represent the Angular best practice for custom rendering.\r\n They provide:\r\n - Type safety with template context\r\n - Component lifecycle integration\r\n - Change detection optimization\r\n - Proper event handling\r\n - Accessibility features\r\n \r\n Note: Current data grid uses string renderers for compatibility.\r\n Templates are maintained for future component enhancement.\r\n-->\r\n\r\n<!-- Theme Details Renderer Template -->\r\n<ng-template #themeDetailsRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <div class=\"tw-flex tw-items-center tw-min-w-0\">\r\n <!-- Theme Icon -->\r\n <div class=\"tw-flex-shrink-0\">\r\n <cide-ele-icon \r\n class=\"tw-text-purple-600\" \r\n size=\"xs\">\r\n palette\r\n </cide-ele-icon>\r\n </div>\r\n \r\n <!-- Theme Details -->\r\n <div class=\"tw-ml-3 tw-min-w-0 tw-flex-1\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\" \r\n [title]=\"row.sytm_title\">\r\n {{ row.sytm_title || 'Untitled' }}\r\n </div>\r\n @if (row.sytm_desc) {\r\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate\" \r\n [title]=\"row.sytm_desc\">\r\n {{ row.sytm_desc }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Theme Status Renderer Template -->\r\n<ng-template #themeStatusRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-whitespace-nowrap\"\r\n [ngClass]=\"row.sytm_isactive ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\r\n {{ row.sytm_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n</ng-template>\r\n\r\n<!-- Actions Dropdown Renderer Template -->\r\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <cide-ele-dropdown \r\n [items]=\"getActionDropdownItems(row)\"\r\n [config]=\"{ triggerIcon: 'more_vert', triggerSize: 'sm' }\"\r\n (itemClick)=\"onDropdownItemClick($event, row)\">\r\n </cide-ele-dropdown>\r\n</ng-template> ", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideInputComponent, selector: "cide-ele-input", inputs: ["fill", "label", "labelHide", "disabled", "clearInput", "labelPlacement", "labelDir", "placeholder", "leadingIcon", "trailingIcon", "helperText", "helperTextCollapse", "hideHelperAndErrorText", "errorText", "maxlength", "minlength", "required", "autocapitalize", "autocomplete", "type", "width", "id", "ngModel", "option", "min", "max", "size"], outputs: ["ngModelChange"] }, { kind: "component", type: CideSelectComponent, selector: "cide-ele-select", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput", "options", "multiple", "searchable", "showSearchInput", "loading"], outputs: ["ngModelChange", "change", "searchChange"] }, { kind: "component", type: CideTextareaComponent, selector: "cide-ele-textarea", inputs: ["label", "labelHide", "placeholder", "helperText", "errorText", "required", "disabled", "minlength", "maxlength", "rows", "id", "ngModel", "size", "fill", "labelPlacement", "labelDir", "leadingIcon", "trailingIcon", "clearInput"], outputs: ["ngModelChange"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideEleDropdownComponent, selector: "cide-ele-dropdown", inputs: ["items", "config", "triggerTemplate", "menuTemplate"], outputs: ["itemClick", "dropdownToggle"] }, { kind: "component", type: CideEleJsonEditorComponent, selector: "cide-ele-json-editor", inputs: ["label", "helperText", "required", "disabled", "showCharacterCount", "config"], outputs: ["valueChange", "objectChange", "errorsChange", "validChange"] }] }); }
749
- }
750
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: PageThemeComponent, decorators: [{
751
- type: Component,
752
- args: [{ selector: 'cide-core-app-page-theme', standalone: true, imports: [
753
- CommonModule,
754
- ReactiveFormsModule,
755
- FormsModule,
756
- CideEleDataGridComponent,
757
- CideEleButtonComponent,
758
- CideInputComponent,
759
- CideSelectComponent,
760
- CideTextareaComponent,
761
- CideIconComponent,
762
- CideEleDropdownComponent,
763
- CideEleJsonEditorComponent,
764
- CideSelectOptionComponent
765
- ], template: "<!-- Page Theme Container -->\r\n<div class=\"tw-flex tw-h-full tw-w-full\">\r\n \r\n <!-- Left: Form and header (60%) -->\r\n <div class=\"tw-w-full lg:tw-w-3/5 tw-flex tw-flex-col tw-border-r tw-border-gray-200\">\r\n\r\n <!-- Header Section -->\r\n <div class=\"tw-px-6 tw-py-3 tw-border-b tw-border-gray-200 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-3 sm:tw-space-y-0\">\r\n\r\n <!-- Title and Back Button -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-4\">\r\n <button cideEleButton variant=\"ghost\" size=\"sm\" (click)=\"goBack()\" class=\"tw-text-gray-600 hover:tw-text-gray-900\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">arrow_back</cide-ele-icon>\r\n </button>\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">palette</cide-ele-icon>\r\n <div>\r\n <h5 class=\"tw-text-base tw-font-medium tw-text-gray-900 tw-m-0\">Theme Management</h5>\r\n <p class=\"tw-text-sm tw-text-gray-500 tw-m-0\">Page: {{ pageTitle() }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Error Message -->\r\n @if (error()) {\r\n <div class=\"tw-mt-4 tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded-md\">\r\n <div class=\"tw-flex tw-items-start\">\r\n <cide-ele-icon name=\"error\" class=\"tw-text-red-400 tw-w-5 tw-h-5 tw-mt-0.5 tw-flex-shrink-0\"></cide-ele-icon>\r\n <div class=\"tw-ml-3\">\r\n <h3 class=\"tw-text-sm tw-font-medium tw-text-red-800 tw-m-0\">Error</h3>\r\n <p class=\"tw-text-sm tw-text-red-700 tw-mt-1 tw-m-0\">{{ error() }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Quick Add/Edit Form Section -->\r\n <div class=\"tw-px-6 tw-py-4 tw-bg-white tw-overflow-auto\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <cide-ele-icon class=\"tw-text-blue-600 tw-w-5 tw-h-5\">{{ isEditMode() ? 'edit' : 'add' }}</cide-ele-icon>\r\n <h6 class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-m-0\">{{ isEditMode() ? 'Edit Theme' : 'Quick Add Theme' }}</h6>\r\n </div>\r\n </div>\r\n\r\n <!-- Form (kept as-is) -->\r\n <form [formGroup]=\"themeForm\" (ngSubmit)=\"saveTheme()\" class=\"tw-space-y-4\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 lg:tw-grid-cols-3 tw-gap-4\">\r\n <!-- Theme Title -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_title\" formControlName=\"sytm_title\" placeholder=\"Enter theme title\" label=\"Theme Title*\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Theme Code -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_theme_code\" formControlName=\"sytm_theme_code\" placeholder=\"Enter theme code\" label=\"Theme Code*\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Status -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input\r\n id=\"sytm_isactive_cb\"\r\n type=\"checkbox\"\r\n label=\"Active\"\r\n size=\"sm\"\r\n formControlName=\"sytm_isactive\">\r\n </cide-ele-input>\r\n </div>\r\n <!-- Sub Title -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_sub_title\" formControlName=\"sytm_sub_title\" placeholder=\"Enter sub title\" label=\"Sub Title\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Preview ID -->\r\n <div class=\"tw-space-y-2\">\r\n <cide-ele-input id=\"sytm_preview_id_fm\" formControlName=\"sytm_preview_id_fm\" placeholder=\"Enter preview image ID\" label=\"Preview Image ID\" size=\"sm\"></cide-ele-input>\r\n </div>\r\n <!-- Description -->\r\n <div class=\"tw-space-y-2 md:tw-col-span-2\">\r\n <cide-ele-textarea id=\"sytm_desc\" formControlName=\"sytm_desc\" placeholder=\"Enter theme description\" rows=\"2\" label=\"Description\" size=\"sm\"></cide-ele-textarea>\r\n </div>\r\n <!-- Configuration JSON -->\r\n <div class=\"tw-space-y-2 md:tw-col-span-3\">\r\n <cide-ele-json-editor label=\"Configuration JSON\" formControlName=\"sytm_configuration\" [required]=\"true\" [config]=\"{\r\n showLineNumbers: true,\r\n autoFormat: true,\r\n validateOnChange: true,\r\n minHeight: 150,\r\n maxHeight: 300,\r\n placeholder: 'Enter theme configuration JSON...'\r\n }\" helperText=\"Enter valid JSON configuration for the theme\"></cide-ele-json-editor>\r\n </div>\r\n <!-- Layout Configuration + Selection: right-side checkbox list -->\r\n <div class=\"lg:tw-col-span-1 tw-space-y-2\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Layout & Selection</div>\r\n <!-- Selected toggle -->\r\n <div class=\"tw-bg-white tw-border tw-border-gray-200 tw-rounded-md tw-px-3 tw-py-2\">\r\n <cide-ele-input\r\n id=\"sytm_isselected\"\r\n type=\"checkbox\"\r\n label=\"Selected (Default)\"\r\n size=\"sm\"\r\n formControlName=\"sytm_isselected\">\r\n </cide-ele-input>\r\n </div>\r\n <div formGroupName=\"sytm_layout\" class=\"tw-bg-white tw-border tw-border-gray-200 tw-rounded-md tw-divide-y tw-overflow-hidden\">\r\n <!-- Sidebar -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_sidebar\">\r\n <cide-ele-input id=\"layout_sidebar_status\" type=\"checkbox\" label=\"Sidebar\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Header -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_header\">\r\n <cide-ele-input id=\"layout_header_status\" type=\"checkbox\" label=\"Header\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Footer -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_footer\">\r\n <cide-ele-input id=\"layout_footer_status\" type=\"checkbox\" label=\"Footer\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Breadcrumb -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_breadcrumb\">\r\n <cide-ele-input id=\"layout_breadcrumb_status\" type=\"checkbox\" label=\"Breadcrumb\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Console -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_console\">\r\n <cide-ele-input id=\"layout_console_status\" type=\"checkbox\" label=\"Console\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n <!-- Request -->\r\n <div class=\"tw-px-3 tw-py-2\" formGroupName=\"sytm_layout_request\">\r\n <cide-ele-input id=\"layout_request_status\" type=\"checkbox\" label=\"Request\" size=\"sm\" formControlName=\"status\"></cide-ele-input>\r\n </div>\r\n </div>\r\n <p class=\"tw-text-xs tw-text-gray-500 tw-pt-1\">Toggle active sections. Only one theme can be selected as default. More options can be added here later.</p>\r\n </div>\r\n <!-- Drawer Configuration -->\r\n <div class=\"tw-space-y-2 md:tw-col-span-3\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-700\">Drawers</div>\r\n <button cideEleButton type=\"button\" size=\"xs\" variant=\"outline\" (click)=\"addDrawer()\">\r\n Add Drawer\r\n </button>\r\n </div>\r\n\r\n <div formGroupName=\"sytm_layout\">\r\n <div class=\"tw-space-y-2\" formArrayName=\"sytm_layout_drawer\">\r\n <div *ngFor=\"let drawerGrp of drawerArray.controls; let i = index\" [formGroupName]=\"i\" class=\"tw-border tw-border-gray-200 tw-rounded-md tw-p-3 tw-flex tw-items-center tw-gap-3\">\r\n <cide-ele-input id=\"drawer_active_{{i}}\" type=\"checkbox\" label=\"Active\" size=\"sm\" formControlName=\"syth_status\"></cide-ele-input>\r\n <div class=\"tw-flex-1\">\r\n <cide-ele-select\r\n id=\"drawer_config_{{i}}\"\r\n label=\"Drawer For\"\r\n size=\"sm\"\r\n [options]=\"drawerConfigOptions\"\r\n formControlName=\"syth_config_syco_for\">\r\n </cide-ele-select>\r\n </div>\r\n <button cideEleButton type=\"button\" size=\"xs\" variant=\"ghost\" (click)=\"removeDrawer(i)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">delete</cide-ele-icon>\r\n </button>\r\n </div>\r\n <p class=\"tw-text-xs tw-text-gray-500\">Configure multiple drawers as needed.</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Form Actions -->\r\n <div class=\"tw-flex tw-flex-col tw-gap-2 tw-pt-4 tw-border-t tw-border-gray-200\">\r\n <div class=\"tw-flex tw-items-center tw-justify-end tw-space-x-3\">\r\n <button cideEleButton type=\"button\" variant=\"outline\" (click)=\"cancelForm()\" [disabled]=\"loading()\">Cancel</button>\r\n <button cideEleButton type=\"submit\" variant=\"primary\" leftIcon=\"add\" [disabled]=\"!themeForm.valid || loading()\" [loading]=\"loading()\">\r\n {{ isEditMode() ? 'Update Theme' : 'Create Theme' }}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Right: Theme gallery (40%) -->\r\n <div class=\"tw-hidden lg:tw-flex tw-w-2/5 tw-flex-col\">\r\n <!-- (Header consolidated above) -->\r\n\r\n <!-- Gallery list -->\r\n <div class=\"tw-flex-1 tw-overflow-auto tw-bg-gray-50\">\r\n <div class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 tw-gap-3 tw-p-4\">\r\n @for (theme of filteredThemes(); track theme._id) {\r\n <div class=\"tw-rounded-md tw-transition tw-cursor-pointer tw-relative\"\r\n [ngClass]=\"theme.sytm_isselected\r\n ? 'tw-border tw-border-blue-500 tw-ring-2 tw-ring-blue-200 tw-bg-blue-50/50'\r\n : 'tw-bg-white tw-border tw-border-gray-200 hover:tw-shadow-sm'\"\r\n (click)=\"editTheme(theme)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-selected]=\"theme.sytm_isselected ? 'true' : 'false'\"\r\n [attr.aria-label]=\"'Edit theme ' + (theme.sytm_title || theme.sytm_theme_code)\"\r\n (keydown.enter)=\"editTheme(theme)\"\r\n (keydown.space)=\"$event.preventDefault(); editTheme(theme)\">\r\n\r\n <!-- Selected badge -->\r\n <div *ngIf=\"theme.sytm_isselected\"\r\n class=\"tw-absolute tw-top-2 tw-right-2 tw-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-full tw-bg-blue-600 tw-text-white\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">check</cide-ele-icon>\r\n </div>\r\n \r\n <div class=\"tw-aspect-[16/9] tw-bg-gray-100 tw-rounded-t-md tw-overflow-hidden tw-flex tw-items-center tw-justify-center\">\r\n @if (getPreviewUrl(theme)) {\r\n <img [src]=\"getPreviewUrl(theme)\" class=\"tw-w-full tw-h-full tw-object-cover\" alt=\"Preview\" />\r\n } @else {\r\n <div class=\"tw-text-gray-400 tw-text-xs\">No preview</div>\r\n }\r\n </div>\r\n <div class=\"tw-p-3 tw-space-y-1\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\" [title]=\"theme.sytm_title\">{{ theme.sytm_title || 'Untitled Theme' }}</div>\r\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate\" [title]=\"theme.sytm_theme_code\">{{ theme.sytm_theme_code }}</div>\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-pt-1\">\r\n <span class=\"tw-inline-flex tw-items-center tw-gap-1 tw-text-xs\" [ngClass]=\"theme.sytm_isactive ? 'tw-text-green-700' : 'tw-text-red-700'\">\r\n <span class=\"tw-w-1.5 tw-h-1.5 tw-rounded-full\" [ngClass]=\"theme.sytm_isactive ? 'tw-bg-green-500' : 'tw-bg-red-500'\"></span>\r\n {{ theme.sytm_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n <div class=\"tw-flex tw-items-center tw-gap-1\">\r\n <!-- Set Selected Button - Clear and Simple -->\r\n @if (theme.sytm_isselected) {\r\n <span class=\"tw-inline-flex tw-items-center tw-gap-1 tw-px-2 tw-py-1 tw-bg-green-100 tw-text-green-800 tw-rounded-md tw-text-xs tw-font-medium\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3\">check</cide-ele-icon>\r\n Selected\r\n </span>\r\n } @else {\r\n <button cideEleButton \r\n variant=\"outline\" \r\n size=\"xs\"\r\n (click)=\"$event.stopPropagation(); setSelectedTheme(theme)\"\r\n [attr.aria-label]=\"'Select ' + (theme.sytm_title || theme.sytm_theme_code) + ' theme'\"\r\n class=\"tw-text-xs\">\r\n Select\r\n </button>\r\n }\r\n <button cideEleButton variant=\"ghost\" size=\"xs\" (click)=\"$event.stopPropagation(); editTheme(theme)\"\r\n [attr.aria-label]=\"'Edit theme ' + (theme.sytm_title || theme.sytm_theme_code)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">edit</cide-ele-icon>\r\n </button>\r\n <button cideEleButton variant=\"ghost\" size=\"xs\" (click)=\"$event.stopPropagation(); deleteTheme(theme)\"\r\n [attr.aria-label]=\"'Delete theme ' + (theme.sytm_title || theme.sytm_theme_code)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">delete</cide-ele-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (!loading() && filteredThemes().length === 0) {\r\n <div class=\"tw-col-span-full tw-text-center tw-text-xs tw-text-gray-500 tw-py-8\">No themes found</div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- \r\n Angular Template References for Grid Renderers (Best Practice)\r\n \r\n These ng-template elements represent the Angular best practice for custom rendering.\r\n They provide:\r\n - Type safety with template context\r\n - Component lifecycle integration\r\n - Change detection optimization\r\n - Proper event handling\r\n - Accessibility features\r\n \r\n Note: Current data grid uses string renderers for compatibility.\r\n Templates are maintained for future component enhancement.\r\n-->\r\n\r\n<!-- Theme Details Renderer Template -->\r\n<ng-template #themeDetailsRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <div class=\"tw-flex tw-items-center tw-min-w-0\">\r\n <!-- Theme Icon -->\r\n <div class=\"tw-flex-shrink-0\">\r\n <cide-ele-icon \r\n class=\"tw-text-purple-600\" \r\n size=\"xs\">\r\n palette\r\n </cide-ele-icon>\r\n </div>\r\n \r\n <!-- Theme Details -->\r\n <div class=\"tw-ml-3 tw-min-w-0 tw-flex-1\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\" \r\n [title]=\"row.sytm_title\">\r\n {{ row.sytm_title || 'Untitled' }}\r\n </div>\r\n @if (row.sytm_desc) {\r\n <div class=\"tw-text-xs tw-text-gray-500 tw-truncate\" \r\n [title]=\"row.sytm_desc\">\r\n {{ row.sytm_desc }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Theme Status Renderer Template -->\r\n<ng-template #themeStatusRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <span class=\"tw-inline-flex tw-items-center tw-px-2.5 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-whitespace-nowrap\"\r\n [ngClass]=\"row.sytm_isactive ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\r\n {{ row.sytm_isactive ? 'Active' : 'Inactive' }}\r\n </span>\r\n</ng-template>\r\n\r\n<!-- Actions Dropdown Renderer Template -->\r\n<ng-template #actionsDropdownRendererTemplate let-row=\"row\" let-value=\"value\">\r\n <cide-ele-dropdown \r\n [items]=\"getActionDropdownItems(row)\"\r\n [config]=\"{ triggerIcon: 'more_vert', triggerSize: 'sm' }\"\r\n (itemClick)=\"onDropdownItemClick($event, row)\">\r\n </cide-ele-dropdown>\r\n</ng-template> " }]
766
- }] });
767
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS10aGVtZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtY29yZS9zcmMvbGliL2NvcmUvcGFnZS1tYW5hZ2VtZW50L2NvbXBvbmVudHMvcGFnZS10aGVtZS9wYWdlLXRoZW1lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1jb3JlL3NyYy9saWIvY29yZS9wYWdlLW1hbmFnZW1lbnQvY29tcG9uZW50cy9wYWdlLXRoZW1lL3BhZ2UtdGhlbWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBZSxVQUFVLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLFdBQVcsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1SCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBZ0Msd0JBQXdCLEVBQWdCLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFclMsT0FB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QUM7U0FDMUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs4R0FseEJVLGtCQUFrQjtrR0FBbEIsa0JBQWtCLG9oQkNoQy9CLHFraUJBNFRlLDJDRDVTWCxZQUFZLDZWQUNaLG1CQUFtQix1bUNBQ25CLFdBQVcsK0JBRVgsc0JBQXNCLGtYQUN0QixrQkFBa0IsMGJBQ2xCLG1CQUFtQixtWUFDbkIscUJBQXFCLDBVQUNyQixpQkFBaUIsK0ZBQ2pCLHdCQUF3Qix3S0FDeEIsMEJBQTBCOzsyRkFNakIsa0JBQWtCO2tCQXBCOUIsU0FBUzsrQkFDRSwwQkFBMEIsY0FDeEIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixXQUFXO3dCQUNYLHdCQUF3Qjt3QkFDeEIsc0JBQXNCO3dCQUN0QixrQkFBa0I7d0JBQ2xCLG1CQUFtQjt3QkFDbkIscUJBQXFCO3dCQUNyQixpQkFBaUI7d0JBQ2pCLHdCQUF3Qjt3QkFDeEIsMEJBQTBCO3dCQUMxQix5QkFBeUI7cUJBQzVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBzaWduYWwsIGNvbXB1dGVkLCB2aWV3Q2hpbGQsIFRlbXBsYXRlUmVmLCBEZXN0cm95UmVmLCBpbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFZhbGlkYXRvcnMsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIsIEZvcm1zTW9kdWxlLCBGb3JtQXJyYXksIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBQYWdlVGhlbWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGFnZS10aGVtZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFN0YXRlSGVscGVyU2VydmljZSB9IGZyb20gJ2Nsb3VkLWlkZS1sYXlvdXQnO1xuaW1wb3J0IHsgQ2lkZUVsZUJ1dHRvbkNvbXBvbmVudCwgQ2lkZUVsZURhdGFHcmlkQ29tcG9uZW50LCBDaWRlSWNvbkNvbXBvbmVudCwgQ2lkZUlucHV0Q29tcG9uZW50LCBDaWRlU2VsZWN0Q29tcG9uZW50LCBDaWRlVGV4dGFyZWFDb21wb25lbnQsIEdyaWRDb25maWd1cmF0aW9uLCBHcmlkRXZlbnQsIENpZGVFbGVEcm9wZG93bkNvbXBvbmVudCwgRHJvcGRvd25JdGVtLCBDaWRlRWxlSnNvbkVkaXRvckNvbXBvbmVudCwgQ2lkZVNlbGVjdE9wdGlvbkNvbXBvbmVudCB9IGZyb20gJ2Nsb3VkLWlkZS1lbGVtZW50JztcbmltcG9ydCB7IFRlbXBsYXRlQ29udGV4dCB9IGZyb20gJ2Nsb3VkLWlkZS1lbGVtZW50JztcbmltcG9ydCB7IElDb3JlU3l0bSwgTVN5c3RlbVBhZ2VzVGhlbWVJbnNlcnRVcGRhdGVQYXlsb2FkLCBJQ29yZVN5dGhEcmF3ZXIsIE1TeXN0ZW1QYWdlc1RoZW1lLCBnZW5lcmF0ZU9iamVjdEZyb21TdHJpbmcgfSBmcm9tICdjbG91ZC1pZGUtbG1zLW1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2lkZS1jb3JlLWFwcC1wYWdlLXRoZW1lJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIENpZGVFbGVEYXRhR3JpZENvbXBvbmVudCxcbiAgICBDaWRlRWxlQnV0dG9uQ29tcG9uZW50LFxuICAgIENpZGVJbnB1dENvbXBvbmVudCxcbiAgICBDaWRlU2VsZWN0Q29tcG9uZW50LFxuICAgIENpZGVUZXh0YXJlYUNvbXBvbmVudCxcbiAgICBDaWRlSWNvbkNvbXBvbmVudCxcbiAgICBDaWRlRWxlRHJvcGRvd25Db21wb25lbnQsXG4gICAgQ2lkZUVsZUpzb25FZGl0b3JDb21wb25lbnQsXG4gICAgQ2lkZVNlbGVjdE9wdGlvbkNvbXBvbmVudFxuXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2UtdGhlbWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VUaGVtZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vIERlcGVuZGVuY3kgaW5qZWN0aW9uXG4gIHByaXZhdGUgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSB0aGVtZVNlcnZpY2UgPSBpbmplY3QoUGFnZVRoZW1lU2VydmljZSk7XG4gIHByaXZhdGUgYXBwU3RhdGUgPSBpbmplY3QoQXBwU3RhdGVIZWxwZXJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBmYiA9IGluamVjdChOb25OdWxsYWJsZUZvcm1CdWlsZGVyKTtcbiAgcHJpdmF0ZSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG5cbiAgLy8gTW9kZXJuIFZpZXdDaGlsZCBzaWduYWxzIGZvciB0ZW1wbGF0ZSByZW5kZXJlcnMgKEFuZ3VsYXIgMjAgYXBwcm9hY2gpXG4gIHRoZW1lRGV0YWlsc1JlbmRlcmVyVGVtcGxhdGUgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8VGVtcGxhdGVSZWY8VGVtcGxhdGVDb250ZXh0PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4+KCd0aGVtZURldGFpbHNSZW5kZXJlclRlbXBsYXRlJyk7XG4gIHRoZW1lU3RhdHVzUmVuZGVyZXJUZW1wbGF0ZSA9IHZpZXdDaGlsZC5yZXF1aXJlZDxUZW1wbGF0ZVJlZjxUZW1wbGF0ZUNvbnRleHQ8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+Pj4oJ3RoZW1lU3RhdHVzUmVuZGVyZXJUZW1wbGF0ZScpO1xuICBhY3Rpb25zRHJvcGRvd25SZW5kZXJlclRlbXBsYXRlID0gdmlld0NoaWxkLnJlcXVpcmVkPFRlbXBsYXRlUmVmPFRlbXBsYXRlQ29udGV4dDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+PignYWN0aW9uc0Ryb3Bkb3duUmVuZGVyZXJUZW1wbGF0ZScpO1xuXG4gIC8vIE1ha2UgTWF0aCBhdmFpbGFibGUgaW4gdGVtcGxhdGVcbiAgTWF0aCA9IE1hdGg7XG5cbiAgLy8gU2lnbmFscyBmb3IgcmVhY3RpdmUgc3RhdGUgbWFuYWdlbWVudFxuICB0aGVtZXMgPSBzaWduYWw8SUNvcmVTeXRtW10+KFtdKTtcbiAgbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIGVycm9yID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBzZWxlY3RlZEl0ZW1zID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XG4gIHNlYXJjaFRlcm0gPSBzaWduYWwoJycpO1xuXG4gIC8vIERlcml2ZWQgbGlzdCBmaWx0ZXJlZCBieSBzZWFyY2hUZXJtXG4gIGZpbHRlcmVkVGhlbWVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHEgPSAodGhpcy5zZWFyY2hUZXJtKCkgfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy50aGVtZXMoKSB8fCBbXTtcbiAgICBpZiAoIXEpIHJldHVybiBpdGVtcztcbiAgICByZXR1cm4gaXRlbXMuZmlsdGVyKHQgPT4ge1xuICAgICAgY29uc3QgdGl0bGUgPSAodC5zeXRtX3RpdGxlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgY29kZSA9ICh0LnN5dG1fdGhlbWVfY29kZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGRlc2MgPSAodC5zeXRtX2Rlc2MgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gdGl0bGUuaW5jbHVkZXMocSkgfHwgY29kZS5pbmNsdWRlcyhxKSB8fCBkZXNjLmluY2x1ZGVzKHEpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBIZWxwZXIgdG8gcmVzb2x2ZSBwcmV2aWV3IGltYWdlIFVSTCBzYWZlbHlcbiAgZ2V0UHJldmlld1VybCh0aGVtZTogSUNvcmVTeXRtKTogc3RyaW5nIHtcbiAgICBjb25zdCBpZCA9IHRoZW1lPy5zeXRtX3ByZXZpZXdfaWRfZm0gfHwgJyc7XG4gICAgaWYgKCFpZCkgcmV0dXJuICcnO1xuXG4gICAgdHlwZSBXaXRoUHJldmlld1VybCA9IHsgZ2V0UHJldmlld1VybDogKHBpZDogc3RyaW5nKSA9PiBzdHJpbmcgfTtcbiAgICBjb25zdCBzdmNVbmtub3duOiB1bmtub3duID0gdGhpcy50aGVtZVNlcnZpY2U7XG5cbiAgICBjb25zdCBoYXNHZXRQcmV2aWV3VXJsID0gKHN2YzogdW5rbm93bik6IHN2YyBpcyBXaXRoUHJldmlld1VybCA9PlxuICAgICAgdHlwZW9mIHN2YyA9PT0gJ29iamVjdCcgJiYgc3ZjICE9PSBudWxsICYmXG4gICAgICAnZ2V0UHJldmlld1VybCcgaW4gKHN2YyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgJiZcbiAgICAgIHR5cGVvZiAoc3ZjIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVsnZ2V0UHJldmlld1VybCddID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYgKGhhc0dldFByZXZpZXdVcmwoc3ZjVW5rbm93bikpIHtcbiAgICAgIHJldHVybiBzdmNVbmtub3duLmdldFByZXZpZXdVcmwoaWQpO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvLyBJbnB1dCBoYW5kbGVyIHRvIGF2b2lkICRhbnkgY2FzdHMgaW4gdGVtcGxhdGVcbiAgb25HYWxsZXJ5U2VhcmNoSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xuICAgIHRoaXMuc2VhcmNoVGVybS5zZXQodGFyZ2V0Py52YWx1ZSA/PyAnJyk7XG4gIH1cblxuICAvLyBQYWdlIGluZm9ybWF0aW9uXG4gIHBhZ2VJZCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcGFnZVRpdGxlID0gc2lnbmFsPHN0cmluZz4oJycpO1xuXG4gIC8vIEZvcm0gc3RhdGVcbiAgaXNFZGl0TW9kZSA9IHNpZ25hbChmYWxzZSk7XG4gIGVkaXRpbmdUaGVtZUlkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZXRyaWV2ZWRUaGVtZSA9IHNpZ25hbDxJQ29yZVN5dG0gfCBudWxsPihudWxsKTtcblxuICAvLyBQYWdpbmF0aW9uIHNpZ25hbHNcbiAgY3VycmVudFBhZ2UgPSBzaWduYWwoMSk7XG4gIHBhZ2VTaXplID0gc2lnbmFsKDEwKTtcbiAgdG90YWxJdGVtcyA9IHNpZ25hbCgwKTtcblxuICAvLyBNb2Rlcm4gcmVhY3RpdmUgZm9ybXMgd2l0aCBzaWduYWxzXG4gIHRoZW1lRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgIHN5dG1fdGl0bGU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICBzeXRtX2Rlc2M6IFsnJ10sXG4gICAgc3l0bV90aGVtZV9jb2RlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgc3l0bV9wcmV2aWV3X2lkX2ZtOiBbJyddLFxuICAgIHN5dG1fc3ViX3RpdGxlOiBbJyddLFxuICAgIHN5dG1fY29uZmlndXJhdGlvbjogWyd7fSddLFxuICAgIHN5dG1fZW50aXR5X2lkX3N5ZW46IFsnJ10sXG4gICAgc3l0bV9pc3NlbGVjdGVkOiBbZmFsc2VdLFxuICAgIHN5dG1fbGF5b3V0OiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHN5dG1fbGF5b3V0X3NpZGViYXI6IHRoaXMuZmIuZ3JvdXAoeyBzdGF0dXM6IFt0cnVlXSB9KSxcbiAgICAgIHN5dG1fbGF5b3V0X2hlYWRlcjogdGhpcy5mYi5ncm91cCh7IHN0YXR1czogW3RydWVdIH0pLFxuICAgICAgc3l0bV9sYXlvdXRfZm9vdGVyOiB0aGlzLmZiLmdyb3VwKHsgc3RhdHVzOiBbZmFsc2VdIH0pLFxuICAgICAgc3l0bV9sYXlvdXRfYnJlYWRjcnVtYjogdGhpcy5mYi5ncm91cCh7IHN0YXR1czogW3RydWVdIH0pLFxuICAgICAgc3l0bV9sYXlvdXRfY29uc29sZTogdGhpcy5mYi5ncm91cCh7IHN0YXR1czogW2ZhbHNlXSB9KSxcbiAgICAgIHN5dG1fbGF5b3V0X3JlcXVlc3Q6IHRoaXMuZmIuZ3JvdXAoeyBzdGF0dXM6IFtmYWxzZV0gfSksXG4gICAgICBzeXRtX2xheW91dF9kcmF3ZXI6IHRoaXMuZmIuYXJyYXkoW10gYXMgSUNvcmVTeXRoRHJhd2VyW10pXG4gICAgfSksXG4gICAgc3l0bV9pc2FjdGl2ZTogW3RydWVdXG4gIH0pO1xuXG4gIC8vIENvbXB1dGVkIHZhbHVlc1xuICBpc0Zvcm1EaXJ0eSA9IGNvbXB1dGVkKCgpID0+IHRoaXMudGhlbWVGb3JtLmRpcnR5KTtcblxuICAvLyBNdWx0aS1zZWxlY3Qgb3B0aW9ucyBmb3IgbGF5b3V0IHNlY3Rpb25zXG4gIGxheW91dE9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ3NpZGViYXInLCBsYWJlbDogJ1NpZGViYXInIH0sXG4gICAgeyB2YWx1ZTogJ2hlYWRlcicsIGxhYmVsOiAnSGVhZGVyJyB9LFxuICAgIHsgdmFsdWU6ICdmb290ZXInLCBsYWJlbDogJ0Zvb3RlcicgfSxcbiAgICB7IHZhbHVlOiAnYnJlYWRjcnVtYicsIGxhYmVsOiAnQnJlYWRjcnVtYicgfSxcbiAgICB7IHZhbHVlOiAnY29uc29sZScsIGxhYmVsOiAnQ29uc29sZScgfSxcbiAgICB7IHZhbHVlOiAncmVxdWVzdCcsIGxhYmVsOiAnUmVxdWVzdCcgfVxuICBdIGFzIGNvbnN0O1xuXG4gIC8vIFJlYWQgZW5hYmxlZCBzZWxlY3Rpb25zIGZyb20gZm9ybSB2YWx1ZXNcbiAgZW5hYmxlZExheW91dFNlbGVjdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGxheW91dCA9IHRoaXMudGhlbWVGb3JtLmdldCgnc3l0bV9sYXlvdXQnKTtcbiAgICBpZiAoIWxheW91dCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCBnZXRCb29sID0gKHBhdGg6IHN0cmluZykgPT4gQm9vbGVhbih0aGlzLnRoZW1lRm9ybS5nZXQocGF0aCk/LnZhbHVlKTtcblxuICAgIGlmIChnZXRCb29sKCdzeXRtX2xheW91dC5zeXRtX2xheW91dF9zaWRlYmFyLnN0YXR1cycpKSBzZWxlY3Rpb25zLnB1c2goJ3NpZGViYXInKTtcbiAgICBpZiAoZ2V0Qm9vbCgnc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfaGVhZGVyLnN0YXR1cycpKSBzZWxlY3Rpb25zLnB1c2goJ2hlYWRlcicpO1xuICAgIGlmIChnZXRCb29sKCdzeXRtX2xheW91dC5zeXRtX2xheW91dF9mb290ZXIuc3RhdHVzJykpIHNlbGVjdGlvbnMucHVzaCgnZm9vdGVyJyk7XG4gICAgaWYgKGdldEJvb2woJ3N5dG1fbGF5b3V0LnN5dG1fbGF5b3V0X2JyZWFkY3J1bWIuc3RhdHVzJykpIHNlbGVjdGlvbnMucHVzaCgnYnJlYWRjcnVtYicpO1xuICAgIGlmIChnZXRCb29sKCdzeXRtX2xheW91dC5zeXRtX2xheW91dF9jb25zb2xlLnN0YXR1cycpKSBzZWxlY3Rpb25zLnB1c2goJ2NvbnNvbGUnKTtcbiAgICBpZiAoZ2V0Qm9vbCgnc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfcmVxdWVzdC5zdGF0dXMnKSkgc2VsZWN0aW9ucy5wdXNoKCdyZXF1ZXN0Jyk7XG5cbiAgICByZXR1cm4gc2VsZWN0aW9ucztcbiAgfVxuXG4gIC8vIFVwZGF0ZSBmb3JtIGJvb2xlYW5zIGZyb20gbXVsdGktc2VsZWN0IGNoYW5nZVxuICBvbkVuYWJsZWRMYXlvdXRDaGFuZ2UodmFsdWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNldEJvb2wgPSAocGF0aDogc3RyaW5nLCB2YWw6IGJvb2xlYW4pID0+IHRoaXMudGhlbWVGb3JtLmdldChwYXRoKT8uc2V0VmFsdWUodmFsKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldCh2YWx1ZXMpO1xuICAgIHNldEJvb2woJ3N5dG1fbGF5b3V0LnN5dG1fbGF5b3V0X3NpZGViYXIuc3RhdHVzJywgc2VsZWN0ZWQuaGFzKCdzaWRlYmFyJykpO1xuICAgIHNldEJvb2woJ3N5dG1fbGF5b3V0LnN5dG1fbGF5b3V0X2hlYWRlci5zdGF0dXMnLCBzZWxlY3RlZC5oYXMoJ2hlYWRlcicpKTtcbiAgICBzZXRCb29sKCdzeXRtX2xheW91dC5zeXRtX2xheW91dF9mb290ZXIuc3RhdHVzJywgc2VsZWN0ZWQuaGFzKCdmb290ZXInKSk7XG4gICAgc2V0Qm9vbCgnc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfYnJlYWRjcnVtYi5zdGF0dXMnLCBzZWxlY3RlZC5oYXMoJ2JyZWFkY3J1bWInKSk7XG4gICAgc2V0Qm9vbCgnc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfY29uc29sZS5zdGF0dXMnLCBzZWxlY3RlZC5oYXMoJ2NvbnNvbGUnKSk7XG4gICAgc2V0Qm9vbCgnc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfcmVxdWVzdC5zdGF0dXMnLCBzZWxlY3RlZC5oYXMoJ3JlcXVlc3QnKSk7XG4gIH1cblxuICAvLyBHcmlkIGNvbmZpZ3VyYXRpb24gc2lnbmFsXG4gIGdyaWRDb25maWcgPSBzaWduYWw8R3JpZENvbmZpZ3VyYXRpb248SUNvcmVTeXRtPj4oe1xuICAgIGlkOiAndGhlbWUtbGlzdC1ncmlkJyxcbiAgICB0aXRsZTogJycsXG4gICAgc3VidGl0bGU6ICcnLFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZGV0YWlscycsXG4gICAgICAgIGhlYWRlcjogJ1RoZW1lIERldGFpbHMnLFxuICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICAgICAgdHJ1bmNhdGU6IHRydWUsXG4gICAgICAgIGFsaWduOiAnbGVmdCcsXG4gICAgICAgIHJlbmRlcmVyOiAndGhlbWVEZXRhaWxzUmVuZGVyZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdzeXRtX3RoZW1lX2NvZGUnLFxuICAgICAgICBoZWFkZXI6ICdUaGVtZSBDb2RlJyxcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICB3aWR0aDogJzE1MHB4JyxcbiAgICAgICAgdHJ1bmNhdGU6IHRydWUsXG4gICAgICAgIGFsaWduOiAnbGVmdCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3N5dG1faXNhY3RpdmUnLFxuICAgICAgICBoZWFkZXI6ICdTdGF0dXMnLFxuICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgd2lkdGg6ICcxMDBweCcsXG4gICAgICAgIHRydW5jYXRlOiBmYWxzZSxcbiAgICAgICAgYWxpZ246ICdjZW50ZXInLFxuICAgICAgICByZW5kZXJlcjogJ3RoZW1lU3RhdHVzUmVuZGVyZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdhY3Rpb25zJyxcbiAgICAgICAgaGVhZGVyOiAnJyxcbiAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgIHdpZHRoOiAnMTIwcHgnLFxuICAgICAgICB0cnVuY2F0ZTogZmFsc2UsXG4gICAgICAgIGFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgcmVuZGVyZXI6ICdhY3Rpb25zRHJvcGRvd25SZW5kZXJlcidcbiAgICAgIH1cbiAgICBdLFxuICAgIGRhdGE6IFtdLFxuICAgIHRyYWNrQnk6ICdfaWQnLFxuICAgIHBhZ2luYXRpb246IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBwYWdlU2l6ZTogMTAsXG4gICAgICBwYWdlU2l6ZU9wdGlvbnM6IFsxMCwgMjUsIDUwLCAxMDBdLFxuICAgICAgc2hvd1F1aWNrSnVtcDogdHJ1ZSxcbiAgICAgIHNob3dQYWdlSW5mbzogdHJ1ZSxcbiAgICAgIHNob3dSZWZyZXNoOiB0cnVlXG4gICAgfSxcbiAgICBzZWFyY2g6IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCB0aGVtZXMuLi4nLFxuICAgICAgc2VhcmNoYWJsZUNvbHVtbnM6IFsnc3l0bV90aXRsZScsICdzeXRtX2Rlc2MnLCAnc3l0bV90aGVtZV9jb2RlJ10sXG4gICAgICBkZWJvdW5jZU1zOiAzMDBcbiAgICB9LFxuICAgIGxvYWRpbmc6IHtcbiAgICAgIHVzZURlZmVyOiB0cnVlLFxuICAgICAgc2tlbGV0b25Sb3dzOiA1LFxuICAgICAgc2hvd092ZXJsYXk6IGZhbHNlXG4gICAgfSxcbiAgICBzY3JvbGw6IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBtYXhIZWlnaHQ6ICcnLFxuICAgICAgbWluSGVpZ2h0OiAnJyxcbiAgICAgIHN0aWNreUhlYWRlcjogdHJ1ZSxcbiAgICAgIHZpcnR1YWxTY3JvbGw6IGZhbHNlLFxuICAgICAgcm93SGVpZ2h0OiA1MFxuICAgIH0sXG4gICAgcmVzcG9uc2l2ZTogdHJ1ZSxcbiAgICBzdHJpcGVkOiBmYWxzZSxcbiAgICBib3JkZXJlZDogdHJ1ZSxcbiAgICBjb21wYWN0OiBmYWxzZSxcbiAgICB0YWJsZUNsYXNzOiAndHctdGFibGUtZml4ZWQgdHctdy1mdWxsIHR3LXJvdW5kZWQtbm9uZSdcbiAgfSk7XG5cbiAgLy8gQWN0aW9uIGhhbmRsZXJzIGZvciBncmlkXG4gIGFjdGlvbkhhbmRsZXJzID0ge1xuICAgIG9uRWRpdDogKGl0ZW06IElDb3JlU3l0bSkgPT4gdGhpcy5lZGl0VGhlbWUoaXRlbSksXG4gICAgb25EZWxldGU6IChpdGVtOiBJQ29yZVN5dG0pID0+IHRoaXMuZGVsZXRlVGhlbWUoaXRlbSksXG4gICAgb25Ub2dnbGVTdGF0dXM6IChpdGVtOiBJQ29yZVN5dG0pID0+IHRoaXMudG9nZ2xlVGhlbWVTdGF0dXMoaXRlbSlcbiAgfTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVDb21wb25lbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIC8vIEdldCBwYWdlIGluZm9ybWF0aW9uIGZyb20gcm91dGVcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SNIFF1ZXJ5IHBhcmFtczonLCBwYXJhbXMpO1xuICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBwYXJhbXNbJ3F1ZXJ5J107XG4gICAgICBjb25zdCBxdWVyeURhdGEgPSBnZW5lcmF0ZU9iamVjdEZyb21TdHJpbmcocXVlcnlQYXJhbXMpO1xuXG4gICAgICB0aGlzLnBhZ2VJZC5zZXQocXVlcnlEYXRhPy5zeXBnX2lkIHx8ICcnKTtcbiAgICAgIHRoaXMucGFnZVRpdGxlLnNldChxdWVyeURhdGE/LnN5cGdfdGl0bGUgfHwgJycpO1xuXG4gICAgICBpZiAodGhpcy5wYWdlSWQoKSkge1xuICAgICAgICB0aGlzLmxvYWRUaGVtZXMoKTtcbiAgICAgICAgdGhpcy5zZXR1cEZvcm1TdWJzY3JpcHRpb25zKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVycm9yLnNldCgnTm8gcGFnZSBJRCBwcm92aWRlZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlbWVzIGZyb20gQVBJXG4gICAqL1xuICBwcml2YXRlIGxvYWRUaGVtZXMoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcblxuICAgIGNvbnN0IHJlcXVlc3Q6IE1TeXN0ZW1QYWdlc1RoZW1lID0ge1xuICAgICAgc3l0bV9wYWdlX2lkX3N5cGc6IHRoaXMucGFnZUlkKClcbiAgICB9O1xuXG4gICAgdGhpcy50aGVtZVNlcnZpY2UuZ2V0VGhlbWVMaXN0KHJlcXVlc3QpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy50aGVtZXMuc2V0KHJlc3BvbnNlLmRhdGEgfHwgW10pO1xuICAgICAgICAgICAgdGhpcy50b3RhbEl0ZW1zLnNldChyZXNwb25zZS50b3RhbCB8fCAwKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlR3JpZERhdGEoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lcnJvci5zZXQocmVzcG9uc2UubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGxvYWQgdGhlbWVzJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyB0aGVtZXM6JywgZXJyb3IpO1xuICAgICAgICAgIHRoaXMuZXJyb3Iuc2V0KCdGYWlsZWQgdG8gbG9hZCB0aGVtZXMuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIGZvcm0gc3Vic2NyaXB0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEZvcm1TdWJzY3JpcHRpb25zKCk6IHZvaWQge1xuICAgIC8vIFdhdGNoIGZvciBmb3JtIGNoYW5nZXMgdG8gZW5hYmxlL2Rpc2FibGUgc2F2ZSBidXR0b25cbiAgICB0aGlzLnRoZW1lRm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIEZvcm0gdmFsaWRhdGlvbiBpcyBoYW5kbGVkIGJ5IGNvbXB1dGVkIHNpZ25hbHNcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBncmlkIGRhdGFcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlR3JpZERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5ncmlkQ29uZmlnLnVwZGF0ZShjb25maWcgPT4gKHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGRhdGE6IHRoaXMudGhlbWVzKClcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1c3RvbSByZW5kZXJlcnMgZm9yIGdyaWRcbiAgICovXG5cblxuICAvKipcbiAgICogR2V0IHRlbXBsYXRlIHJlbmRlcmVycyBmb3IgZ3JpZFxuICAgKi9cbiAgZ2V0VGVtcGxhdGVSZW5kZXJlcnMoKTogUmVjb3JkPHN0cmluZywgVGVtcGxhdGVSZWY8VGVtcGxhdGVDb250ZXh0Pj4ge1xuICAgIHJldHVybiB7XG4gICAgICB0aGVtZURldGFpbHNSZW5kZXJlcjogdGhpcy50aGVtZURldGFpbHNSZW5kZXJlclRlbXBsYXRlKCksXG4gICAgICB0aGVtZVN0YXR1c1JlbmRlcmVyOiB0aGlzLnRoZW1lU3RhdHVzUmVuZGVyZXJUZW1wbGF0ZSgpLFxuICAgICAgYWN0aW9uc0Ryb3Bkb3duUmVuZGVyZXI6IHRoaXMuYWN0aW9uc0Ryb3Bkb3duUmVuZGVyZXJUZW1wbGF0ZSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZ3JpZCBldmVudHNcbiAgICovXG4gIG9uR3JpZEV2ZW50KGV2ZW50OiBHcmlkRXZlbnQ8SUNvcmVTeXRtPik6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAncGFnZUNoYW5nZSc6XG4gICAgICAgIGlmIChldmVudC5kYXRhICYmIHR5cGVvZiBldmVudC5kYXRhID09PSAnb2JqZWN0JyAmJiAncGFnZUluZGV4JyBpbiBldmVudC5kYXRhICYmICdwYWdlU2l6ZScgaW4gZXZlbnQuZGF0YSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2Uuc2V0KGV2ZW50LmRhdGFbJ3BhZ2VJbmRleCddIGFzIG51bWJlcik7XG4gICAgICAgICAgdGhpcy5wYWdlU2l6ZS5zZXQoZXZlbnQuZGF0YVsncGFnZVNpemUnXSBhcyBudW1iZXIpO1xuICAgICAgICAgIHRoaXMubG9hZFRoZW1lcygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VhcmNoJzpcbiAgICAgICAgaWYgKGV2ZW50LmRhdGEgJiYgdHlwZW9mIGV2ZW50LmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy5zZWFyY2hUZXJtLnNldChldmVudC5kYXRhKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlLnNldCgxKTtcbiAgICAgICAgICB0aGlzLmxvYWRUaGVtZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlZnJlc2gnOlxuICAgICAgICB0aGlzLmxvYWRUaGVtZXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY3Rpb24nOlxuICAgICAgICAvLyBIYW5kbGUgYWN0aW9uIGV2ZW50cyBpZiBuZWVkZWRcbiAgICAgICAgY29uc29sZS5sb2coJ0FjdGlvbiBldmVudDonLCBldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncm93Q2xpY2snOlxuICAgICAgICAvLyBIYW5kbGUgcm93IGNsaWNrIGV2ZW50cyBpZiBuZWVkZWRcbiAgICAgICAgY29uc29sZS5sb2coJ1JvdyBjbGljayBldmVudDonLCBldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc29ydCc6XG4gICAgICAgIC8vIEhhbmRsZSBzb3J0IGV2ZW50cyBpZiBuZWVkZWRcbiAgICAgICAgY29uc29sZS5sb2coJ1NvcnQgZXZlbnQ6JywgZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2V4cG9ydCc6XG4gICAgICAgIC8vIEhhbmRsZSBleHBvcnQgZXZlbnRzIGlmIG5lZWRlZFxuICAgICAgICBjb25zb2xlLmxvZygnRXhwb3J0IGV2ZW50OicsIGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyb3dSZW9yZGVyJzpcbiAgICAgICAgLy8gSGFuZGxlIHJvdyByZW9yZGVyIGV2ZW50cyBpZiBuZWVkZWRcbiAgICAgICAgY29uc29sZS5sb2coJ1JvdyByZW9yZGVyIGV2ZW50OicsIGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBuZXcgdGhlbWVcbiAgICovXG4gIGNyZWF0ZVRoZW1lKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50aGVtZUZvcm0udmFsaWQpIHtcbiAgICAgIHRoaXMubWFya0Zvcm1Bc1RvdWNoZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLnRoZW1lRm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgIGNvbnN0IG5ld1RoZW1lOiBNU3lzdGVtUGFnZXNUaGVtZUluc2VydFVwZGF0ZVBheWxvYWQgPSB7XG4gICAgICBzeXRtX3RpdGxlOiBmb3JtVmFsdWUuc3l0bV90aXRsZSxcbiAgICAgIHN5dG1fZGVzYzogZm9ybVZhbHVlLnN5dG1fZGVzYyxcbiAgICAgIHN5dG1fdGhlbWVfY29kZTogZm9ybVZhbHVlLnN5dG1fdGhlbWVfY29kZSxcbiAgICAgIHN5dG1fcHJldmlld19pZF9mbTogZm9ybVZhbHVlLnN5dG1fcHJldmlld19pZF9mbSxcbiAgICAgIHN5dG1fcGFnZV9pZF9zeXBnOiB0aGlzLnBhZ2VJZCgpLFxuICAgICAgc3l0bV9jb25maWd1cmF0aW9uOiBKU09OLnBhcnNlKGZvcm1WYWx1ZS5zeXRtX2NvbmZpZ3VyYXRpb24pLFxuICAgICAgc3l0bV9zdWJfdGl0bGU6IGZvcm1WYWx1ZS5zeXRtX3N1Yl90aXRsZSxcbiAgICAgIHN5dG1fZW50aXR5X2lkX3N5ZW46IGZvcm1WYWx1ZS5zeXRtX2VudGl0eV9pZF9zeWVuIHx8IHRoaXMuYXBwU3RhdGUuZ2V0QWN0aXZlRW50aXR5SWQoKSxcbiAgICAgIHN5dG1faXNzZWxlY3RlZDogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9pc3NlbGVjdGVkKSxcbiAgICAgIHN5dG1fbGF5b3V0OiB7XG4gICAgICAgIHN5dG1fbGF5b3V0X3NpZGViYXI6IHsgc3RhdHVzOiBCb29sZWFuKGZvcm1WYWx1ZS5zeXRtX2xheW91dC5zeXRtX2xheW91dF9zaWRlYmFyLnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfaGVhZGVyOiB7IHN0YXR1czogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfaGVhZGVyLnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfZm9vdGVyOiB7IHN0YXR1czogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfZm9vdGVyLnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfYnJlYWRjcnVtYjogeyBzdGF0dXM6IEJvb2xlYW4oZm9ybVZhbHVlLnN5dG1fbGF5b3V0LnN5dG1fbGF5b3V0X2JyZWFkY3J1bWIuc3RhdHVzKSB9LFxuICAgICAgICBzeXRtX2xheW91dF9jb25zb2xlOiB7IHN0YXR1czogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfY29uc29sZS5zdGF0dXMpIH0sXG4gICAgICAgIHN5dG1fbGF5b3V0X3JlcXVlc3Q6IHsgc3RhdHVzOiBCb29sZWFuKGZvcm1WYWx1ZS5zeXRtX2xheW91dC5zeXRtX2xheW91dF9yZXF1ZXN0LnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfZHJhd2VyOiBmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfZHJhd2VyIGFzIElDb3JlU3l0aERyYXdlcltdXG4gICAgICB9LFxuICAgICAgc3l0bV9pc2FjdGl2ZTogZm9ybVZhbHVlLnN5dG1faXNhY3RpdmVcbiAgICB9O1xuXG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLnRoZW1lU2VydmljZS5jcmVhdGVUaGVtZShuZXdUaGVtZSlcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgICAgICAgICAgdGhpcy5sb2FkVGhlbWVzKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygn4pyFIFRoZW1lIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBGYWlsZWQgdG8gY3JlYXRlIHRoZW1lOicsIHJlc3BvbnNlLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNyZWF0aW5nIHRoZW1lOicsIGVycm9yKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIGNyZWF0ZSB0aGVtZS4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGV4aXN0aW5nIHRoZW1lXG4gICAqL1xuICB1cGRhdGVUaGVtZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGhlbWVGb3JtLnZhbGlkIHx8ICF0aGlzLmVkaXRpbmdUaGVtZUlkKCkpIHtcbiAgICAgIHRoaXMubWFya0Zvcm1Bc1RvdWNoZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLnRoZW1lRm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgIGNvbnN0IHVwZGF0ZWRUaGVtZTogTVN5c3RlbVBhZ2VzVGhlbWVJbnNlcnRVcGRhdGVQYXlsb2FkID0ge1xuICAgICAgX2lkOiB0aGlzLmVkaXRpbmdUaGVtZUlkKCkgfHwgJycsXG4gICAgICBzeXRtX3RpdGxlOiBmb3JtVmFsdWUuc3l0bV90aXRsZSxcbiAgICAgIHN5dG1fZGVzYzogZm9ybVZhbHVlLnN5dG1fZGVzYyxcbiAgICAgIHN5dG1fdGhlbWVfY29kZTogZm9ybVZhbHVlLnN5dG1fdGhlbWVfY29kZSxcbiAgICAgIHN5dG1fcHJldmlld19pZF9mbTogZm9ybVZhbHVlLnN5dG1fcHJldmlld19pZF9mbSxcbiAgICAgIHN5dG1fcGFnZV9pZF9zeXBnOiB0aGlzLnBhZ2VJZCgpLFxuICAgICAgc3l0bV9jb25maWd1cmF0aW9uOiBKU09OLnBhcnNlKGZvcm1WYWx1ZS5zeXRtX2NvbmZpZ3VyYXRpb24pLFxuICAgICAgc3l0bV9zdWJfdGl0bGU6IGZvcm1WYWx1ZS5zeXRtX3N1Yl90aXRsZSxcbiAgICAgIHN5dG1fZW50aXR5X2lkX3N5ZW46IGZvcm1WYWx1ZS5zeXRtX2VudGl0eV9pZF9zeWVuIHx8IHRoaXMuYXBwU3RhdGUuZ2V0QWN0aXZlRW50aXR5SWQoKSxcbiAgICAgIHN5dG1faXNzZWxlY3RlZDogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9pc3NlbGVjdGVkKSxcbiAgICAgIHN5dG1fbGF5b3V0OiB7XG4gICAgICAgIHN5dG1fbGF5b3V0X3NpZGViYXI6IHsgc3RhdHVzOiBCb29sZWFuKGZvcm1WYWx1ZS5zeXRtX2xheW91dC5zeXRtX2xheW91dF9zaWRlYmFyLnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfaGVhZGVyOiB7IHN0YXR1czogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfaGVhZGVyLnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfZm9vdGVyOiB7IHN0YXR1czogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfZm9vdGVyLnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfYnJlYWRjcnVtYjogeyBzdGF0dXM6IEJvb2xlYW4oZm9ybVZhbHVlLnN5dG1fbGF5b3V0LnN5dG1fbGF5b3V0X2JyZWFkY3J1bWIuc3RhdHVzKSB9LFxuICAgICAgICBzeXRtX2xheW91dF9jb25zb2xlOiB7IHN0YXR1czogQm9vbGVhbihmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfY29uc29sZS5zdGF0dXMpIH0sXG4gICAgICAgIHN5dG1fbGF5b3V0X3JlcXVlc3Q6IHsgc3RhdHVzOiBCb29sZWFuKGZvcm1WYWx1ZS5zeXRtX2xheW91dC5zeXRtX2xheW91dF9yZXF1ZXN0LnN0YXR1cykgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfZHJhd2VyOiBmb3JtVmFsdWUuc3l0bV9sYXlvdXQuc3l0bV9sYXlvdXRfZHJhd2VyIGFzIElDb3JlU3l0aERyYXdlcltdXG4gICAgICB9LFxuICAgICAgc3l0bV9pc2FjdGl2ZTogZm9ybVZhbHVlLnN5dG1faXNhY3RpdmVcbiAgICB9O1xuXG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLnRoZW1lU2VydmljZS51cGRhdGVUaGVtZSh1cGRhdGVkVGhlbWUpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFRoZW1lcygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ+KchSBUaGVtZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIHVwZGF0ZSB0aGVtZTonLCByZXNwb25zZS5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB1cGRhdGluZyB0aGVtZTonLCBlcnJvcik7XG4gICAgICAgICAgY29uc29sZS5lcnJvcign4p2MIEZhaWxlZCB0byB1cGRhdGUgdGhlbWUuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlbWVcbiAgICovXG4gIGVkaXRUaGVtZSh0aGVtZTogSUNvcmVTeXRtKTogdm9pZCB7XG4gICAgdGhpcy5pc0VkaXRNb2RlLnNldCh0cnVlKTtcbiAgICB0aGlzLmVkaXRpbmdUaGVtZUlkLnNldCh0aGVtZS5faWQgfHwgbnVsbCk7XG4gICAgdGhpcy5yZXRyaWV2ZWRUaGVtZS5zZXQodGhlbWUpO1xuXG4gICAgdGhpcy50aGVtZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBzeXRtX3RpdGxlOiB0aGVtZS5zeXRtX3RpdGxlIHx8ICcnLFxuICAgICAgc3l0bV9kZXNjOiB0aGVtZS5zeXRtX2Rlc2MgfHwgJycsXG4gICAgICBzeXRtX3RoZW1lX2NvZGU6IHRoZW1lLnN5dG1fdGhlbWVfY29kZSB8fCAnJyxcbiAgICAgIHN5dG1fcHJldmlld19pZF9mbTogdGhlbWUuc3l0bV9wcmV2aWV3X2lkX2ZtIHx8ICcnLFxuICAgICAgc3l0bV9zdWJfdGl0bGU6IHRoZW1lLnN5dG1fc3ViX3RpdGxlIHx8ICcnLFxuICAgICAgc3l0bV9jb25maWd1cmF0aW9uOiBKU09OLnN0cmluZ2lmeSh0aGVtZS5zeXRtX2NvbmZpZ3VyYXRpb24gfHwge30sIG51bGwsIDIpLFxuICAgICAgc3l0bV9lbnRpdHlfaWRfc3llbjogdGhlbWUuc3l0bV9lbnRpdHlfaWRfc3llbiB8fCB0aGlzLmFwcFN0YXRlLmdldEFjdGl2ZUVudGl0eUlkKCksXG4gICAgICBzeXRtX2lzc2VsZWN0ZWQ6IHRoZW1lLnN5dG1faXNzZWxlY3RlZCA/PyBmYWxzZSxcbiAgICAgIHN5dG1fbGF5b3V0OiB7XG4gICAgICAgIHN5dG1fbGF5b3V0X3NpZGViYXI6IHsgc3RhdHVzOiB0aGVtZS5zeXRtX2xheW91dD8uc3l0bV9sYXlvdXRfc2lkZWJhcj8uc3RhdHVzID8/IHRydWUgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfaGVhZGVyOiB7IHN0YXR1czogdGhlbWUuc3l0bV9sYXlvdXQ/LnN5dG1fbGF5b3V0X2hlYWRlcj8uc3RhdHVzID8/IHRydWUgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfZm9vdGVyOiB7IHN0YXR1czogdGhlbWUuc3l0bV9sYXlvdXQ/LnN5dG1fbGF5b3V0X2Zvb3Rlcj8uc3RhdHVzID8/IGZhbHNlIH0sXG4gICAgICAgIHN5dG1fbGF5b3V0X2JyZWFkY3J1bWI6IHsgc3RhdHVzOiB0aGVtZS5zeXRtX2xheW91dD8uc3l0bV9sYXlvdXRfYnJlYWRjcnVtYj8uc3RhdHVzID8/IHRydWUgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfY29uc29sZTogeyBzdGF0dXM6IHRoZW1lLnN5dG1fbGF5b3V0Py5zeXRtX2xheW91dF9jb25zb2xlPy5zdGF0dXMgPz8gZmFsc2UgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfcmVxdWVzdDogeyBzdGF0dXM6IHRoZW1lLnN5dG1fbGF5b3V0Py5zeXRtX2xheW91dF9yZXF1ZXN0Py5zdGF0dXMgPz8gZmFsc2UgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfZHJhd2VyOiB0aGVtZS5zeXRtX2xheW91dD8uc3l0bV9sYXlvdXRfZHJhd2VyIHx8IFtdXG4gICAgICB9LFxuICAgICAgc3l0bV9pc2FjdGl2ZTogdGhlbWUuc3l0bV9pc2FjdGl2ZSA/PyB0cnVlXG4gICAgfSk7XG5cbiAgICAvLyBSZWJ1aWxkIGRyYXdlciBhcnJheSBjb250cm9scyBmcm9tIGRhdGFcbiAgICB3aGlsZSAodGhpcy5kcmF3ZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZHJhd2VyQXJyYXkucmVtb3ZlQXQoMCk7XG4gICAgfVxuICAgICh0aGVtZS5zeXRtX2xheW91dD8uc3l0bV9sYXlvdXRfZHJhd2VyIHx8IFtdKS5mb3JFYWNoKGQgPT4ge1xuICAgICAgdGhpcy5kcmF3ZXJBcnJheS5wdXNoKHRoaXMuY3JlYXRlRHJhd2VyR3JvdXAoe1xuICAgICAgICBzeXRoX3N0YXR1czogZD8uc3l0aF9zdGF0dXMgPz8gdHJ1ZSxcbiAgICAgICAgc3l0aF9jb25maWdfc3ljb19mb3I6IGQ/LnN5dGhfY29uZmlnX3N5Y29fZm9yID8/ICdkcmF3ZXJfbm90ZXMnXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnRoZW1lRm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGVtZVxuICAgKi9cbiAgZGVsZXRlVGhlbWUodGhlbWU6IElDb3JlU3l0bSk6IHZvaWQge1xuICAgIGlmIChjb25maXJtKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSB0aGVtZSBcIiR7dGhlbWUuc3l0bV90aXRsZX1cIj9gKSkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMudGhlbWVTZXJ2aWNlLmRlbGV0ZVRoZW1lKHRoZW1lLl9pZCB8fCAnJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkVGhlbWVzKCk7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfinIUgVGhlbWUgZGVsZXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBGYWlsZWQgdG8gZGVsZXRlIHRoZW1lOicsIHJlc3BvbnNlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkZWxldGluZyB0aGVtZTonLCBlcnJvcik7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIGRlbGV0ZSB0aGVtZS4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0aGVtZSBzdGF0dXNcbiAgICovXG4gIHRvZ2dsZVRoZW1lU3RhdHVzKHRoZW1lOiBJQ29yZVN5dG0pOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMudGhlbWVTZXJ2aWNlLnRvZ2dsZVRoZW1lU3RhdHVzKHsgc3l0bV9pZDogdGhlbWUuX2lkIHx8ICcnLCBzeXRtX2lzYWN0aXZlOiAhdGhlbWUuc3l0bV9pc2FjdGl2ZSB9KVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFRoZW1lcygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYOKchSBUaGVtZSAke3RoZW1lLnN5dG1faXNhY3RpdmUgPyAnZGVhY3RpdmF0ZWQnIDogJ2FjdGl2YXRlZCd9IHN1Y2Nlc3NmdWxseWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIHRvZ2dsZSB0aGVtZSBzdGF0dXM6JywgcmVzcG9uc2UubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgdG9nZ2xpbmcgdGhlbWUgc3RhdHVzOicsIGVycm9yKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgRmFpbGVkIHRvIHRvZ2dsZSB0aGVtZSBzdGF0dXMuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlbWUgKGNyZWF0ZSBvciB1cGRhdGUpXG4gICAqL1xuICBzYXZlVGhlbWUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNFZGl0TW9kZSgpKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRoZW1lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JlYXRlVGhlbWUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGZvcm1cbiAgICovXG4gIGNhbmNlbEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldEZvcm0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyBiYWNrIHRvIHBhZ2UgbGlzdFxuICAgKi9cbiAgZ29CYWNrKCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NvcmUvcGFnZSddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBmb3JtXG4gICAqL1xuICBwcml2YXRlIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnRoZW1lRm9ybS5yZXNldCh7XG4gICAgICBzeXRtX3RpdGxlOiAnJyxcbiAgICAgIHN5dG1fZGVzYzogJycsXG4gICAgICBzeXRtX3RoZW1lX2NvZGU6ICcnLFxuICAgICAgc3l0bV9wcmV2aWV3X2lkX2ZtOiAnJyxcbiAgICAgIHN5dG1fc3ViX3RpdGxlOiAnJyxcbiAgICAgIHN5dG1fY29uZmlndXJhdGlvbjogJ3t9JyxcbiAgICAgIHN5dG1fZW50aXR5X2lkX3N5ZW46ICcnLFxuICAgICAgc3l0bV9pc3NlbGVjdGVkOiBmYWxzZSxcbiAgICAgIHN5dG1fbGF5b3V0OiB7XG4gICAgICAgIHN5dG1fbGF5b3V0X3NpZGViYXI6IHsgc3RhdHVzOiB0cnVlIH0sXG4gICAgICAgIHN5dG1fbGF5b3V0X2hlYWRlcjogeyBzdGF0dXM6IHRydWUgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfZm9vdGVyOiB7IHN0YXR1czogZmFsc2UgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfYnJlYWRjcnVtYjogeyBzdGF0dXM6IHRydWUgfSxcbiAgICAgICAgc3l0bV9sYXlvdXRfY29uc29sZTogeyBzdGF0dXM6IGZhbHNlIH0sXG4gICAgICAgIHN5dG1fbGF5b3V0X3JlcXVlc3Q6IHsgc3RhdHVzOiBmYWxzZSB9LFxuICAgICAgICBzeXRtX2xheW91dF9kcmF3ZXI6IFtdIGFzIElDb3JlU3l0aERyYXdlcltdXG4gICAgICB9LFxuICAgICAgc3l0bV9pc2FjdGl2ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgLy8gRXhwbGljaXRseSBjbGVhciB0aGUgRm9ybUFycmF5IGZvciBkcmF3ZXJzXG4gICAgd2hpbGUgKHRoaXMuZHJhd2VyQXJyYXkubGVuZ3RoKSB7XG4gICAgICB0aGlzLmRyYXdlckFycmF5LnJlbW92ZUF0KDApO1xuICAgIH1cblxuICAgIHRoaXMuaXNFZGl0TW9kZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuZWRpdGluZ1RoZW1lSWQuc2V0KG51bGwpO1xuICAgIHRoaXMucmV0cmlldmVkVGhlbWUuc2V0KG51bGwpO1xuICAgIHRoaXMudGhlbWVGb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgdGhpcy50aGVtZUZvcm0ubWFya0FzVW50b3VjaGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogTWFyayBmb3JtIGFzIHRvdWNoZWQgdG8gdHJpZ2dlciB2YWxpZGF0aW9uIGRpc3BsYXlcbiAgICovXG4gIHByaXZhdGUgbWFya0Zvcm1Bc1RvdWNoZWQoKTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXModGhpcy50aGVtZUZvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnRoZW1lRm9ybS5nZXQoa2V5KTtcbiAgICAgIGNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZHJvcGRvd24gaXRlbXMgZm9yIGFjdGlvbnNcbiAgICovXG4gIGdldEFjdGlvbkRyb3Bkb3duSXRlbXModGhlbWU6IElDb3JlU3l0bSk6IERyb3Bkb3duSXRlbVtdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBpZDogJ2VkaXQnLFxuICAgICAgICBsYWJlbDogJ0VkaXQnLFxuICAgICAgICBpY29uOiAnZWRpdCcsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6ICd0b2dnbGUnLFxuICAgICAgICBsYWJlbDogdGhlbWUuc3l0bV9pc2FjdGl2ZSA/ICdEZWFjdGl2YXRlJyA6ICdBY3RpdmF0ZScsXG4gICAgICAgIGljb246IHRoZW1lLnN5dG1faXNhY3RpdmUgPyAnYmxvY2snIDogJ2NoZWNrX2NpcmNsZScsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdkZWxldGUnLFxuICAgICAgICBsYWJlbDogJ0RlbGV0ZScsXG4gICAgICAgIGljb246ICdkZWxldGUnLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICAgIH1cbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBkcm9wZG93biBpdGVtIGNsaWNrXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgY2xpY2tzIG9uIGRyb3Bkb3duIG1lbnUgaXRlbXMgaW4gdGhlIGFjdGlvbnMgY29sdW1uXG4gICAqL1xuICBvbkRyb3Bkb3duSXRlbUNsaWNrKGl0ZW06IERyb3Bkb3duSXRlbSwgcm93OiBJQ29yZVN5dG0pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygn8J+UtSBvbkRyb3Bkb3duSXRlbUNsaWNrIGNhbGxlZCB3aXRoOicsIGl0ZW0sIHJvdyk7XG5cbiAgICBzd2l0Y2ggKGl0ZW0uaWQpIHtcbiAgICAgIGNhc2UgJ2VkaXQnOlxuICAgICAgICBjb25zb2xlLmxvZygn8J+UtSBDYWxsaW5nIGVkaXRUaGVtZSB3aXRoOicsIHJvdyk7XG4gICAgICAgIHRoaXMuZWRpdFRoZW1lKHJvdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9nZ2xlJzpcbiAgICAgICAgY29uc29sZS5sb2coJ/CflLUgQ2FsbGluZyB0b2dnbGVUaGVtZVN0YXR1cyB3aXRoOicsIHJvdyk7XG4gICAgICAgIHRoaXMudG9nZ2xlVGhlbWVTdGF0dXMocm93KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBjb25zb2xlLmxvZygn8J+UtSBDYWxsaW5nIGRlbGV0ZVRoZW1lIHdpdGg6Jywgcm93KTtcbiAgICAgICAgdGhpcy5kZWxldGVUaGVtZShyb3cpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5S1IFVua25vd24gYWN0aW9uOicsIGl0ZW0uaWQpO1xuICAgIH1cblxuICAgIC8vIENsb3NlIGFsbCBkcm9wZG93bnMgYWZ0ZXIgYWN0aW9uXG4gICAgdGhpcy5jbG9zZUFsbERyb3Bkb3ducygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGFsbCBkcm9wZG93bnNcbiAgICovXG4gIHByaXZhdGUgY2xvc2VBbGxEcm9wZG93bnMoKTogdm9pZCB7XG4gICAgLy8gQ2xvc2UgYWxsIGRyb3Bkb3ducyBieSBjbGlja2luZyBvdXRzaWRlXG4gICAgY29uc3QgZXZlbnQgPSBuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7IGJ1YmJsZXM6IHRydWUgfSk7XG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH1cblxuICAvLyA9PT09PSBEcmF3ZXIgKHN5dG1fbGF5b3V0X2RyYXdlcikgaGVscGVycyA9PT09PVxuICBkcmF3ZXJDb25maWdPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6ICdkcmF3ZXJfbm90ZXMnLCBsYWJlbDogJ0RyYXdlciBOb3RlcycgfSxcbiAgICB7IHZhbHVlOiAnZHJhd2VyX3RoZW1lJywgbGFiZWw6ICdEcmF3ZXIgVGhlbWUnIH1cbiAgXTtcblxuICBnZXQgZHJhd2VyQXJyYXkoKTogRm9ybUFycmF5PEZvcm1Hcm91cD4ge1xuICAgIHJldHVybiB0aGlzLnRoZW1lRm9ybS5nZXQoJ3N5dG1fbGF5b3V0LnN5dG1fbGF5b3V0X2RyYXdlcicpIGFzIHVua25vd24gYXMgRm9ybUFycmF5PEZvcm1Hcm91cD47XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURyYXdlckdyb3VwKGRyYXdlcj86IFBhcnRpYWw8SUNvcmVTeXRoRHJhd2VyPik6IEZvcm1Hcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgc3l0aF9zdGF0dXM6IFtkcmF3ZXI/LnN5dGhfc3RhdHVzID8/IHRydWVdLFxuICAgICAgc3l0aF9jb25maWdfc3ljb19mb3I6IFtkcmF3ZXI/LnN5dGhfY29uZmlnX3N5Y29fZm9yID8/ICdkcmF3ZXJfbm90ZXMnXVxuICAgIH0pIGFzIHVua25vd24gYXMgRm9ybUdyb3VwO1xuICB9XG5cbiAgYWRkRHJhd2VyKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhd2VyQXJyYXkucHVzaCh0aGlzLmNyZWF0ZURyYXdlckdyb3VwKCkpO1xuICAgIHRoaXMudGhlbWVGb3JtLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICByZW1vdmVEcmF3ZXIoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5kcmF3ZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZHJhd2VyQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICAgICAgdGhpcy50aGVtZUZvcm0ubWFya0FzRGlydHkoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNlbGVjdGVkIHRoZW1lIChvbmx5IG9uZSBjYW4gYmUgc2VsZWN0ZWQgcGVyIHBhZ2UpXG4gICAqL1xuICBzZXRTZWxlY3RlZFRoZW1lKHRoZW1lOiBJQ29yZVN5dG0pOiB2b2lkIHtcbiAgICBpZiAoIXRoZW1lIHx8IHRoZW1lLnN5dG1faXNzZWxlY3RlZCkgcmV0dXJuOyAvLyBhbHJlYWR5IHNlbGVjdGVkXG5cbiAgICBjb25zdCBwcmV2aW91c2x5U2VsZWN0ZWQgPSB0aGlzLnRoZW1lcygpLmZpbmQodCA9PiB0LnN5dG1faXNzZWxlY3RlZCAmJiB0Ll9pZCAhPT0gdGhlbWUuX2lkKTtcblxuICAgIC8vIERpc2FibGUgcHJldmlvdXMgc2VsZWN0aW9uIChiZXN0LWVmZm9ydClcbiAgICBpZiAocHJldmlvdXNseVNlbGVjdGVkKSB7XG4gICAgICBjb25zdCBkaXNhYmxlUGF5bG9hZDogTVN5c3RlbVBhZ2VzVGhlbWVJbnNlcnRVcGRhdGVQYXlsb2FkID0ge1xuICAgICAgICBfaWQ6IHByZXZpb3VzbHlTZWxlY3RlZC5faWQgfHwgJycsXG4gICAgICAgIHN5dG1fdGl0bGU6IHByZXZpb3VzbHlTZWxlY3RlZC5zeXRtX3RpdGxlIHx8ICcnLFxuICAgICAgICBzeXRtX2Rlc2M6IHByZXZpb3VzbHlTZWxlY3RlZC5zeXRtX2Rlc2MgfHwgJycsXG4gICAgICAgIHN5dG1fdGhlbWVfY29kZTogcHJldmlvdXNseVNlbGVjdGVkLnN5dG1fdGhlbWVfY29kZSB8fCAnJyxcbiAgICAgICAgc3l0bV9wcmV2aWV3X2lkX2ZtOiBwcmV2aW91c2x5U2VsZWN0ZWQuc3l0bV9wcmV2aWV3X2lkX2ZtIHx8ICcnLFxuICAgICAgICBzeXRtX3BhZ2VfaWRfc3lwZzogdGhpcy5wYWdlSWQoKSxcbiAgICAgICAgc3l0bV9jb25maWd1cmF0aW9uOiBwcmV2aW91c2x5U2VsZWN0ZWQuc3l0bV9jb25maWd1cmF0aW9uIHx8IHt9LFxuICAgICAgICBzeXRtX3N1Yl90aXRsZTogcHJldmlvdXNseVNlbGVjdGVkLnN5dG1fc3ViX3RpdGxlIHx8ICcnLFxuICAgICAgICBzeXRtX2VudGl0eV9pZF9zeWVuOiBwcmV2aW91c2x5U2VsZWN0ZWQuc3l0bV9lbnRpdHlfaWRfc3llbiB8fCB0aGlzLmFwcFN0YXRlLmdldEFjdGl2ZUVudGl0eUlkKCksXG4gICAgICAgIHN5dG1faXNzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIHN5dG1fbGF5b3V0OiBwcmV2aW91c2x5U2VsZWN0ZWQuc3l0bV9sYXlvdXQsXG4gICAgICAgIHN5dG1faXNhY3RpdmU6IHByZXZpb3VzbHlTZWxlY3RlZC5zeXRtX2lzYWN0aXZlID8/IHRydWVcbiAgICAgIH07XG4gICAgICB0aGlzLnRoZW1lU2VydmljZS51cGRhdGVUaGVtZShkaXNhYmxlUGF5bG9hZCkucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKHsgbmV4dDogKCkgPT4ge30sIGVycm9yOiAoKSA9PiB7fSB9KTtcbiAgICB9XG5cbiAgICAvLyBFbmFibGUgY3VycmVudCBzZWxlY3Rpb25cbiAgICBjb25zdCBlbmFibGVQYXlsb2FkOiBNU3lzdGVtUGFnZXNUaGVtZUluc2VydFVwZGF0ZVBheWxvYWQgPSB7XG4gICAgICBfaWQ6IHRoZW1lLl9pZCB8fCAnJyxcbiAgICAgIHN5dG1fdGl0bGU6IHRoZW1lLnN5dG1fdGl0bGUgfHwgJycsXG4gICAgICBzeXRtX2Rlc2M6IHRoZW1lLnN5dG1fZGVzYyB8fCAnJyxcbiAgICAgIHN5dG1fdGhlbWVfY29kZTogdGhlbWUuc3l0bV90aGVtZV9jb2RlIHx8ICcnLFxuICAgICAgc3l0bV9wcmV2aWV3X2lkX2ZtOiB0aGVtZS5zeXRtX3ByZXZpZXdfaWRfZm0gfHwgJycsXG4gICAgICBzeXRtX3BhZ2VfaWRfc3lwZzogdGhpcy5wYWdlSWQoKSxcbiAgICAgIHN5dG1fY29uZmlndXJhdGlvbjogdGhlbWUuc3l0bV9jb25maWd1cmF0aW9uIHx8IHt9LFxuICAgICAgc3l0bV9zdWJfdGl0bGU6IHRoZW1lLnN5dG1fc3ViX3RpdGxlIHx8ICcnLFxuICAgICAgc3l0bV9lbnRpdHlfaWRfc3llbjogdGhlbWUuc3l0bV9lbnRpdHlfaWRfc3llbiB8fCB0aGlzLmFwcFN0YXRlLmdldEFjdGl2ZUVudGl0eUlkKCksXG4gICAgICBzeXRtX2lzc2VsZWN0ZWQ6IHRydWUsXG4gICAgICBzeXRtX2xheW91dDogdGhlbWUuc3l0bV9sYXlvdXQsXG4gICAgICBzeXRtX2lzYWN0aXZlOiB0aGVtZS5zeXRtX2lzYWN0aXZlID8/IHRydWVcbiAgICB9O1xuXG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLnRoZW1lU2VydmljZS51cGRhdGVUaGVtZShlbmFibGVQYXlsb2FkKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4geyB0aGlzLmxvYWRUaGVtZXMoKTsgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7IH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMubG9hZGluZy5zZXQoZmFsc2UpOyB9XG4gICAgICB9KTtcbiAgfVxufSIsIjwhLS0gUGFnZSBUaGVtZSBDb250YWluZXIgLS0+XHJcbjxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWgtZnVsbCB0dy13LWZ1bGxcIj5cclxuICBcclxuICA8IS0tIExlZnQ6IEZvcm0gYW5kIGhlYWRlciAoNjAlKSAtLT5cclxuICA8ZGl2IGNsYXNzPVwidHctdy1mdWxsIGxnOnR3LXctMy81IHR3LWZsZXggdHctZmxleC1jb2wgdHctYm9yZGVyLXIgdHctYm9yZGVyLWdyYXktMjAwXCI+XHJcblxyXG4gIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwidHctcHgtNiB0dy1weS0zIHR3LWJvcmRlci1iIHR3LWJvcmRlci1ncmF5LTIwMCB0dy1iZy1ncmF5LTUwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWZsZXgtY29sIHNtOnR3LWZsZXgtcm93IHR3LWp1c3RpZnktYmV0d2VlbiB0dy1pdGVtcy1zdGFydCBzbTp0dy1pdGVtcy1jZW50ZXIgdHctc3BhY2UteS0zIHNtOnR3LXNwYWNlLXktMFwiPlxyXG5cclxuICAgICAgPCEtLSBUaXRsZSBhbmQgQmFjayBCdXR0b24gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1zcGFjZS14LTRcIj5cclxuICAgICAgICAgIDxidXR0b24gY2lkZUVsZUJ1dHRvbiB2YXJpYW50PVwiZ2hvc3RcIiBzaXplPVwic21cIiAoY2xpY2spPVwiZ29CYWNrKClcIiBjbGFzcz1cInR3LXRleHQtZ3JheS02MDAgaG92ZXI6dHctdGV4dC1ncmF5LTkwMFwiPlxyXG4gICAgICAgICAgPGNpZGUtZWxlLWljb24gY2xhc3M9XCJ0dy13LTQgdHctaC00XCI+YXJyb3dfYmFjazwvY2lkZS1lbGUtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHctZmxleCB0dy1pdGVtcy1jZW50ZXIgdHctc3BhY2UteC0yXCI+XHJcbiAgICAgICAgICA8Y2lkZS1lbGUtaWNvbiBjbGFzcz1cInR3LXRleHQtYmx1ZS02MDAgdHctdy01IHR3LWgtNVwiPnBhbGV0dGU8L2NpZGUtZWxlLWljb24+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJ0dy10ZXh0LWJhc2UgdHctZm9udC1tZWRpdW0gdHctdGV4dC1ncmF5LTkwMCB0dy1tLTBcIj5UaGVtZSBNYW5hZ2VtZW50PC9oNT5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0dy10ZXh0LXNtIHR3LXRleHQtZ3JheS01MDAgdHctbS0wXCI+UGFnZToge3sgcGFnZVRpdGxlKCkgfX08L3A+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEVycm9yIE1lc3NhZ2UgLS0+XHJcbiAgICBAaWYgKGVycm9yKCkpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ0dy1tdC00IHR3LXAtNCB0dy1iZy1yZWQtNTAgdHctYm9yZGVyIHR3LWJvcmRlci1yZWQtMjAwIHR3LXJvdW5kZWQtbWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctaXRlbXMtc3RhcnRcIj5cclxuICAgICAgICA8Y2lkZS1lbGUtaWNvbiBuYW1lPVwiZXJyb3JcIiBjbGFzcz1cInR3LXRleHQtcmVkLTQwMCB0dy13LTUgdHctaC01IHR3LW10LTAuNSB0dy1mbGV4LXNocmluay0wXCI+PC9jaWRlLWVsZS1pY29uPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1tbC0zXCI+XHJcbiAgICAgICAgICA8aDMgY2xhc3M9XCJ0dy10ZXh0LXNtIHR3LWZvbnQtbWVkaXVtIHR3LXRleHQtcmVkLTgwMCB0dy1tLTBcIj5FcnJvcjwvaDM+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cInR3LXRleHQtc20gdHctdGV4dC1yZWQtNzAwIHR3LW10LTEgdHctbS0wXCI+e3sgZXJyb3IoKSB9fTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFF1aWNrIEFkZC9FZGl0IEZvcm0gU2VjdGlvbiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJ0dy1weC02IHR3LXB5LTQgdHctYmctd2hpdGUgdHctb3ZlcmZsb3ctYXV0b1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInR3LWZsZXggdHctaXRlbXMtY2VudGVyIHR3LWp1c3RpZnktYmV0d2VlbiB0dy1tYi0zXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1zcGFjZS14LTNcIj5cclxuICAgICAgICA8Y2lkZS1lbGUtaWNvbiBjbGFzcz1cInR3LXRleHQtYmx1ZS02MDAgdHctdy01IHR3LWgtNVwiPnt7IGlzRWRpdE1vZGUoKSA/ICdlZGl0JyA6ICdhZGQnIH19PC9jaWRlLWVsZS1pY29uPlxyXG4gICAgICAgIDxoNiBjbGFzcz1cInR3LXRleHQtc20gdHctZm9udC1tZWRpdW0gdHctdGV4dC1ncmF5LTkwMCB0dy1tLTBcIj57eyBpc0VkaXRNb2RlKCkgPyAnRWRpdCBUaGVtZScgOiAnUXVpY2sgQWRkIFRoZW1lJyB9fTwvaDY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIEZvcm0gKGtlcHQgYXMtaXMpIC0tPlxyXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJ0aGVtZUZvcm1cIiAobmdTdWJtaXQpPVwic2F2ZVRoZW1lKClcIiBjbGFzcz1cInR3LXNwYWNlLXktNFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHctZ3JpZCB0dy1ncmlkLWNvbHMtMSBtZDp0dy1ncmlkLWNvbHMtMiBsZzp0dy1ncmlkLWNvbHMtMyB0dy1nYXAtNFwiPlxyXG4gICAgICAgIDwhLS0gVGhlbWUgVGl0bGUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXNwYWNlLXktMlwiPlxyXG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgaWQ9XCJzeXRtX3RpdGxlXCIgZm9ybUNvbnRyb2xOYW1lPVwic3l0bV90aXRsZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgdGhlbWUgdGl0bGVcIiBsYWJlbD1cIlRoZW1lIFRpdGxlKlwiIHNpemU9XCJzbVwiPjwvY2lkZS1lbGUtaW5wdXQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBUaGVtZSBDb2RlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1zcGFjZS15LTJcIj5cclxuICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IGlkPVwic3l0bV90aGVtZV9jb2RlXCIgZm9ybUNvbnRyb2xOYW1lPVwic3l0bV90aGVtZV9jb2RlXCIgcGxhY2Vob2xkZXI9XCJFbnRlciB0aGVtZSBjb2RlXCIgbGFiZWw9XCJUaGVtZSBDb2RlKlwiIHNpemU9XCJzbVwiPjwvY2lkZS1lbGUtaW5wdXQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBTdGF0dXMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXNwYWNlLXktMlwiPlxyXG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXRcclxuICAgICAgICAgICAgICBpZD1cInN5dG1faXNhY3RpdmVfY2JcIlxyXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgbGFiZWw9XCJBY3RpdmVcIlxyXG4gICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5dG1faXNhY3RpdmVcIj5cclxuICAgICAgICAgICAgPC9jaWRlLWVsZS1pbnB1dD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIFN1YiBUaXRsZSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHctc3BhY2UteS0yXCI+XHJcbiAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dCBpZD1cInN5dG1fc3ViX3RpdGxlXCIgZm9ybUNvbnRyb2xOYW1lPVwic3l0bV9zdWJfdGl0bGVcIiBwbGFjZWhvbGRlcj1cIkVudGVyIHN1YiB0aXRsZVwiIGxhYmVsPVwiU3ViIFRpdGxlXCIgc2l6ZT1cInNtXCI+PC9jaWRlLWVsZS1pbnB1dD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIFByZXZpZXcgSUQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXNwYWNlLXktMlwiPlxyXG4gICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgaWQ9XCJzeXRtX3ByZXZpZXdfaWRfZm1cIiBmb3JtQ29udHJvbE5hbWU9XCJzeXRtX3ByZXZpZXdfaWRfZm1cIiBwbGFjZWhvbGRlcj1cIkVudGVyIHByZXZpZXcgaW1hZ2UgSURcIiBsYWJlbD1cIlByZXZpZXcgSW1hZ2UgSURcIiBzaXplPVwic21cIj48L2NpZGUtZWxlLWlucHV0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gRGVzY3JpcHRpb24gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXNwYWNlLXktMiBtZDp0dy1jb2wtc3Bhbi0yXCI+XHJcbiAgICAgICAgICAgIDxjaWRlLWVsZS10ZXh0YXJlYSBpZD1cInN5dG1fZGVzY1wiIGZvcm1Db250cm9sTmFtZT1cInN5dG1fZGVzY1wiIHBsYWNlaG9sZGVyPVwiRW50ZXIgdGhlbWUgZGVzY3JpcHRpb25cIiByb3dzPVwiMlwiIGxhYmVsPVwiRGVzY3JpcHRpb25cIiBzaXplPVwic21cIj48L2NpZGUtZWxlLXRleHRhcmVhPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgIDwhLS0gQ29uZmlndXJhdGlvbiBKU09OIC0tPlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwidHctc3BhY2UteS0yIG1kOnR3LWNvbC1zcGFuLTNcIj5cclxuICAgICAgICAgICAgPGNpZGUtZWxlLWpzb24tZWRpdG9yIGxhYmVsPVwiQ29uZmlndXJhdGlvbiBKU09OXCIgZm9ybUNvbnRyb2xOYW1lPVwic3l0bV9jb25maWd1cmF0aW9uXCIgW3JlcXVpcmVkXT1cInRydWVcIiBbY29uZmlnXT1cIntcclxuICAgICAgICAgICAgICAgc2hvd0xpbmVOdW1iZXJzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICBhdXRvRm9ybWF0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICB2YWxpZGF0ZU9uQ2hhbmdlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICBtaW5IZWlnaHQ6IDE1MCxcclxuICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiAzMDAsXHJcbiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnRW50ZXIgdGhlbWUgY29uZmlndXJhdGlvbiBKU09OLi4uJ1xyXG4gICAgICAgICAgICAgIH1cIiBoZWxwZXJUZXh0PVwiRW50ZXIgdmFsaWQgSlNPTiBjb25maWd1cmF0aW9uIGZvciB0aGUgdGhlbWVcIj48L2NpZGUtZWxlLWpzb24tZWRpdG9yPlxyXG4gICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS0gTGF5b3V0IENvbmZpZ3VyYXRpb24gKyBTZWxlY3Rpb246IHJpZ2h0LXNpZGUgY2hlY2tib3ggbGlzdCAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZzp0dy1jb2wtc3Bhbi0xIHR3LXNwYWNlLXktMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctdGV4dC1zbSB0dy1mb250LW1lZGl1bSB0dy10ZXh0LWdyYXktNzAwXCI+TGF5b3V0ICYgU2VsZWN0aW9uPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gU2VsZWN0ZWQgdG9nZ2xlIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctYmctd2hpdGUgdHctYm9yZGVyIHR3LWJvcmRlci1ncmF5LTIwMCB0dy1yb3VuZGVkLW1kIHR3LXB4LTMgdHctcHktMlwiPlxyXG4gICAgICAgICAgICAgIDxjaWRlLWVsZS1pbnB1dFxyXG4gICAgICAgICAgICAgICAgaWQ9XCJzeXRtX2lzc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgIGxhYmVsPVwiU2VsZWN0ZWQgKERlZmF1bHQpXCJcclxuICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN5dG1faXNzZWxlY3RlZFwiPlxyXG4gICAgICAgICAgICAgIDwvY2lkZS1lbGUtaW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cInN5dG1fbGF5b3V0XCIgY2xhc3M9XCJ0dy1iZy13aGl0ZSB0dy1ib3JkZXIgdHctYm9yZGVyLWdyYXktMjAwIHR3LXJvdW5kZWQtbWQgdHctZGl2aWRlLXkgdHctb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBTaWRlYmFyIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1weC0zIHR3LXB5LTJcIiBmb3JtR3JvdXBOYW1lPVwic3l0bV9sYXlvdXRfc2lkZWJhclwiPlxyXG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IGlkPVwibGF5b3V0X3NpZGViYXJfc3RhdHVzXCIgdHlwZT1cImNoZWNrYm94XCIgbGFiZWw9XCJTaWRlYmFyXCIgc2l6ZT1cInNtXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhdHVzXCI+PC9jaWRlLWVsZS1pbnB1dD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1weC0zIHR3LXB5LTJcIiBmb3JtR3JvdXBOYW1lPVwic3l0bV9sYXlvdXRfaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgaWQ9XCJsYXlvdXRfaGVhZGVyX3N0YXR1c1wiIHR5cGU9XCJjaGVja2JveFwiIGxhYmVsPVwiSGVhZGVyXCIgc2l6ZT1cInNtXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhdHVzXCI+PC9jaWRlLWVsZS1pbnB1dD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8IS0tIEZvb3RlciAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctcHgtMyB0dy1weS0yXCIgZm9ybUdyb3VwTmFtZT1cInN5dG1fbGF5b3V0X2Zvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IGlkPVwibGF5b3V0X2Zvb3Rlcl9zdGF0dXNcIiB0eXBlPVwiY2hlY2tib3hcIiBsYWJlbD1cIkZvb3RlclwiIHNpemU9XCJzbVwiIGZvcm1Db250cm9sTmFtZT1cInN0YXR1c1wiPjwvY2lkZS1lbGUtaW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPCEtLSBCcmVhZGNydW1iIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1weC0zIHR3LXB5LTJcIiBmb3JtR3JvdXBOYW1lPVwic3l0bV9sYXlvdXRfYnJlYWRjcnVtYlwiPlxyXG4gICAgICAgICAgICAgICAgPGNpZGUtZWxlLWlucHV0IGlkPVwibGF5b3V0X2JyZWFkY3J1bWJfc3RhdHVzXCIgdHlwZT1cImNoZWNrYm94XCIgbGFiZWw9XCJCcmVhZGNydW1iXCIgc2l6ZT1cInNtXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhdHVzXCI+PC9jaWRlLWVsZS1pbnB1dD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8IS0tIENvbnNvbGUgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR3LXB4LTMgdHctcHktMlwiIGZvcm1Hcm91cE5hbWU9XCJzeXRtX2xheW91dF9jb25zb2xlXCI+XHJcbiAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgaWQ9XCJsYXlvdXRfY29uc29sZV9zdGF0dXNcIiB0eXBlPVwiY2hlY2tib3hcIiBsYWJlbD1cIkNvbnNvbGVcIiBzaXplPVwic21cIiBmb3JtQ29udHJvbE5hbWU9XCJzdGF0dXNcIj48L2NpZGUtZWxlLWlucHV0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8IS0tIFJlcXVlc3QgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR3LXB4LTMgdHctcHktMlwiIGZvcm1Hcm91cE5hbWU9XCJzeXRtX2xheW91dF9yZXF1ZXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgaWQ9XCJsYXlvdXRfcmVxdWVzdF9zdGF0dXNcIiB0eXBlPVwiY2hlY2tib3hcIiBsYWJlbD1cIlJlcXVlc3RcIiBzaXplPVwic21cIiBmb3JtQ29udHJvbE5hbWU9XCJzdGF0dXNcIj48L2NpZGUtZWxlLWlucHV0PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0dy10ZXh0LXhzIHR3LXRleHQtZ3JheS01MDAgdHctcHQtMVwiPlRvZ2dsZSBhY3RpdmUgc2VjdGlvbnMuIE9ubHkgb25lIHRoZW1lIGNhbiBiZSBzZWxlY3RlZCBhcyBkZWZhdWx0LiBNb3JlIG9wdGlvbnMgY2FuIGJlIGFkZGVkIGhlcmUgbGF0ZXIuPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPCEtLSBEcmF3ZXIgQ29uZmlndXJhdGlvbiAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1zcGFjZS15LTIgbWQ6dHctY29sLXNwYW4tM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctZmxleCB0dy1pdGVtcy1jZW50ZXIgdHctanVzdGlmeS1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR3LXRleHQtc20gdHctZm9udC1tZWRpdW0gdHctdGV4dC1ncmF5LTcwMFwiPkRyYXdlcnM8L2Rpdj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNpZGVFbGVCdXR0b24gdHlwZT1cImJ1dHRvblwiIHNpemU9XCJ4c1wiIHZhcmlhbnQ9XCJvdXRsaW5lXCIgKGNsaWNrKT1cImFkZERyYXdlcigpXCI+XHJcbiAgICAgICAgICAgICAgICBBZGQgRHJhd2VyXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwic3l0bV9sYXlvdXRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctc3BhY2UteS0yXCIgZm9ybUFycmF5TmFtZT1cInN5dG1fbGF5b3V0X2RyYXdlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZHJhd2VyR3JwIG9mIGRyYXdlckFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNsYXNzPVwidHctYm9yZGVyIHR3LWJvcmRlci1ncmF5LTIwMCB0dy1yb3VuZGVkLW1kIHR3LXAtMyB0dy1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1nYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaW5wdXQgaWQ9XCJkcmF3ZXJfYWN0aXZlX3t7aX19XCIgdHlwZT1cImNoZWNrYm94XCIgbGFiZWw9XCJBY3RpdmVcIiBzaXplPVwic21cIiBmb3JtQ29udHJvbE5hbWU9XCJzeXRoX3N0YXR1c1wiPjwvY2lkZS1lbGUtaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4LTFcIj5cclxuICAgICAgICAgICAgICAgIDxjaWRlLWVsZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZHJhd2VyX2NvbmZpZ197e2l9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkRyYXdlciBGb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZHJhd2VyQ29uZmlnT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzeXRoX2NvbmZpZ19zeWNvX2ZvclwiPlxyXG4gICAgICAgICAgICAgICAgPC9jaWRlLWVsZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2lkZUVsZUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc2l6ZT1cInhzXCIgdmFyaWFudD1cImdob3N0XCIgKGNsaWNrKT1cInJlbW92ZURyYXdlcihpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjaWRlLWVsZS1pY29uIGNsYXNzPVwidHctdy00IHR3LWgtNFwiPmRlbGV0ZTwvY2lkZS1lbGUtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0dy10ZXh0LXhzIHR3LXRleHQtZ3JheS01MDBcIj5Db25maWd1cmUgbXVsdGlwbGUgZHJhd2VycyBhcyBuZWVkZWQuPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gRm9ybSBBY3Rpb25zIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWZsZXgtY29sIHR3LWdhcC0yIHR3LXB0LTQgdHctYm9yZGVyLXQgdHctYm9yZGVyLWdyYXktMjAwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctZmxleCB0dy1pdGVtcy1jZW50ZXIgdHctanVzdGlmeS1lbmQgdHctc3BhY2UteC0zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2lkZUVsZUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cIm91dGxpbmVcIiAoY2xpY2spPVwiY2FuY2VsRm9ybSgpXCIgW2Rpc2FibGVkXT1cImxvYWRpbmcoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNpZGVFbGVCdXR0b24gdHlwZT1cInN1Ym1pdFwiIHZhcmlhbnQ9XCJwcmltYXJ5XCIgbGVmdEljb249XCJhZGRcIiBbZGlzYWJsZWRdPVwiIXRoZW1lRm9ybS52YWxpZCB8fCBsb2FkaW5nKClcIiBbbG9hZGluZ109XCJsb2FkaW5nKClcIj5cclxuICAgICAgICAgIHt7IGlzRWRpdE1vZGUoKSA/ICdVcGRhdGUgVGhlbWUnIDogJ0NyZWF0ZSBUaGVtZScgfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZm9ybT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFJpZ2h0OiBUaGVtZSBnYWxsZXJ5ICg0MCUpIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJ0dy1oaWRkZW4gbGc6dHctZmxleCB0dy13LTIvNSB0dy1mbGV4LWNvbFwiPlxyXG4gICAgPCEtLSAoSGVhZGVyIGNvbnNvbGlkYXRlZCBhYm92ZSkgLS0+XHJcblxyXG4gICAgPCEtLSBHYWxsZXJ5IGxpc3QgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwidHctZmxleC0xIHR3LW92ZXJmbG93LWF1dG8gdHctYmctZ3JheS01MFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHctZ3JpZCB0dy1ncmlkLWNvbHMtMSBtZDp0dy1ncmlkLWNvbHMtMiB0dy1nYXAtMyB0dy1wLTRcIj5cclxuICAgICAgICBAZm9yICh0aGVtZSBvZiBmaWx0ZXJlZFRoZW1lcygpOyB0cmFjayB0aGVtZS5faWQpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1yb3VuZGVkLW1kIHR3LXRyYW5zaXRpb24gdHctY3Vyc29yLXBvaW50ZXIgdHctcmVsYXRpdmVcIlxyXG4gICAgICAgICAgICAgICBbbmdDbGFzc109XCJ0aGVtZS5zeXRtX2lzc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgICA/ICd0dy1ib3JkZXIgdHctYm9yZGVyLWJsdWUtNTAwIHR3LXJpbmctMiB0dy1yaW5nLWJsdWUtMjAwIHR3LWJnLWJsdWUtNTAvNTAnXHJcbiAgICAgICAgICAgICAgICAgOiAndHctYmctd2hpdGUgdHctYm9yZGVyIHR3LWJvcmRlci1ncmF5LTIwMCBob3Zlcjp0dy1zaGFkb3ctc20nXCJcclxuICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRUaGVtZSh0aGVtZSlcIlxyXG4gICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJ0aGVtZS5zeXRtX2lzc2VsZWN0ZWQgPyAndHJ1ZScgOiAnZmFsc2UnXCJcclxuICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRWRpdCB0aGVtZSAnICsgKHRoZW1lLnN5dG1fdGl0bGUgfHwgdGhlbWUuc3l0bV90aGVtZV9jb2RlKVwiXHJcbiAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImVkaXRUaGVtZSh0aGVtZSlcIlxyXG4gICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgZWRpdFRoZW1lKHRoZW1lKVwiPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBTZWxlY3RlZCBiYWRnZSAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRoZW1lLnN5dG1faXNzZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1hYnNvbHV0ZSB0dy10b3AtMiB0dy1yaWdodC0yIHR3LWZsZXggdHctaXRlbXMtY2VudGVyIHR3LWp1c3RpZnktY2VudGVyIHR3LXctNiB0dy1oLTYgdHctcm91bmRlZC1mdWxsIHR3LWJnLWJsdWUtNjAwIHR3LXRleHQtd2hpdGVcIj5cclxuICAgICAgICAgICAgICA8Y2lkZS1lbGUtaWNvbiBjbGFzcz1cInR3LXctNCB0dy1oLTRcIj5jaGVjazwvY2lkZS1lbGUtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR3LWFzcGVjdC1bMTYvOV0gdHctYmctZ3JheS0xMDAgdHctcm91bmRlZC10LW1kIHR3LW92ZXJmbG93LWhpZGRlbiB0dy1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1qdXN0aWZ5LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgIEBpZiAoZ2V0UHJldmlld1VybCh0aGVtZSkpIHtcclxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJnZXRQcmV2aWV3VXJsKHRoZW1lKVwiIGNsYXNzPVwidHctdy1mdWxsIHR3LWgtZnVsbCB0dy1vYmplY3QtY292ZXJcIiBhbHQ9XCJQcmV2aWV3XCIgLz5cclxuICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy10ZXh0LWdyYXktNDAwIHR3LXRleHQteHNcIj5ObyBwcmV2aWV3PC9kaXY+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR3LXAtMyB0dy1zcGFjZS15LTFcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctdGV4dC1zbSB0dy1mb250LW1lZGl1bSB0dy10ZXh0LWdyYXktOTAwIHR3LXRydW5jYXRlXCIgW3RpdGxlXT1cInRoZW1lLnN5dG1fdGl0bGVcIj57eyB0aGVtZS5zeXRtX3RpdGxlIHx8ICdVbnRpdGxlZCBUaGVtZScgfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctdGV4dC14cyB0dy10ZXh0LWdyYXktNTAwIHR3LXRydW5jYXRlXCIgW3RpdGxlXT1cInRoZW1lLnN5dG1fdGhlbWVfY29kZVwiPnt7IHRoZW1lLnN5dG1fdGhlbWVfY29kZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1qdXN0aWZ5LWJldHdlZW4gdHctcHQtMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0dy1pbmxpbmUtZmxleCB0dy1pdGVtcy1jZW50ZXIgdHctZ2FwLTEgdHctdGV4dC14c1wiIFtuZ0NsYXNzXT1cInRoZW1lLnN5dG1faXNhY3RpdmUgPyAndHctdGV4dC1ncmVlbi03MDAnIDogJ3R3LXRleHQtcmVkLTcwMCdcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0dy13LTEuNSB0dy1oLTEuNSB0dy1yb3VuZGVkLWZ1bGxcIiBbbmdDbGFzc109XCJ0aGVtZS5zeXRtX2lzYWN0aXZlID8gJ3R3LWJnLWdyZWVuLTUwMCcgOiAndHctYmctcmVkLTUwMCdcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHRoZW1lLnN5dG1faXNhY3RpdmUgPyAnQWN0aXZlJyA6ICdJbmFjdGl2ZScgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1nYXAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFNldCBTZWxlY3RlZCBCdXR0b24gLSBDbGVhciBhbmQgU2ltcGxlIC0tPlxyXG4gICAgICAgICAgICAgICAgICBAaWYgKHRoZW1lLnN5dG1faXNzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHctaW5saW5lLWZsZXggdHctaXRlbXMtY2VudGVyIHR3LWdhcC0xIHR3LXB4LTIgdHctcHktMSB0dy1iZy1ncmVlbi0xMDAgdHctdGV4dC1ncmVlbi04MDAgdHctcm91bmRlZC1tZCB0dy10ZXh0LXhzIHR3LWZvbnQtbWVkaXVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaWNvbiBjbGFzcz1cInR3LXctMyB0dy1oLTNcIj5jaGVjazwvY2lkZS1lbGUtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkXHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNpZGVFbGVCdXR0b24gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInhzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHNldFNlbGVjdGVkVGhlbWUodGhlbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdCAnICsgKHRoZW1lLnN5dG1fdGl0bGUgfHwgdGhlbWUuc3l0bV90aGVtZV9jb2RlKSArICcgdGhlbWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHctdGV4dC14c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgU2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjaWRlRWxlQnV0dG9uIHZhcmlhbnQ9XCJnaG9zdFwiIHNpemU9XCJ4c1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGVkaXRUaGVtZSh0aGVtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0VkaXQgdGhlbWUgJyArICh0aGVtZS5zeXRtX3RpdGxlIHx8IHRoZW1lLnN5dG1fdGhlbWVfY29kZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y2lkZS1lbGUtaWNvbiBjbGFzcz1cInR3LXctNCB0dy1oLTRcIj5lZGl0PC9jaWRlLWVsZS1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjaWRlRWxlQnV0dG9uIHZhcmlhbnQ9XCJnaG9zdFwiIHNpemU9XCJ4c1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGRlbGV0ZVRoZW1lKHRoZW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGVsZXRlIHRoZW1lICcgKyAodGhlbWUuc3l0bV90aXRsZSB8fCB0aGVtZS5zeXRtX3RoZW1lX2NvZGUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGNpZGUtZWxlLWljb24gY2xhc3M9XCJ0dy13LTQgdHctaC00XCI+ZGVsZXRlPC9jaWRlLWVsZS1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgQGlmICghbG9hZGluZygpICYmIGZpbHRlcmVkVGhlbWVzKCkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctY29sLXNwYW4tZnVsbCB0dy10ZXh0LWNlbnRlciB0dy10ZXh0LXhzIHR3LXRleHQtZ3JheS01MDAgdHctcHktOFwiPk5vIHRoZW1lcyBmb3VuZDwvZGl2PlxyXG4gICAgICAgIH1cclxuICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gXHJcbiAgQW5ndWxhciBUZW1wbGF0ZSBSZWZlcmVuY2VzIGZvciBHcmlkIFJlbmRlcmVycyAoQmVzdCBQcmFjdGljZSlcclxuICBcclxuICBUaGVzZSBuZy10ZW1wbGF0ZSBlbGVtZW50cyByZXByZXNlbnQgdGhlIEFuZ3VsYXIgYmVzdCBwcmFjdGljZSBmb3IgY3VzdG9tIHJlbmRlcmluZy5cclxuICBUaGV5IHByb3ZpZGU6XHJcbiAgLSBUeXBlIHNhZmV0eSB3aXRoIHRlbXBsYXRlIGNvbnRleHRcclxuICAtIENvbXBvbmVudCBsaWZlY3ljbGUgaW50ZWdyYXRpb25cclxuICAtIENoYW5nZSBkZXRlY3Rpb24gb3B0aW1pemF0aW9uXHJcbiAgLSBQcm9wZXIgZXZlbnQgaGFuZGxpbmdcclxuICAtIEFjY2Vzc2liaWxpdHkgZmVhdHVyZXNcclxuICBcclxuICBOb3RlOiBDdXJyZW50IGRhdGEgZ3JpZCB1c2VzIHN0cmluZyByZW5kZXJlcnMgZm9yIGNvbXBhdGliaWxpdHkuXHJcbiAgVGVtcGxhdGVzIGFyZSBtYWludGFpbmVkIGZvciBmdXR1cmUgY29tcG9uZW50IGVuaGFuY2VtZW50LlxyXG4tLT5cclxuXHJcbjwhLS0gVGhlbWUgRGV0YWlscyBSZW5kZXJlciBUZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICN0aGVtZURldGFpbHNSZW5kZXJlclRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1taW4tdy0wXCI+XHJcbiAgICA8IS0tIFRoZW1lIEljb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwidHctZmxleC1zaHJpbmstMFwiPlxyXG4gICAgICA8Y2lkZS1lbGUtaWNvbiBcclxuICAgICAgICBjbGFzcz1cInR3LXRleHQtcHVycGxlLTYwMFwiIFxyXG4gICAgICAgIHNpemU9XCJ4c1wiPlxyXG4gICAgICAgIHBhbGV0dGVcclxuICAgICAgPC9jaWRlLWVsZS1pY29uPlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuICAgIDwhLS0gVGhlbWUgRGV0YWlscyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJ0dy1tbC0zIHR3LW1pbi13LTAgdHctZmxleC0xXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0dy10ZXh0LXNtIHR3LWZvbnQtbWVkaXVtIHR3LXRleHQtZ3JheS05MDAgdHctdHJ1bmNhdGVcIiBcclxuICAgICAgICAgICBbdGl0bGVdPVwicm93LnN5dG1fdGl0bGVcIj5cclxuICAgICAgICB7eyByb3cuc3l0bV90aXRsZSB8fCAnVW50aXRsZWQnIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICBAaWYgKHJvdy5zeXRtX2Rlc2MpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHctdGV4dC14cyB0dy10ZXh0LWdyYXktNTAwIHR3LXRydW5jYXRlXCIgXHJcbiAgICAgICAgICAgICBbdGl0bGVdPVwicm93LnN5dG1fZGVzY1wiPlxyXG4gICAgICAgICAge3sgcm93LnN5dG1fZGVzYyB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS0gVGhlbWUgU3RhdHVzIFJlbmRlcmVyIFRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI3RoZW1lU3RhdHVzUmVuZGVyZXJUZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cclxuICA8c3BhbiBjbGFzcz1cInR3LWlubGluZS1mbGV4IHR3LWl0ZW1zLWNlbnRlciB0dy1weC0yLjUgdHctcHktMC41IHR3LXJvdW5kZWQtZnVsbCB0dy10ZXh0LXhzIHR3LWZvbnQtbWVkaXVtIHR3LXdoaXRlc3BhY2Utbm93cmFwXCJcclxuICAgICAgICBbbmdDbGFzc109XCJyb3cuc3l0bV9pc2FjdGl2ZSA/ICd0dy1iZy1ncmVlbi0xMDAgdHctdGV4dC1ncmVlbi04MDAnIDogJ3R3LWJnLXJlZC0xMDAgdHctdGV4dC1yZWQtODAwJ1wiPlxyXG4gICAge3sgcm93LnN5dG1faXNhY3RpdmUgPyAnQWN0aXZlJyA6ICdJbmFjdGl2ZScgfX1cclxuICA8L3NwYW4+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIEFjdGlvbnMgRHJvcGRvd24gUmVuZGVyZXIgVGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjYWN0aW9uc0Ryb3Bkb3duUmVuZGVyZXJUZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cclxuICA8Y2lkZS1lbGUtZHJvcGRvd24gXHJcbiAgICBbaXRlbXNdPVwiZ2V0QWN0aW9uRHJvcGRvd25JdGVtcyhyb3cpXCJcclxuICAgIFtjb25maWddPVwieyB0cmlnZ2VySWNvbjogJ21vcmVfdmVydCcsIHRyaWdnZXJTaXplOiAnc20nIH1cIlxyXG4gICAgKGl0ZW1DbGljayk9XCJvbkRyb3Bkb3duSXRlbUNsaWNrKCRldmVudCwgcm93KVwiPlxyXG4gIDwvY2lkZS1lbGUtZHJvcGRvd24+XHJcbjwvbmctdGVtcGxhdGU+ICJdfQ==