ngx-hana-nameserver-history-viewer 1.2.1 → 21.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +2 -1
  2. package/{fesm2020 → fesm2022}/ngx-hana-nameserver-history-viewer.mjs +2898 -3983
  3. package/fesm2022/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
  4. package/ngx-hana-nameserver-history-viewer-21.1.0.tgz +0 -0
  5. package/package.json +20 -27
  6. package/types/ngx-hana-nameserver-history-viewer.d.ts +545 -0
  7. package/esm2020/ngx-hana-nameserver-history-viewer.mjs +0 -5
  8. package/esm2020/public-api.mjs +0 -2
  9. package/esm2020/src/nameserver-history-viewer/components/alert/alert.component.mjs +0 -68
  10. package/esm2020/src/nameserver-history-viewer/components/alert/alert.module.mjs +0 -22
  11. package/esm2020/src/nameserver-history-viewer/components/alert/index.mjs +0 -3
  12. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.mjs +0 -112
  13. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/index.mjs +0 -2
  14. package/esm2020/src/nameserver-history-viewer/components/index.mjs +0 -9
  15. package/esm2020/src/nameserver-history-viewer/components/instruction/index.mjs +0 -2
  16. package/esm2020/src/nameserver-history-viewer/components/instruction/instruction.component.mjs +0 -42
  17. package/esm2020/src/nameserver-history-viewer/components/nameserver-history.component.mjs +0 -557
  18. package/esm2020/src/nameserver-history-viewer/components/port-selector/index.mjs +0 -2
  19. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.component.mjs +0 -69
  20. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.service.mjs +0 -41
  21. package/esm2020/src/nameserver-history-viewer/components/progress-bar/index.mjs +0 -2
  22. package/esm2020/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.mjs +0 -40
  23. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/index.mjs +0 -2
  24. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.mjs +0 -70
  25. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/index.mjs +0 -2
  26. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.mjs +0 -88
  27. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.mjs +0 -47
  28. package/esm2020/src/nameserver-history-viewer/index.mjs +0 -3
  29. package/esm2020/src/nameserver-history-viewer/nameserver-history.module.mjs +0 -63
  30. package/esm2020/src/nameserver-history-viewer/services/chart.service.mjs +0 -328
  31. package/esm2020/src/nameserver-history-viewer/services/file.service.mjs +0 -390
  32. package/esm2020/src/nameserver-history-viewer/services/index.mjs +0 -4
  33. package/esm2020/src/nameserver-history-viewer/services/ui.service.mjs +0 -557
  34. package/esm2020/src/nameserver-history-viewer/types/abort.types.mjs +0 -6
  35. package/esm2020/src/nameserver-history-viewer/types/alert.types.mjs +0 -8
  36. package/esm2020/src/nameserver-history-viewer/types/chart-content-data-item.types.mjs +0 -2
  37. package/esm2020/src/nameserver-history-viewer/types/chart-content-data.types.mjs +0 -2
  38. package/esm2020/src/nameserver-history-viewer/types/chart-content-header.types.mjs +0 -2
  39. package/esm2020/src/nameserver-history-viewer/types/chart-content-time.types.mjs +0 -2
  40. package/esm2020/src/nameserver-history-viewer/types/chart-content.types.mjs +0 -2
  41. package/esm2020/src/nameserver-history-viewer/types/color-rgba.types.mjs +0 -2
  42. package/esm2020/src/nameserver-history-viewer/types/html-element.type.mjs +0 -9
  43. package/esm2020/src/nameserver-history-viewer/types/index.mjs +0 -28
  44. package/esm2020/src/nameserver-history-viewer/types/item.types.mjs +0 -14
  45. package/esm2020/src/nameserver-history-viewer/types/legend-color.types.mjs +0 -2
  46. package/esm2020/src/nameserver-history-viewer/types/load-history-info-backup.types.mjs +0 -2
  47. package/esm2020/src/nameserver-history-viewer/types/load-history-info-columnstore.types.mjs +0 -2
  48. package/esm2020/src/nameserver-history-viewer/types/load-history-info-host.types.mjs +0 -2
  49. package/esm2020/src/nameserver-history-viewer/types/load-history-info-item.types.mjs +0 -2
  50. package/esm2020/src/nameserver-history-viewer/types/load-history-info-persistence.types.mjs +0 -2
  51. package/esm2020/src/nameserver-history-viewer/types/load-history-info-rowstore.types.mjs +0 -2
  52. package/esm2020/src/nameserver-history-viewer/types/load-history-info-server.types.mjs +0 -2
  53. package/esm2020/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.mjs +0 -2
  54. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sql.types.mjs +0 -2
  55. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.mjs +0 -2
  56. package/esm2020/src/nameserver-history-viewer/types/load-history-info-threads.types.mjs +0 -2
  57. package/esm2020/src/nameserver-history-viewer/types/load-history-info.types.mjs +0 -2
  58. package/esm2020/src/nameserver-history-viewer/types/port.types.mjs +0 -2
  59. package/esm2020/src/nameserver-history-viewer/types/scale-group.types.mjs +0 -17
  60. package/esm2020/src/nameserver-history-viewer/types/unit-category.types.mjs +0 -10
  61. package/esm2020/src/nameserver-history-viewer/types/unit.types.mjs +0 -14
  62. package/esm2020/src/nameserver-history-viewer/utils/chart-util.mjs +0 -25
  63. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.mjs +0 -2
  64. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.mjs +0 -56
  65. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.mjs +0 -139
  66. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/index.mjs +0 -41
  67. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.mjs +0 -106
  68. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.mjs +0 -167
  69. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/utils.mjs +0 -114
  70. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.mjs +0 -527
  71. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/index.mjs +0 -2
  72. package/esm2020/src/nameserver-history-viewer/utils/file-util.mjs +0 -161
  73. package/esm2020/src/nameserver-history-viewer/utils/index.mjs +0 -5
  74. package/esm2020/src/nameserver-history-viewer/utils/time-util.mjs +0 -99
  75. package/esm2020/src/nameserver-history-viewer/utils/ui-util.mjs +0 -162
  76. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs +0 -4098
  77. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs.map +0 -1
  78. package/fesm2020/ngx-hana-nameserver-history-viewer.mjs.map +0 -1
  79. package/ngx-hana-nameserver-history-viewer.d.ts +0 -5
  80. package/public-api.d.ts +0 -1
  81. package/src/nameserver-history-viewer/components/alert/alert.component.d.ts +0 -21
  82. package/src/nameserver-history-viewer/components/alert/alert.module.d.ts +0 -8
  83. package/src/nameserver-history-viewer/components/alert/index.d.ts +0 -2
  84. package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.d.ts +0 -16
  85. package/src/nameserver-history-viewer/components/file-drop-input/index.d.ts +0 -1
  86. package/src/nameserver-history-viewer/components/index.d.ts +0 -8
  87. package/src/nameserver-history-viewer/components/instruction/index.d.ts +0 -1
  88. package/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +0 -17
  89. package/src/nameserver-history-viewer/components/nameserver-history.component.d.ts +0 -262
  90. package/src/nameserver-history-viewer/components/port-selector/index.d.ts +0 -1
  91. package/src/nameserver-history-viewer/components/port-selector/port-selector.component.d.ts +0 -31
  92. package/src/nameserver-history-viewer/components/port-selector/port-selector.service.d.ts +0 -14
  93. package/src/nameserver-history-viewer/components/progress-bar/index.d.ts +0 -1
  94. package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +0 -6
  95. package/src/nameserver-history-viewer/components/time-range-selector/index.d.ts +0 -1
  96. package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +0 -19
  97. package/src/nameserver-history-viewer/components/timezone-selector/index.d.ts +0 -1
  98. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.d.ts +0 -26
  99. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.d.ts +0 -21
  100. package/src/nameserver-history-viewer/index.d.ts +0 -2
  101. package/src/nameserver-history-viewer/nameserver-history.module.d.ts +0 -19
  102. package/src/nameserver-history-viewer/services/chart.service.d.ts +0 -59
  103. package/src/nameserver-history-viewer/services/file.service.d.ts +0 -63
  104. package/src/nameserver-history-viewer/services/index.d.ts +0 -3
  105. package/src/nameserver-history-viewer/services/ui.service.d.ts +0 -88
  106. package/src/nameserver-history-viewer/types/abort.types.d.ts +0 -4
  107. package/src/nameserver-history-viewer/types/alert.types.d.ts +0 -6
  108. package/src/nameserver-history-viewer/types/chart-content-data-item.types.d.ts +0 -4
  109. package/src/nameserver-history-viewer/types/chart-content-data.types.d.ts +0 -4
  110. package/src/nameserver-history-viewer/types/chart-content-header.types.d.ts +0 -4
  111. package/src/nameserver-history-viewer/types/chart-content-time.types.d.ts +0 -3
  112. package/src/nameserver-history-viewer/types/chart-content.types.d.ts +0 -10
  113. package/src/nameserver-history-viewer/types/color-rgba.types.d.ts +0 -6
  114. package/src/nameserver-history-viewer/types/html-element.type.d.ts +0 -7
  115. package/src/nameserver-history-viewer/types/index.d.ts +0 -27
  116. package/src/nameserver-history-viewer/types/item.types.d.ts +0 -12
  117. package/src/nameserver-history-viewer/types/legend-color.types.d.ts +0 -4
  118. package/src/nameserver-history-viewer/types/load-history-info-backup.types.d.ts +0 -7
  119. package/src/nameserver-history-viewer/types/load-history-info-columnstore.types.d.ts +0 -7
  120. package/src/nameserver-history-viewer/types/load-history-info-host.types.d.ts +0 -15
  121. package/src/nameserver-history-viewer/types/load-history-info-item.types.d.ts +0 -13
  122. package/src/nameserver-history-viewer/types/load-history-info-persistence.types.d.ts +0 -11
  123. package/src/nameserver-history-viewer/types/load-history-info-rowstore.types.d.ts +0 -5
  124. package/src/nameserver-history-viewer/types/load-history-info-server.types.d.ts +0 -10
  125. package/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.d.ts +0 -10
  126. package/src/nameserver-history-viewer/types/load-history-info-sql.types.d.ts +0 -16
  127. package/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.d.ts +0 -5
  128. package/src/nameserver-history-viewer/types/load-history-info-threads.types.d.ts +0 -9
  129. package/src/nameserver-history-viewer/types/load-history-info.types.d.ts +0 -22
  130. package/src/nameserver-history-viewer/types/port.types.d.ts +0 -5
  131. package/src/nameserver-history-viewer/types/scale-group.types.d.ts +0 -15
  132. package/src/nameserver-history-viewer/types/unit-category.types.d.ts +0 -8
  133. package/src/nameserver-history-viewer/types/unit.types.d.ts +0 -12
  134. package/src/nameserver-history-viewer/utils/chart-util.d.ts +0 -14
  135. package/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.d.ts +0 -89
  136. package/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.d.ts +0 -32
  137. package/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.d.ts +0 -78
  138. package/src/nameserver-history-viewer/utils/chartjs-downsample/index.d.ts +0 -1
  139. package/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.d.ts +0 -57
  140. package/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.d.ts +0 -55
  141. package/src/nameserver-history-viewer/utils/chartjs-downsample/utils.d.ts +0 -64
  142. package/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.d.ts +0 -30
  143. package/src/nameserver-history-viewer/utils/chartjs-zoom/index.d.ts +0 -1
  144. package/src/nameserver-history-viewer/utils/file-util.d.ts +0 -68
  145. package/src/nameserver-history-viewer/utils/index.d.ts +0 -4
  146. package/src/nameserver-history-viewer/utils/time-util.d.ts +0 -23
  147. package/src/nameserver-history-viewer/utils/ui-util.d.ts +0 -41
@@ -1,557 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { getIgnoredLineNumFromTail, isUnitTimeRelated, getValueByUnit, getRoundedValue, calculateYScale } from '../utils';
3
- import { ScaleGroup, Unit, UnitType, Item } from '../types';
4
- import * as i0 from "@angular/core";
5
- // Using dynamic flag to fix the issue of ng-packagr #696: Lambda not supported
6
- // @dynamic
7
- export class UIService {
8
- constructor() {
9
- this._DEFAULT_DISPLAY_ITEMS = ['cpuUsed', 'indexserverMemUsed', 'mvccNum'];
10
- this._HIDED_COLUMNS = [Item.yScaleGroup, Item.description];
11
- this._MEASURE_COLUMNS = [Item.max, Item.average, Item.sum, Item.last];
12
- this._loadHistoryInfos = {};
13
- }
14
- /**
15
- * get the colors for legends
16
- */
17
- static getColors(alpha = null) {
18
- if (alpha == null) {
19
- alpha = 0.8;
20
- }
21
- return {
22
- cpuUsed: this._getRgbColor(199, 21, 133, alpha),
23
- memoryResident: this._getRgbColor(238, 130, 238, alpha),
24
- memoryTotalResident: this._getRgbColor(72, 61, 139, alpha),
25
- memoryUsed: this._getRgbColor(0, 0, 205, alpha),
26
- memoryLimit: this._getRgbColor(255, 105, 180, alpha),
27
- memorySize: this._getRgbColor(70, 130, 180, alpha),
28
- diskUsed: this._getRgbColor(25, 25, 112, alpha),
29
- diskSize: this._getRgbColor(0, 255, 255, alpha),
30
- networkIn: this._getRgbColor(102, 51, 153, alpha),
31
- networkOut: this._getRgbColor(245, 222, 179, alpha),
32
- swapIn: this._getRgbColor(47, 79, 79, alpha),
33
- swapOut: this._getRgbColor(205, 92, 92, alpha),
34
- indexserverCpu: this._getRgbColor(255, 99, 71, alpha),
35
- indexserverCpuSys: this._getRgbColor(255, 20, 147, alpha),
36
- indexserverMemUsed: this._getRgbColor(0, 255, 0, alpha),
37
- indexserverMemLimit: this._getRgbColor(139, 0, 0, alpha),
38
- indexserverHandles: this._getRgbColor(139, 0, 139, alpha),
39
- indexserverPingtime: this._getRgbColor(189, 183, 107, alpha),
40
- indexserverSwapIn: this._getRgbColor(112, 128, 144, alpha),
41
- sqlConnections: this._getRgbColor(85, 107, 47, alpha),
42
- internalConnections: this._getRgbColor(46, 139, 87, alpha),
43
- externalConnections: this._getRgbColor(147, 112, 219, alpha),
44
- idleConnections: this._getRgbColor(216, 191, 216, alpha),
45
- sqlTransactions: this._getRgbColor(220, 20, 60, alpha),
46
- internalTransactions: this._getRgbColor(186, 85, 211, alpha),
47
- externalTransactions: this._getRgbColor(221, 160, 221, alpha),
48
- userTransactions: this._getRgbColor(210, 105, 30, alpha),
49
- sqlBlockedTrans: this._getRgbColor(0, 0, 255, alpha),
50
- sqlStatements: this._getRgbColor(188, 143, 143, alpha),
51
- cidRange: this._getRgbColor(32, 178, 170, alpha),
52
- tidRange: this._getRgbColor(124, 252, 0, alpha),
53
- pendingRequestCount: this._getRgbColor(160, 32, 240, alpha),
54
- mvccNum: this._getRgbColor(65, 105, 225, alpha),
55
- acquiredRecordLocks: this._getRgbColor(0, 250, 154, alpha),
56
- searchCount: this._getRgbColor(127, 255, 212, alpha),
57
- indexingCount: this._getRgbColor(0, 191, 255, alpha),
58
- mergeCount: this._getRgbColor(135, 206, 235, alpha),
59
- unloadCount: this._getRgbColor(255, 165, 0, alpha),
60
- indexserverThreads: this._getRgbColor(0, 100, 0, alpha),
61
- waitingThreads: this._getRgbColor(176, 48, 96, alpha),
62
- totalThreads: this._getRgbColor(100, 149, 237, alpha),
63
- activeSqlExecutors: this._getRgbColor(175, 238, 238, alpha),
64
- waitingSqlExecutors: this._getRgbColor(50, 205, 50, alpha),
65
- totalSqlExecutors: this._getRgbColor(240, 230, 140, alpha),
66
- dataWriteSize: this._getRgbColor(102, 205, 170, alpha),
67
- dataWriteTime: this._getRgbColor(169, 169, 169, alpha),
68
- logWriteSize: this._getRgbColor(160, 82, 45, alpha),
69
- logWriteTime: this._getRgbColor(128, 128, 0, alpha),
70
- dataReadSize: this._getRgbColor(255, 215, 0, alpha),
71
- dataReadTime: this._getRgbColor(95, 158, 160, alpha),
72
- logReadSize: this._getRgbColor(255, 0, 0, alpha),
73
- logReadTime: this._getRgbColor(184, 134, 11, alpha),
74
- dataBackupWriteSize: this._getRgbColor(255, 255, 0, alpha),
75
- dataBackupWriteTime: this._getRgbColor(154, 205, 50, alpha),
76
- logBackupWriteSize: this._getRgbColor(0, 0, 139, alpha),
77
- logBackupWriteTime: this._getRgbColor(219, 112, 147, alpha),
78
- mutexCollisionCount: this._getRgbColor(244, 164, 96, alpha),
79
- readWriteLockCollisionCount: this._getRgbColor(233, 150, 122, alpha),
80
- admissinControlAdmitCount: this._getRgbColor(143, 188, 143, alpha),
81
- admissionControlRejectCount: this._getRgbColor(255, 0, 255, alpha),
82
- admissionControlWaitingRequests: this._getRgbColor(153, 50, 204, alpha),
83
- admissionControlWaitTime: this._getRgbColor(144, 238, 144, alpha), // lightgreen
84
- };
85
- }
86
- static get _unitType() {
87
- const unitType = {};
88
- unitType[Unit.PCT] = UnitType.TypeEA;
89
- unitType[Unit.MS] = UnitType.TypeEA;
90
- unitType[Unit.Empty] = UnitType.TypeEA;
91
- unitType[Unit.GB] = UnitType.TypeGB;
92
- unitType[Unit.MB] = UnitType.TypeMB;
93
- unitType[Unit.MBPerSec] = UnitType.TypeMBSec;
94
- unitType[Unit.SecPerSec] = UnitType.TypeSecSec;
95
- unitType[Unit.StmtPerSec] = UnitType.TypeSec;
96
- unitType[Unit.ReqPerSec] = UnitType.TypeSec;
97
- unitType[Unit.ColPerSec] = UnitType.TypeSec;
98
- return unitType;
99
- }
100
- /**
101
- * get yScale group list from the enum ScaleGroup
102
- */
103
- static get _YScaleGroupList() {
104
- return Object.keys(ScaleGroup).filter(key => !isNaN(Number(ScaleGroup[key]))).map(key => ScaleGroup[key]);
105
- }
106
- /**
107
- * Generate one item by the provided attributes and values
108
- * @param args the dynamic parameter of [attribute, value]
109
- */
110
- static _generateLoadHistoryInfoItem(...args) {
111
- const obj = {};
112
- if (!args || args.length <= 0) {
113
- return obj;
114
- }
115
- args.forEach(item => {
116
- if (item && item.length >= 2) {
117
- obj[item[0]] = item[1];
118
- }
119
- });
120
- return obj;
121
- }
122
- /**
123
- * generate the loadHistoryInfo object with default values.
124
- */
125
- static _generateLoadHistoryInfo() {
126
- // minimum value for YScale of swapIn, swapOut, indexserverSwapIn is 100 (according to hana studio)
127
- const infoItem = UIService._generateLoadHistoryInfoItem; // just for making the name shorter...
128
- const cpuUsed = infoItem([Item.kpi, 'CPU'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.CPU], [Item.unit, Unit.PCT], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'CPU Used by all processes']);
129
- const memoryResident = infoItem([Item.kpi, 'Database Resident Memory'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Physical memory used for all HANA processes']);
130
- const memoryTotalResident = infoItem([Item.kpi, 'Total Resident Memory'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Physical memory used for all processes']);
131
- const memoryUsed = infoItem([Item.kpi, 'Database Used Memory'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Memory used for all HANA processes']);
132
- const memoryLimit = infoItem([Item.kpi, 'Database Allocation Limit'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Memory allocation limit for all processes of HANA instance']);
133
- const memorySize = infoItem([Item.kpi, 'Physical Memory Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Physical memory size']);
134
- const diskUsed = infoItem([Item.kpi, 'Disk Used'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Disk], [Item.unit, Unit.GB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Disk used']);
135
- const diskSize = infoItem([Item.kpi, 'Disk Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Disk], [Item.unit, Unit.GB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Disk size']);
136
- const networkIn = infoItem([Item.kpi, 'Network In'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Network], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from network by all processes']);
137
- const networkOut = infoItem([Item.kpi, 'Network Out'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Network], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to network by all processes']);
138
- const swapIn = infoItem([Item.kpi, 'Swap In'], [Item.yScale, 100], [Item.yScaleGroup, ScaleGroup.Swap], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from swap by all processes (pswpin line in /proc/vmstat * sysconf(_SC_PAGESIZE))']);
139
- const swapOut = infoItem([Item.kpi, 'Swap Out'], [Item.yScale, 100], [Item.yScaleGroup, ScaleGroup.Swap], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written To swap by all processes (pswpout line in /proc/vmstat * sysconf(_SC_PAGESIZE))']);
140
- const indexserverCpu = infoItem([Item.kpi, 'Index Server CPU'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.CPU], [Item.unit, Unit.PCT], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'CPU used by Service']);
141
- const indexserverCpuSys = infoItem([Item.kpi, 'System CPU'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.CPU], [Item.unit, Unit.PCT], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'OS Kernel/System CPU used by Service']);
142
- const indexserverMemUsed = infoItem([Item.kpi, 'Memory Used'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Memory used by Service']);
143
- const indexserverMemLimit = infoItem([Item.kpi, 'Memory Allocation Limit'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Memory], [Item.unit, Unit.MB], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Memory allocation limit for Service']);
144
- const indexserverHandles = infoItem([Item.kpi, 'Handles'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open handles']);
145
- const indexserverPingtime = infoItem([Item.kpi, 'Ping Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.MS], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Duration of Service ping request (THREAD_METHOD=\'__nsWatchdog\'). This request includes the collection of service specific KPI\'s']);
146
- const indexserverSwapIn = infoItem([Item.kpi, 'Index Server Swap In'], [Item.yScale, 100], [Item.yScaleGroup, ScaleGroup.Swap], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from swap by Service (column 12(majflt) in /proc/<pid>/stat * sysconf(_SC_PAGESIZE))']);
147
- const sqlConnections = infoItem([Item.kpi, 'Open Connections'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Conn], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL connections']);
148
- const internalConnections = infoItem([Item.kpi, 'Internal Connections'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Conn], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL internal connections']);
149
- const externalConnections = infoItem([Item.kpi, 'External Connections'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Conn], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL external connections']);
150
- const idleConnections = infoItem([Item.kpi, 'Idle Connections'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Conn], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL idle connections']);
151
- const sqlTransactions = infoItem([Item.kpi, 'Open Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Trans], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of open SQL transactions']);
152
- const internalTransactions = infoItem([Item.kpi, 'Internal Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Trans], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of internal transactions']);
153
- const externalTransactions = infoItem([Item.kpi, 'External Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Trans], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of external transactions']);
154
- const userTransactions = infoItem([Item.kpi, 'User Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Trans], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of user transactions']);
155
- const sqlBlockedTrans = infoItem([Item.kpi, 'Blocked Transactions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of blocked SQL transactions']);
156
- const sqlStatements = infoItem([Item.kpi, 'Statements'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Stmt], [Item.unit, Unit.StmtPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of finished SQL statements']);
157
- const cidRange = infoItem([Item.kpi, 'Active Commit ID Range'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Range between newest and oldest active commit ID']);
158
- const tidRange = infoItem([Item.kpi, 'Active Transaction ID Range'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Range between newest and oldest active transaction ID']);
159
- const pendingRequestCount = infoItem([Item.kpi, 'Pending Request Count'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of pending session requests']);
160
- const mvccNum = infoItem([Item.kpi, 'Active Versions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of active MVCC versions']);
161
- const acquiredRecordLocks = infoItem([Item.kpi, 'Acquired Record Locks'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of acquired record locks']);
162
- const searchCount = infoItem([Item.kpi, 'Read Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Req], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of read requests (select)']);
163
- const indexingCount = infoItem([Item.kpi, 'Write Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Req], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of write requests (insert,update,delete)']);
164
- const mergeCount = infoItem([Item.kpi, 'Merge Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Req], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of merge requests']);
165
- const unloadCount = infoItem([Item.kpi, 'Column Unloads'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Req], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of column unloads']);
166
- const indexserverThreads = infoItem([Item.kpi, 'Active Threads'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of active threads']);
167
- const waitingThreads = infoItem([Item.kpi, 'Waiting Threads'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of waiting threads']);
168
- const totalThreads = infoItem([Item.kpi, 'Total Threads'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Total number of threads']);
169
- const activeSqlExecutors = infoItem([Item.kpi, 'Active SqlExecutors'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of active SqlExecutors']);
170
- const waitingSqlExecutors = infoItem([Item.kpi, 'Waiting SqlExecutors'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of waiting SqlExecutors']);
171
- const totalSqlExecutors = infoItem([Item.kpi, 'Total SqlExecutors'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.Empty], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Total number of SqlExecutors']);
172
- const dataWriteSize = infoItem([Item.kpi, 'Data Write Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to data area']);
173
- const dataWriteTime = infoItem([Item.kpi, 'Data Write Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for writing to data area']);
174
- const logWriteSize = infoItem([Item.kpi, 'Log Write Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to log area']);
175
- const logWriteTime = infoItem([Item.kpi, 'Log Write Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for writing to log area']);
176
- const dataReadSize = infoItem([Item.kpi, 'Data Read Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from data area']);
177
- const dataReadTime = infoItem([Item.kpi, 'Data Read Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for reading from data area']);
178
- const logReadSize = infoItem([Item.kpi, 'Log Read Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes read from log area']);
179
- const logReadTime = infoItem([Item.kpi, 'Log Read Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for reading from log area']);
180
- const dataBackupWriteSize = infoItem([Item.kpi, 'Data Backup Write Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to data backup']);
181
- const dataBackupWriteTime = infoItem([Item.kpi, 'Data Backup Write Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for writing to data backup']);
182
- const logBackupWriteSize = infoItem([Item.kpi, 'Log Backup Write Size'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRSize], [Item.unit, Unit.MBPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Bytes written to log backup']);
183
- const logBackupWriteTime = infoItem([Item.kpi, 'Log Backup Write Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.WRTime], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Time used for writing to log backup']);
184
- const mutexCollisionCount = infoItem([Item.kpi, 'Mutex Collisions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ColPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of collisions on mutexes']);
185
- const readWriteLockCollisionCount = infoItem([Item.kpi, 'Read/Write Lock Collisions'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ColPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of collisions on read/write locks']);
186
- const admissinControlAdmitCount = infoItem([Item.kpi, 'Admitted Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests admitted by admission control']);
187
- const admissionControlRejectCount = infoItem([Item.kpi, 'Rejected Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests rejected by admission control']);
188
- const admissionControlWaitingRequests = infoItem([Item.kpi, 'Waiting Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests waiting in admission control queue']);
189
- const admissionControlWaitTime = infoItem([Item.kpi, 'Wait Time'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.SecPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Total wait time of session requests queued in admission control queue']);
190
- const admissionControlEnqueueCount = infoItem([Item.kpi, 'Enqueued Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests enqueued by admission control']);
191
- const admissionControlDequeueCount = infoItem([Item.kpi, 'Dequeued Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of session requests dequeued by admission control']);
192
- const admissionControlTimeoutCount = infoItem([Item.kpi, 'Timed out Requests'], [Item.yScale, 0,], [Item.yScaleGroup, ScaleGroup.Unknown], [Item.unit, Unit.ReqPerSec], [Item.max, -1], [Item.average, -1], [Item.sum, -1], [Item.last, -1], [Item.description, 'Number of timed out session requests in admission control queue']);
193
- // generate Host
194
- const loadHistoryInfoHost = {
195
- cpuUsed: cpuUsed,
196
- memoryResident: memoryResident,
197
- memoryTotalResident: memoryTotalResident,
198
- memoryUsed: memoryUsed,
199
- memoryLimit: memoryLimit,
200
- memorySize: memorySize,
201
- diskUsed: diskUsed,
202
- diskSize: diskSize,
203
- networkIn: networkIn,
204
- networkOut: networkOut,
205
- swapIn: swapIn,
206
- swapOut: swapOut,
207
- };
208
- // generate Index Server
209
- const loadHistoryInfoIndexServer = {
210
- indexserverCpu: indexserverCpu,
211
- indexserverCpuSys: indexserverCpuSys,
212
- indexserverMemUsed: indexserverMemUsed,
213
- indexserverMemLimit: indexserverMemLimit,
214
- indexserverHandles: indexserverHandles,
215
- indexserverPingtime: indexserverPingtime,
216
- indexserverSwapIn: indexserverSwapIn,
217
- };
218
- // generate SQL
219
- const loadHistoryInfoSQL = {
220
- sqlConnections: sqlConnections,
221
- internalConnections: internalConnections,
222
- externalConnections: externalConnections,
223
- idleConnections: idleConnections,
224
- sqlTransactions: sqlTransactions,
225
- internalTransactions: internalTransactions,
226
- externalTransactions: externalTransactions,
227
- userTransactions: userTransactions,
228
- sqlBlockedTrans: sqlBlockedTrans,
229
- sqlStatements: sqlStatements,
230
- cidRange: cidRange,
231
- tidRange: tidRange,
232
- pendingRequestCount: pendingRequestCount,
233
- };
234
- // generate Row Store
235
- const loadHistoryInfoRowStore = {
236
- mvccNum: mvccNum,
237
- acquiredRecordLocks: acquiredRecordLocks,
238
- };
239
- // generate Column Store
240
- const loadHistoryInfoColumnStore = {
241
- searchCount: searchCount,
242
- indexingCount: indexingCount,
243
- mergeCount: mergeCount,
244
- unloadCount: unloadCount,
245
- };
246
- // generate Threads
247
- const loadHistoryInfoThreads = {
248
- indexserverThreads: indexserverThreads,
249
- waitingThreads: waitingThreads,
250
- totalThreads: totalThreads,
251
- activeSqlExecutors: activeSqlExecutors,
252
- waitingSqlExecutors: waitingSqlExecutors,
253
- totalSqlExecutors: totalSqlExecutors,
254
- };
255
- // generate Persistence
256
- const loadHistoryInfoPersistence = {
257
- dataWriteSize: dataWriteSize,
258
- dataWriteTime: dataWriteTime,
259
- logWriteSize: logWriteSize,
260
- logWriteTime: logWriteTime,
261
- dataReadSize: dataReadSize,
262
- dataReadTime: dataReadTime,
263
- logReadSize: logReadSize,
264
- logReadTime: logReadTime,
265
- };
266
- // generate Backup
267
- const loadHistoryInfoBackup = {
268
- dataBackupWriteSize: dataBackupWriteSize,
269
- dataBackupWriteTime: dataBackupWriteTime,
270
- logBackupWriteSize: logBackupWriteSize,
271
- logBackupWriteTime: logBackupWriteTime,
272
- };
273
- // generate Synchronization Primitives
274
- const loadHistoryInfoSynchronizationPrimitives = {
275
- mutexCollisionCount: mutexCollisionCount,
276
- readWriteLockCollisionCount: readWriteLockCollisionCount,
277
- };
278
- // Session Admission Control
279
- const loadHistoryInfoSessionAdmissionControl = {
280
- admissinControlAdmitCount: admissinControlAdmitCount,
281
- admissionControlRejectCount: admissionControlRejectCount,
282
- admissionControlWaitingRequests: admissionControlWaitingRequests,
283
- admissionControlWaitTime: admissionControlWaitTime,
284
- admissionControlEnqueueCount: admissionControlEnqueueCount,
285
- admissionControlDequeueCount: admissionControlDequeueCount,
286
- admissionControlTimeoutCount: admissionControlTimeoutCount,
287
- };
288
- return {
289
- 'Host': loadHistoryInfoHost,
290
- 'Index Server': loadHistoryInfoIndexServer,
291
- 'SQL': loadHistoryInfoSQL,
292
- 'Row Store': loadHistoryInfoRowStore,
293
- 'Column Store': loadHistoryInfoColumnStore,
294
- 'Threads': loadHistoryInfoThreads,
295
- 'Persistence': loadHistoryInfoPersistence,
296
- 'Backup': loadHistoryInfoBackup,
297
- 'Synchronization Primitives': loadHistoryInfoSynchronizationPrimitives,
298
- 'Session Admission Control': loadHistoryInfoSessionAdmissionControl
299
- };
300
- }
301
- /**
302
- * get rgbcolor object via red, green, blue and alpha.
303
- */
304
- static _getRgbColor(red, green, blue, alpha) {
305
- return { red: red, green: green, blue: blue, alpha: alpha };
306
- }
307
- static _getYScaleForItem(item, yScale) {
308
- return yScale > item[Item.yScale] ? (item[Item.unit] === Unit.PCT ? 100 : yScale) : item[Item.yScale];
309
- }
310
- static _getMaxValueOfGroup(groupItems) {
311
- let max = 0;
312
- if (groupItems) {
313
- max = groupItems.reduce((maxValue, current) => {
314
- return current.Max > maxValue ? current.Max : maxValue;
315
- }, 0);
316
- }
317
- return max;
318
- }
319
- _getLoadHistoryInfo(port) {
320
- if (!this._loadHistoryInfos[port]) {
321
- this._loadHistoryInfos[port] = UIService._generateLoadHistoryInfo();
322
- }
323
- return this._loadHistoryInfos[port];
324
- }
325
- _getProcessingUnit(itemKey, port) {
326
- const historyDetailItem = this._getItemByKey(itemKey, port);
327
- if (historyDetailItem) {
328
- let unit = historyDetailItem.Unit;
329
- if (!unit) {
330
- unit = '';
331
- }
332
- return UIService._unitType[unit];
333
- }
334
- }
335
- _setOverview(key, overview, unit, port) {
336
- const historyDetailItem = this._getItemByKey(key, port);
337
- if (historyDetailItem) {
338
- historyDetailItem.Max = overview.Max >= 0 ? overview.Max : 0;
339
- historyDetailItem.Average = overview.Average >= 0 ? overview.Average : 0;
340
- // only TYPE_CONVERSION_MBSEC and TYPE_CONVERTION_SEC (eg: MB/s, req/s stmt/s...) need sum
341
- historyDetailItem.Sum = isUnitTimeRelated(unit) ? (overview.Sum >= 0 ? overview.Sum : 0) : '-';
342
- historyDetailItem.Last = overview.Last >= 0 ? overview.Last : 0;
343
- }
344
- }
345
- /**
346
- * convert unit values (eg: byte to MB or GB) and generate the control data (sum, max, avg) for one row
347
- */
348
- _convertUnitAndGenerateRowControlData(row, key, unit, port) {
349
- return new Promise(resolve => {
350
- if (row) {
351
- const overview = { Sum: 0, Max: 0, Average: 0, Last: 0 };
352
- const ignoredTailLineNum = getIgnoredLineNumFromTail();
353
- let invalidCount = 0;
354
- // convert unit and calculate the overview data, skip the first, and last three rows.
355
- row.forEach((item, index, arrayData) => {
356
- // skip ignored line(s) from tail
357
- if (index <= row.length - ignoredTailLineNum - 1) {
358
- if (arrayData[index].y >= 0) {
359
- arrayData[index].y = getValueByUnit(item.y, unit);
360
- overview.Sum += arrayData[index].y;
361
- if (isUnitTimeRelated(unit)) {
362
- if (index === 0) {
363
- // according to hana studio, for those time related column, the first value is set to 0
364
- arrayData[index].y = 0;
365
- }
366
- else {
367
- // get value for unit like: MB/s (value / seconds)
368
- const timeDiff = arrayData[index].x - arrayData[index - 1].x;
369
- arrayData[index].y = timeDiff !== 0 ? arrayData[index].y * 1000 / timeDiff : 0;
370
- }
371
- }
372
- arrayData[index].y = getRoundedValue(arrayData[index].y);
373
- if (arrayData[index].y > overview.Max) {
374
- overview.Max = arrayData[index].y;
375
- }
376
- }
377
- else {
378
- // set value to 0, for those points with value -1 or < 0
379
- arrayData[index].y = 0;
380
- // invalid count + 1, for calculating the average (not time relative)
381
- invalidCount++;
382
- }
383
- }
384
- });
385
- if (row.length >= (ignoredTailLineNum + invalidCount)) {
386
- if (isUnitTimeRelated(unit)) {
387
- const timePeriod = row[row.length - ignoredTailLineNum - 1].x - row[0].x;
388
- overview.Average = timePeriod !== 0 ? getRoundedValue(overview.Sum * 1000 / timePeriod) : 0;
389
- }
390
- else {
391
- const validItemCount = row.length - ignoredTailLineNum - invalidCount;
392
- overview.Average = validItemCount > 0 ? getRoundedValue(overview.Sum / validItemCount) : 0;
393
- }
394
- overview.Last = row[row.length - ignoredTailLineNum - 1].y;
395
- overview.Sum = getRoundedValue(overview.Sum);
396
- overview.Max = getRoundedValue(overview.Max);
397
- // remove those ignored lines
398
- row.length = row.length - ignoredTailLineNum;
399
- }
400
- this._setOverview(key, overview, unit, port);
401
- }
402
- resolve();
403
- });
404
- }
405
- /**
406
- * Loop from all history items, put those history items which
407
- * have the same yScaleGroup together, using yScaleGroup as key.
408
- * eg: {__SCALE_GROUP_CPU:[item1, item2...], __SCALE_GROUP_UNKNOWN:[item3, item4...]}
409
- */
410
- _getYScaleGroupWithHistoryItems(port) {
411
- const yScaleGroup = {};
412
- const loadHistoryInfo = this._getLoadHistoryInfo(port);
413
- Object.keys(loadHistoryInfo).forEach(parentKey => {
414
- Object.keys(loadHistoryInfo[parentKey]).forEach(childKey => {
415
- const detailItem = loadHistoryInfo[parentKey][childKey];
416
- const yScaleGroupKey = detailItem._YScaleGroup;
417
- if (!yScaleGroup[yScaleGroupKey]) {
418
- yScaleGroup[yScaleGroupKey] = [];
419
- }
420
- yScaleGroup[yScaleGroupKey].push(detailItem);
421
- });
422
- });
423
- return yScaleGroup;
424
- }
425
- _setYScaleOfGroup(groupItems, group) {
426
- if (groupItems) {
427
- if (group === ScaleGroup.Unknown) {
428
- groupItems.forEach(item => item[Item.yScale] = UIService._getYScaleForItem(item, calculateYScale(item.Max)));
429
- }
430
- else {
431
- const yScale = calculateYScale(UIService._getMaxValueOfGroup(groupItems));
432
- groupItems.forEach(item => item[Item.yScale] = UIService._getYScaleForItem(item, yScale));
433
- }
434
- }
435
- }
436
- _getItemByKey(key, port) {
437
- const loadHistoryInfo = this._getLoadHistoryInfo(port);
438
- for (const itemKey of Object.keys(loadHistoryInfo)) {
439
- if (key in loadHistoryInfo[itemKey]) {
440
- return loadHistoryInfo[itemKey][key];
441
- }
442
- }
443
- }
444
- /**
445
- * reset the load history info object, to prevent memory leak
446
- */
447
- clearLoadHistoryInfos() {
448
- this._loadHistoryInfos = {};
449
- }
450
- /**
451
- * get all the data for the selection table
452
- */
453
- getSelectionTableRows(headerKeys, port, defaultDisplayItems) {
454
- const rows = [];
455
- const loadHistoryInfo = this._getLoadHistoryInfo(port);
456
- const defaultItems = defaultDisplayItems && defaultDisplayItems.length > 0 ? defaultDisplayItems : this._DEFAULT_DISPLAY_ITEMS;
457
- Object.keys(loadHistoryInfo).forEach(keyParent => {
458
- rows.push({ KPI: keyParent, header: true });
459
- const len = rows.length;
460
- rows.push(...Object.keys(loadHistoryInfo[keyParent])
461
- .filter(keyChild => headerKeys.includes(keyChild))
462
- .map(keyChild => {
463
- loadHistoryInfo[keyParent][keyChild].header = false;
464
- loadHistoryInfo[keyParent][keyChild].checked = defaultItems.includes(keyChild);
465
- return loadHistoryInfo[keyParent][keyChild];
466
- }));
467
- if (len === rows.length) {
468
- // no sub items, remove the header
469
- rows.pop();
470
- }
471
- });
472
- return rows;
473
- }
474
- /**
475
- * get all hidden columns. Those hidden columns = input hidden columns + default hidden columns
476
- * @param hideMeasureColumns the array contains the columns list that need to be hidden.
477
- */
478
- getHiddenColumns(hideMeasureColumns) {
479
- // only measure columns can be hidden
480
- const hideColumns = hideMeasureColumns ? hideMeasureColumns.filter(column => this._MEASURE_COLUMNS.includes(column)) : [];
481
- return hideColumns ? this._HIDED_COLUMNS.concat(hideColumns) : this._HIDED_COLUMNS;
482
- }
483
- /**
484
- * get header information and format it to {headKey: key, headText: text}
485
- */
486
- getHeader(keys, port) {
487
- return keys.map(key => {
488
- const item = this._getItemByKey(key, port);
489
- if (item != null && 'KPI' in item) {
490
- return ({ key: key, text: item.KPI });
491
- }
492
- else {
493
- console.warn(`${key} is not configured.`);
494
- }
495
- }).filter(key => key != null);
496
- }
497
- /**
498
- * Get the selected items, which need to be displayed on the chart.
499
- * @param headerKeys array that contains the keys of header
500
- * @param port the relative port
501
- * @param defaultDisplayItems the items list that will be displayed by default.
502
- */
503
- getDisplayItems(headerKeys, port, defaultDisplayItems) {
504
- const selectionTable = this.getSelectionTableRows(headerKeys, port, defaultDisplayItems);
505
- return selectionTable.filter(row => row.checked).map(row => row.KPI);
506
- }
507
- /**
508
- * Get the Y Scale by the keys and port
509
- */
510
- getYScale(keys, port) {
511
- const yScales = [];
512
- if (keys) {
513
- keys.forEach(key => {
514
- yScales.push(this._getItemByKey(key, port)[Item.yScale]);
515
- });
516
- }
517
- return yScales;
518
- }
519
- /**
520
- * Generate Y Scale for the port
521
- */
522
- generateYScale(port) {
523
- const yScaleGroup = this._getYScaleGroupWithHistoryItems(port);
524
- UIService._YScaleGroupList.forEach(group => {
525
- const historyItems = yScaleGroup[group];
526
- if (historyItems) {
527
- this._setYScaleOfGroup(historyItems, group);
528
- }
529
- });
530
- }
531
- /**
532
- * convert unit values (eg: byte to MB or GB) and generate the control data (sum, max, avg)
533
- * @param data the nameserver history data
534
- * @param header header list
535
- * @param port selected port
536
- */
537
- convertUnitAndGenerateControlData(data, header, port) {
538
- const promises = [];
539
- if (data && header) {
540
- data.forEach((row, index) => {
541
- if (row) {
542
- // get detail history item key, like indexserverCpu
543
- const itemKey = header[index];
544
- const unit = this._getProcessingUnit(itemKey, port);
545
- promises.push(this._convertUnitAndGenerateRowControlData(row, itemKey, unit, port));
546
- }
547
- });
548
- }
549
- return Promise.all(promises);
550
- }
551
- }
552
- UIService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: UIService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
553
- UIService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: UIService });
554
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: UIService, decorators: [{
555
- type: Injectable
556
- }] });
557
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyL3NlcnZpY2VzL3VpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUgsT0FBTyxFQWlCTCxVQUFVLEVBQ1YsSUFBSSxFQUNKLFFBQVEsRUFDUixJQUFJLEVBQ0wsTUFBTSxVQUFVLENBQUM7O0FBRWxCLCtFQUErRTtBQUMvRSxXQUFXO0FBRVgsTUFBTSxPQUFPLFNBQVM7SUFEdEI7UUFFbUIsMkJBQXNCLEdBQWEsQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEYsbUJBQWMsR0FBYSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hFLHFCQUFnQixHQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BGLHNCQUFpQixHQUFHLEVBQUUsQ0FBQztLQXVqQmhDO0lBcmpCQzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBZ0IsSUFBSTtRQUMxQyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDakIsS0FBSyxHQUFHLEdBQUcsQ0FBQztTQUNiO1FBQ0QsT0FBTztZQUNMLE9BQU8sRUFBMEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUM7WUFDdkUsY0FBYyxFQUFtQixJQUFJLENBQUMs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R0FBRyxDQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsMkJBQTJCLENBQUMsQ0FBQyxDQUFDO1FBQzdTLE1BQU0sY0FBYyxHQUFvQixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLDBCQUEwQixDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsNkNBQTZDLENBQUMsQ0FBQyxDQUFDO1FBQy9ULE1BQU0sbUJBQW1CLEdBQWUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLHdDQUF3QyxDQUFDLENBQUMsQ0FBQztRQUMxVCxNQUFNLFVBQVUsR0FBd0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxzQkFBc0IsQ0FBUSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLG9DQUFvQyxDQUFDLENBQUMsQ0FBQztRQUN0VCxNQUFNLFdBQVcsR0FBdUIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSwyQkFBMkIsQ0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLDREQUE0RCxDQUFDLENBQUMsQ0FBQztRQUM5VSxNQUFNLFVBQVUsR0FBd0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxzQkFBc0IsQ0FBUSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLHNCQUFzQixDQUFDLENBQUMsQ0FBQztRQUN4UyxNQUFNLFFBQVEsR0FBMEIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM3UixNQUFNLFFBQVEsR0FBMEIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM3UixNQUFNLFNBQVMsR0FBeUIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsMENBQTBDLENBQUMsQ0FBQyxDQUFDO1FBQzVULE1BQU0sVUFBVSxHQUF3QixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBaUIsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSwyQ0FBMkMsQ0FBQyxDQUFDLENBQUM7UUFDN1QsTUFBTSxNQUFNLEdBQTRCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFxQixFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FB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LEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLHdCQUF3QixDQUFDLENBQUMsQ0FBQztRQUMxUyxNQUFNLG1CQUFtQixHQUFlLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFtQixFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLG9JQUFvSSxDQUFDLENBQUMsQ0FBQztRQUN0WixNQUFNLGlCQUFpQixHQUFpQixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLHNCQUFzQixDQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsaUdBQWlHLENBQUMsQ0FBQyxDQUFDO1FBQ25YLE1BQU0sY0FBYyxHQUFvQixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDO1FBQ2xULE1BQU0sbUJBQW1CLEdBQWUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxzQkFBc0IsQ0FBUSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLHlDQUF5QyxDQUFDLENBQUMsQ0FBQztRQUMzVCxNQUFNLG1CQUFtQixHQUFlLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDLENBQUM7UUFDM1QsTUFBTSxlQUFlLEdBQW1CLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDLENBQUM7UUFDdlQsTUFBTSxlQUFlLEdBQW1CLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLENBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDLENBQUM7UUFDblQsTUFBTSxvQkFBb0IsR0FBYyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLHVCQUF1QixDQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJ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SUFBSSxDQUFDLFdBQVcsRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDLENBQUM7UUFDclQsTUFBTSxRQUFRLEdBQTBCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLENBQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxrREFBa0QsQ0FBQyxDQUFDLENBQUM7UUFDcFUsTUFBTSxRQUFRLEdBQTBCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsNkJBQTZCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFB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QUFhLEdBQXFCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxpREFBaUQsQ0FBQyxDQUFDLENBQUM7UUFDblUsTUFBTSxVQUFVLEdBQXdCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDLENBQUM7UUFDNVMsTUFBTSxXQUFXLEdBQXVCLFFBQVEsQ0FB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RSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLG9DQUFvQyxDQUFDLENBQUMsQ0FBQztRQUN0VCxNQUFNLFlBQVksR0FBc0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLDJCQUEyQixDQUFDLENBQUMsQ0FBQztRQUM3UyxNQUFNLFlBQVksR0FBc0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLG1DQUFtQyxDQUFDLENBQUMsQ0FBQztRQUNyVCxNQUFNLFlBQVksR0FBc0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLDJCQUEyQixDQUFDLENBQUMsQ0FBQztRQUM3UyxNQUFNLFlBQVksR0FBc0IsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLHNDQUFzQyxDQUFDLENBQUMsQ0FBQztRQUN4VCxNQUFNLFdBQVcsR0FBdUIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxlQUFlLENBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDLENBQUM7UUFDNVMsTUFBTSxXQUFXLEdBQXVCLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsTUFBTSxD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SSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2lCQUNyRjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0IsQ0FBQzs7dUdBMWpCVSxTQUFTOzJHQUFULFNBQVM7NEZBQVQsU0FBUztrQkFEckIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZ2V0SWdub3JlZExpbmVOdW1Gcm9tVGFpbCwgaXNVbml0VGltZVJlbGF0ZWQsIGdldFZhbHVlQnlVbml0LCBnZXRSb3VuZGVkVmFsdWUsIGNhbGN1bGF0ZVlTY2FsZSB9IGZyb20gJy4uL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBDb2xvclJnYmEsXHJcbiAgTG9hZEhpc3RvcnlJbmZvLFxyXG4gIExvYWRIaXN0b3J5SW5mb0JhY2t1cCxcclxuICBMb2FkSGlzdG9yeUluZm9Db2x1bW5TdG9yZSxcclxuICBMb2FkSGlzdG9yeUluZm9Ib3N0LFxyXG4gIExvYWRIaXN0b3J5SW5mb0luZGV4U2VydmVyLFxyXG4gIExvYWRIaXN0b3J5SW5mb0l0ZW0sXHJcbiAgTG9hZEhpc3RvcnlJbmZvUGVyc2lzdGVuY2UsXHJcbiAgTG9hZEhpc3RvcnlJbmZvUm93U3RvcmUsXHJcbiAgTG9hZEhpc3RvcnlJbmZvU2Vzc2lvbkFkbWlzc2lvbkNvbnRyb2wsXHJcbiAgTG9hZEhpc3RvcnlJbmZvU1FMLFxyXG4gIExvYWRIaXN0b3J5SW5mb1N5bmNQcmltaXRpdmVzLFxyXG4gIExvYWRIaXN0b3J5SW5mb1RocmVhZHMsXHJcbiAgQ2hhcnRDb250ZW50RGF0YUl0ZW0sXHJcbiAgQ2hhcnRDb250ZW50SGVhZGVyLFxyXG4gIExlZ2VuZENvbG9yLFxyXG4gIFNjYWxlR3JvdXAsXHJcbiAgVW5pdCxcclxuICBVbml0VHlwZSxcclxuICBJdGVtXHJcbn0gZnJvbSAnLi4vdHlwZXMnO1xyXG5cclxuLy8gVXNpbmcgZHluYW1pYyBmbGFnIHRvIGZpeCB0aGUgaXNzdWUgb2YgbmctcGFja2FnciAjNjk2OiBMYW1iZGEgbm90IHN1cHBvcnRlZFxyXG4vLyBAZHluYW1pY1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBVSVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX0RFRkFVTFRfRElTUExBWV9JVEVNUzogc3RyaW5nW10gPSBbJ2NwdVVzZWQnLCAnaW5kZXhzZXJ2ZXJNZW1Vc2VkJywgJ212Y2NOdW0nXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9ISURFRF9DT0xVTU5TOiBzdHJpbmdbXSA9IFtJdGVtLnlTY2FsZUdyb3VwLCBJdGVtLmRlc2NyaXB0aW9uXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9NRUFTVVJFX0NPTFVNTlM6IHN0cmluZ1tdID0gW0l0ZW0ubWF4LCBJdGVtLmF2ZXJhZ2UsIEl0ZW0uc3VtLCBJdGVtLmxhc3RdO1xyXG4gIHByaXZhdGUgX2xvYWRIaXN0b3J5SW5mb3MgPSB7fTtcclxuXHJcbiAgLyoqXHJcbiAgICogZ2V0IHRoZSBjb2xvcnMgZm9yIGxlZ2VuZHNcclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIGdldENvbG9ycyhhbHBoYTogbnVtYmVyID0gbnVsbCk6IExlZ2VuZENvbG9yIHtcclxuICAgIGlmIChhbHBoYSA9PSBudWxsKSB7XHJcbiAgICAgIGFscGhhID0gMC44O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY3B1VXNlZCAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTk5LCAyMSwgMTMzLCBhbHBoYSksIC8vIG1lZGl1bXZpb2xldHJlZFxyXG4gICAgICBtZW1vcnlSZXNpZGVudCAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyMzgsIDEzMCwgMjM4LCBhbHBoYSksIC8vIHZpb2xldFxyXG4gICAgICBtZW1vcnlUb3RhbFJlc2lkZW50ICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcig3MiwgNjEsIDEzOSwgYWxwaGEpLCAvLyBkYXJrc2xhdGVibHVlXHJcbiAgICAgIG1lbW9yeVVzZWQgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDAsIDAsIDIwNSwgYWxwaGEpLCAvLyBtZWRpdW1ibHVlXHJcbiAgICAgIG1lbW9yeUxpbWl0ICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI1NSwgMTA1LCAxODAsIGFscGhhKSwgLy8gaG90cGlua1xyXG4gICAgICBtZW1vcnlTaXplICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcig3MCwgMTMwLCAxODAsIGFscGhhKSwgLy8gc3RlZWxibHVlXHJcbiAgICAgIGRpc2tVc2VkICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI1LCAyNSwgMTEyLCBhbHBoYSksIC8vIG1pZG5pZ2h0Ymx1ZVxyXG4gICAgICBkaXNrU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigwLCAyNTUsIDI1NSwgYWxwaGEpLCAvLyBhcXVhXHJcbiAgICAgIG5ldHdvcmtJbiAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDEwMiwgNTEsIDE1MywgYWxwaGEpLCAvLyByZWJlY2NhcHVycGxlXHJcbiAgICAgIG5ldHdvcmtPdXQgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI0NSwgMjIyLCAxNzksIGFscGhhKSwgLy8gd2hlYXRcclxuICAgICAgc3dhcEluICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoNDcsIDc5LCA3OSwgYWxwaGEpLCAvLyBkYXJrc2xhdGVncmF5XHJcbiAgICAgIHN3YXBPdXQgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDIwNSwgOTIsIDkyLCBhbHBoYSksIC8vIGluZGlhbnJlZFxyXG4gICAgICBpbmRleHNlcnZlckNwdSAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyNTUsIDk5LCA3MSwgYWxwaGEpLCAvLyB0b21hdG9cclxuICAgICAgaW5kZXhzZXJ2ZXJDcHVTeXMgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjU1LCAyMCwgMTQ3LCBhbHBoYSksIC8vIGRlZXBwaW5rXHJcbiAgICAgIGluZGV4c2VydmVyTWVtVXNlZCAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDAsIDI1NSwgMCwgYWxwaGEpLCAvLyBsaW1lXHJcbiAgICAgIGluZGV4c2VydmVyTWVtTGltaXQgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDEzOSwgMCwgMCwgYWxwaGEpLCAvLyBkYXJrcmVkXHJcbiAgICAgIGluZGV4c2VydmVySGFuZGxlcyAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDEzOSwgMCwgMTM5LCBhbHBoYSksIC8vIGRhcmttYWdlbnRhXHJcbiAgICAgIGluZGV4c2VydmVyUGluZ3RpbWUgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE4OSwgMTgzLCAxMDcsIGFscGhhKSwgLy8gZGFya2toYWtpXHJcbiAgICAgIGluZGV4c2VydmVyU3dhcEluICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDExMiwgMTI4LCAxNDQsIGFscGhhKSwgLy8gc2xhdGVncmF5XHJcbiAgICAgIHNxbENvbm5lY3Rpb25zICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDg1LCAxMDcsIDQ3LCBhbHBoYSksIC8vIGRhcmtvbGl2ZWdyZWVuXHJcbiAgICAgIGludGVybmFsQ29ubmVjdGlvbnMgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDQ2LCAxMzksIDg3LCBhbHBoYSksIC8vIHNlYWdyZWVuXHJcbiAgICAgIGV4dGVybmFsQ29ubmVjdGlvbnMgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE0NywgMTEyLCAyMTksIGFscGhhKSwgLy8gbWVkaXVtcHVycGxlXHJcbiAgICAgIGlkbGVDb25uZWN0aW9ucyAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDIxNiwgMTkxLCAyMTYsIGFscGhhKSwgLy8gdGhpc3RsZVxyXG4gICAgICBzcWxUcmFuc2FjdGlvbnMgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyMjAsIDIwLCA2MCwgYWxwaGEpLCAvLyBjcmltc29uXHJcbiAgICAgIGludGVybmFsVHJhbnNhY3Rpb25zICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE4NiwgODUsIDIxMSwgYWxwaGEpLCAvLyBtZWRpdW1vcmNoaWRcclxuICAgICAgZXh0ZXJuYWxUcmFuc2FjdGlvbnMgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjIxLCAxNjAsIDIyMSwgYWxwaGEpLCAvLyBwbHVtXHJcbiAgICAgIHVzZXJUcmFuc2FjdGlvbnMgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDIxMCwgMTA1LCAzMCwgYWxwaGEpLCAvLyBjaG9jb2xhdGVcclxuICAgICAgc3FsQmxvY2tlZFRyYW5zICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMCwgMCwgMjU1LCBhbHBoYSksIC8vIGJsdWVcclxuICAgICAgc3FsU3RhdGVtZW50cyAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTg4LCAxNDMsIDE0MywgYWxwaGEpLCAvLyByb3N5YnJvd25cclxuICAgICAgY2lkUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMzIsIDE3OCwgMTcwLCBhbHBoYSksIC8vIGxpZ2h0c2VhZ3JlZW5cclxuICAgICAgdGlkUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTI0LCAyNTIsIDAsIGFscGhhKSwgLy8gbGF3bmdyZWVuXHJcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Q291bnQgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE2MCwgMzIsIDI0MCwgYWxwaGEpLCAvLyBwdXJwbGUzXHJcbiAgICAgIG12Y2NOdW0gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDY1LCAxMDUsIDIyNSwgYWxwaGEpLCAvLyByb3lhbGJsdWVcclxuICAgICAgYWNxdWlyZWRSZWNvcmRMb2NrcyAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMCwgMjUwLCAxNTQsIGFscGhhKSwgLy8gbWVkaXVtc3ByaW5nZ3JlZW5cclxuICAgICAgc2VhcmNoQ291bnQgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTI3LCAyNTUsIDIxMiwgYWxwaGEpLCAvLyBhcXVhbWFyaW5lXHJcbiAgICAgIGluZGV4aW5nQ291bnQgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDAsIDE5MSwgMjU1LCBhbHBoYSksIC8vIGRlZXBza3libHVlXHJcbiAgICAgIG1lcmdlQ291bnQgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDEzNSwgMjA2LCAyMzUsIGFscGhhKSwgLy8gc2t5Ymx1ZVxyXG4gICAgICB1bmxvYWRDb3VudCAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyNTUsIDE2NSwgMCwgYWxwaGEpLCAvLyBvcmFuZ2VcclxuICAgICAgaW5kZXhzZXJ2ZXJUaHJlYWRzICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMCwgMTAwLCAwLCBhbHBoYSksIC8vIGRhcmtncmVlblxyXG4gICAgICB3YWl0aW5nVGhyZWFkcyAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxNzYsIDQ4LCA5NiwgYWxwaGEpLCAvLyBtYXJvb24zXHJcbiAgICAgIHRvdGFsVGhyZWFkcyAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDEwMCwgMTQ5LCAyMzcsIGFscGhhKSwgLy8gY29ybmZsb3dlclxyXG4gICAgICBhY3RpdmVTcWxFeGVjdXRvcnMgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxNzUsIDIzOCwgMjM4LCBhbHBoYSksIC8vIHBhbGV0dXJxdW9pc2VcclxuICAgICAgd2FpdGluZ1NxbEV4ZWN1dG9ycyAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoNTAsIDIwNSwgNTAsIGFscGhhKSwgLy8gbGltZWdyZWVuXHJcbiAgICAgIHRvdGFsU3FsRXhlY3V0b3JzICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI0MCwgMjMwLCAxNDAsIGFscGhhKSwgLy8ga2hha2lcclxuICAgICAgZGF0YVdyaXRlU2l6ZSAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTAyLCAyMDUsIDE3MCwgYWxwaGEpLCAvLyBtZWRpdW1hcXVhbWFyaW5lXHJcbiAgICAgIGRhdGFXcml0ZVRpbWUgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE2OSwgMTY5LCAxNjksIGFscGhhKSwgLy8gZGFya2dyYXlcclxuICAgICAgbG9nV3JpdGVTaXplICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTYwLCA4MiwgNDUsIGFscGhhKSwgLy8gc2llbm5hXHJcbiAgICAgIGxvZ1dyaXRlVGltZSAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDEyOCwgMTI4LCAwLCBhbHBoYSksIC8vIG9saXZlXHJcbiAgICAgIGRhdGFSZWFkU2l6ZSAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI1NSwgMjE1LCAwLCBhbHBoYSksIC8vIGdvbGRcclxuICAgICAgZGF0YVJlYWRUaW1lICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoOTUsIDE1OCwgMTYwLCBhbHBoYSksIC8vIGNhZGV0Ymx1ZVxyXG4gICAgICBsb2dSZWFkU2l6ZSAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyNTUsIDAsIDAsIGFscGhhKSwgLy8gcmVkXHJcbiAgICAgIGxvZ1JlYWRUaW1lICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDE4NCwgMTM0LCAxMSwgYWxwaGEpLCAvLyBkYXJrZ29sZGVucm9kXHJcbiAgICAgIGRhdGFCYWNrdXBXcml0ZVNpemUgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDI1NSwgMjU1LCAwLCBhbHBoYSksIC8vIHllbGxvd1xyXG4gICAgICBkYXRhQmFja3VwV3JpdGVUaW1lICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxNTQsIDIwNSwgNTAsIGFscGhhKSwgLy8geWVsbG93Z3JlZW5cclxuICAgICAgbG9nQmFja3VwV3JpdGVTaXplICAgICAgICAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMCwgMCwgMTM5LCBhbHBoYSksIC8vIGRhcmtibHVlXHJcbiAgICAgIGxvZ0JhY2t1cFdyaXRlVGltZSAgICAgICAgICAgICA6IHRoaXMuX2dldFJnYkNvbG9yKDIxOSwgMTEyLCAxNDcsIGFscGhhKSwgLy8gcGFsZXZpb2xldHJlZFxyXG4gICAgICBtdXRleENvbGxpc2lvbkNvdW50ICAgICAgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyNDQsIDE2NCwgOTYsIGFscGhhKSwgLy8gc2FuZHlicm93blxyXG4gICAgICByZWFkV3JpdGVMb2NrQ29sbGlzaW9uQ291bnQgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigyMzMsIDE1MCwgMTIyLCBhbHBoYSksIC8vIGRhcmtzYWxtb25cclxuICAgICAgYWRtaXNzaW5Db250cm9sQWRtaXRDb3VudCAgICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMTQzLCAxODgsIDE0MywgYWxwaGEpLCAvLyBkYXJrc2VhZ3JlZW5cclxuICAgICAgYWRtaXNzaW9uQ29udHJvbFJlamVjdENvdW50ICAgIDogdGhpcy5fZ2V0UmdiQ29sb3IoMjU1LCAwLCAyNTUsIGFscGhhKSwgLy8gZnVjaHNpYVxyXG4gICAgICBhZG1pc3Npb25Db250cm9sV2FpdGluZ1JlcXVlc3RzOiB0aGlzLl9nZXRSZ2JDb2xvcigxNTMsIDUwLCAyMDQsIGFscGhhKSwgLy8gZGFya29yY2hpZFxyXG4gICAgICBhZG1pc3Npb25Db250cm9sV2FpdFRpbWUgICAgICAgOiB0aGlzLl9nZXRSZ2JDb2xvcigxNDQsIDIzOCwgMTQ0LCBhbHBoYSksIC8vIGxpZ2h0Z3JlZW5cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBnZXQgX3VuaXRUeXBlKCk6IGFueSB7XHJcbiAgICBjb25zdCB1bml0VHlwZSA9IHt9O1xyXG4gICAgdW5pdFR5cGVbVW5pdC5QQ1RdID0gVW5pdFR5cGUuVHlwZUVBO1xyXG4gICAgdW5pdFR5cGVbVW5pdC5NU10gPSBVbml0VHlwZS5UeXBlRUE7XHJcbiAgICB1bml0VHlwZVtVbml0LkVtcHR5XSA9IFVuaXRUeXBlLlR5cGVFQTtcclxuICAgIHVuaXRUeXBlW1VuaXQuR0JdID0gVW5pdFR5cGUuVHlwZUdCO1xyXG4gICAgdW5pdFR5cGVbVW5pdC5NQl0gPSBVbml0VHlwZS5UeXBlTUI7XHJcbiAgICB1bml0VHlwZVtVbml0Lk1CUGVyU2VjXSA9IFVuaXRUeXBlLlR5cGVNQlNlYztcclxuICAgIHVuaXRUeXBlW1VuaXQuU2VjUGVyU2VjXSA9IFVuaXRUeXBlLlR5cGVTZWNTZWM7XHJcbiAgICB1bml0VHlwZVtVbml0LlN0bXRQZXJTZWNdID0gVW5pdFR5cGUuVHlwZVNlYztcclxuICAgIHVuaXRUeXBlW1VuaXQuUmVxUGVyU2VjXSA9IFVuaXRUeXBlLlR5cGVTZWM7XHJcbiAgICB1bml0VHlwZVtVbml0LkNvbFBlclNlY10gPSBVbml0VHlwZS5UeXBlU2VjO1xyXG4gICAgcmV0dXJuIHVuaXRUeXBlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2V0IHlTY2FsZSBncm91cCBsaXN0IGZyb20gdGhlIGVudW0gU2NhbGVHcm91cFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIGdldCBfWVNjYWxlR3JvdXBMaXN0KCk6IGFueVtdIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhTY2FsZUdyb3VwKS5maWx0ZXIoa2V5ID0+ICFpc05hTihOdW1iZXIoU2NhbGVHcm91cFtrZXldKSkpLm1hcChrZXkgPT4gU2NhbGVHcm91cFtrZXldKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIG9uZSBpdGVtIGJ5IHRoZSBwcm92aWRlZCBhdHRyaWJ1dGVzIGFuZCB2YWx1ZXNcclxuICAgKiBAcGFyYW0gYXJncyB0aGUgZHluYW1pYyBwYXJhbWV0ZXIgb2YgW2F0dHJpYnV0ZSwgdmFsdWVdXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2dlbmVyYXRlTG9hZEhpc3RvcnlJbmZvSXRlbSguLi5hcmdzKTogTG9hZEhpc3RvcnlJbmZvSXRlbSB7XHJcbiAgICBjb25zdCBvYmogPSB7fTtcclxuICAgIGlmICghYXJncyB8fCBhcmdzLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgYXJncy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBpZiAoaXRlbSAmJiBpdGVtLmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgICAgb2JqW2l0ZW1bMF1dID0gaXRlbVsxXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2VuZXJhdGUgdGhlIGxvYWRIaXN0b3J5SW5mbyBvYmplY3Qgd2l0aCBkZWZhdWx0IHZhbHVlcy5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBfZ2VuZXJhdGVMb2FkSGlzdG9yeUluZm8oKTogTG9hZEhpc3RvcnlJbmZvIHtcclxuICAgIC8vIG1pbmltdW0gdmFsdWUgZm9yIFlTY2FsZSBvZiBzd2FwSW4sIHN3YXBPdXQsIGluZGV4c2VydmVyU3dhcEluIGlzIDEwMCAoYWNjb3JkaW5nIHRvIGhhbmEgc3R1ZGlvKVxyXG4gICAgY29uc3QgaW5mb0l0ZW0gPSBVSVNlcnZpY2UuX2dlbmVyYXRlTG9hZEhpc3RvcnlJbmZvSXRlbTsgLy8ganVzdCBmb3IgbWFraW5nIHRoZSBuYW1lIHNob3J0ZXIuLi5cclxuICAgIGNvbnN0IGNwdVVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdDUFUnICAgICAgICAgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5DUFUgICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5QQ1QgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQ1BVIFVzZWQgYnkgYWxsIHByb2Nlc3NlcyddKTtcclxuICAgIGNvbnN0IG1lbW9yeVJlc2lkZW50ICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdEYXRhYmFzZSBSZXNpZGVudCBNZW1vcnknICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5NZW1vcnkgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQiAgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnUGh5c2ljYWwgbWVtb3J5IHVzZWQgZm9yIGFsbCBIQU5BIHByb2Nlc3NlcyddKTtcclxuICAgIGNvbnN0IG1lbW9yeVRvdGFsUmVzaWRlbnQgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdUb3RhbCBSZXNpZGVudCBNZW1vcnknICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5NZW1vcnkgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQiAgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnUGh5c2ljYWwgbWVtb3J5IHVzZWQgZm9yIGFsbCBwcm9jZXNzZXMnXSk7XHJcbiAgICBjb25zdCBtZW1vcnlVc2VkICAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGF0YWJhc2UgVXNlZCBNZW1vcnknICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuTWVtb3J5IF0sIFtJdGVtLnVuaXQsIFVuaXQuTUIgICAgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ01lbW9yeSB1c2VkIGZvciBhbGwgSEFOQSBwcm9jZXNzZXMnXSk7XHJcbiAgICBjb25zdCBtZW1vcnlMaW1pdCAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGF0YWJhc2UgQWxsb2NhdGlvbiBMaW1pdCcgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuTWVtb3J5IF0sIFtJdGVtLnVuaXQsIFVuaXQuTUIgICAgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ01lbW9yeSBhbGxvY2F0aW9uIGxpbWl0IGZvciBhbGwgcHJvY2Vzc2VzIG9mIEhBTkEgaW5zdGFuY2UnXSk7XHJcbiAgICBjb25zdCBtZW1vcnlTaXplICAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnUGh5c2ljYWwgTWVtb3J5IFNpemUnICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuTWVtb3J5IF0sIFtJdGVtLnVuaXQsIFVuaXQuTUIgICAgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ1BoeXNpY2FsIG1lbW9yeSBzaXplJ10pO1xyXG4gICAgY29uc3QgZGlza1VzZWQgICAgICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0Rpc2sgVXNlZCcgICAgICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLkRpc2sgICBdLCBbSXRlbS51bml0LCBVbml0LkdCICAgICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdEaXNrIHVzZWQnXSk7XHJcbiAgICBjb25zdCBkaXNrU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGlzayBTaXplJyAgICAgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuRGlzayAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuR0IgICAgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ0Rpc2sgc2l6ZSddKTtcclxuICAgIGNvbnN0IG5ldHdvcmtJbiAgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdOZXR3b3JrIEluJyAgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5OZXR3b3JrXSwgW0l0ZW0udW5pdCwgVW5pdC5NQlBlclNlYyAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQnl0ZXMgcmVhZCBmcm9tIG5ldHdvcmsgYnkgYWxsIHByb2Nlc3NlcyddKTtcclxuICAgIGNvbnN0IG5ldHdvcmtPdXQgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdOZXR3b3JrIE91dCcgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5OZXR3b3JrXSwgW0l0ZW0udW5pdCwgVW5pdC5NQlBlclNlYyAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQnl0ZXMgd3JpdHRlbiB0byBuZXR3b3JrIGJ5IGFsbCBwcm9jZXNzZXMnXSk7XHJcbiAgICBjb25zdCBzd2FwSW4gICAgICAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnU3dhcCBJbicgICAgICAgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMTAwXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuU3dhcCAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuTUJQZXJTZWMgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ0J5dGVzIHJlYWQgZnJvbSBzd2FwIGJ5IGFsbCBwcm9jZXNzZXMgKHBzd3BpbiBsaW5lIGluIC9wcm9jL3Ztc3RhdCAqIHN5c2NvbmYoX1NDX1BBR0VTSVpFKSknXSk7XHJcbiAgICBjb25zdCBzd2FwT3V0ICAgICAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnU3dhcCBPdXQnICAgICAgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMTAwXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuU3dhcCAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuTUJQZXJTZWMgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ0J5dGVzIHdyaXR0ZW4gVG8gc3dhcCBieSBhbGwgcHJvY2Vzc2VzIChwc3dwb3V0IGxpbmUgaW4gL3Byb2Mvdm1zdGF0ICogc3lzY29uZihfU0NfUEFHRVNJWkUpKSddKTtcclxuICAgIGNvbnN0IGluZGV4c2VydmVyQ3B1ICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdJbmRleCBTZXJ2ZXIgQ1BVJyAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5DUFUgICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5QQ1QgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQ1BVIHVzZWQgYnkgU2VydmljZSddKTtcclxuICAgIGNvbnN0IGluZGV4c2VydmVyQ3B1U3lzICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdTeXN0ZW0gQ1BVJyAgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5DUFUgICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5QQ1QgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnT1MgS2VybmVsL1N5c3RlbSBDUFUgdXNlZCBieSBTZXJ2aWNlJ10pO1xyXG4gICAgY29uc3QgaW5kZXhzZXJ2ZXJNZW1Vc2VkICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ01lbW9yeSBVc2VkJyAgICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLk1lbW9yeSBdLCBbSXRlbS51bml0LCBVbml0Lk1CICAgICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdNZW1vcnkgdXNlZCBieSBTZXJ2aWNlJ10pO1xyXG4gICAgY29uc3QgaW5kZXhzZXJ2ZXJNZW1MaW1pdCAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ01lbW9yeSBBbGxvY2F0aW9uIExpbWl0JyAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLk1lbW9yeSBdLCBbSXRlbS51bml0LCBVbml0Lk1CICAgICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdNZW1vcnkgYWxsb2NhdGlvbiBsaW1pdCBmb3IgU2VydmljZSddKTtcclxuICAgIGNvbnN0IGluZGV4c2VydmVySGFuZGxlcyAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdIYW5kbGVzJyAgICAgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIG9wZW4gaGFuZGxlcyddKTtcclxuICAgIGNvbnN0IGluZGV4c2VydmVyUGluZ3RpbWUgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdQaW5nIFRpbWUnICAgICAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5NUyAgICAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnRHVyYXRpb24gb2YgU2VydmljZSBwaW5nIHJlcXVlc3QgKFRIUkVBRF9NRVRIT0Q9XFwnX19uc1dhdGNoZG9nXFwnKS4gVGhpcyByZXF1ZXN0IGluY2x1ZGVzIHRoZSBjb2xsZWN0aW9uIG9mIHNlcnZpY2Ugc3BlY2lmaWMgS1BJXFwncyddKTtcclxuICAgIGNvbnN0IGluZGV4c2VydmVyU3dhcEluICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdJbmRleCBTZXJ2ZXIgU3dhcCBJbicgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAxMDBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Td2FwICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQlBlclNlYyAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQnl0ZXMgcmVhZCBmcm9tIHN3YXAgYnkgU2VydmljZSAoY29sdW1uIDEyKG1hamZsdCkgaW4gL3Byb2MvPHBpZD4vc3RhdCAqIHN5c2NvbmYoX1NDX1BBR0VTSVpFKSknXSk7XHJcbiAgICBjb25zdCBzcWxDb25uZWN0aW9ucyAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnT3BlbiBDb25uZWN0aW9ucycgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuQ29ubiAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBvcGVuIFNRTCBjb25uZWN0aW9ucyddKTtcclxuICAgIGNvbnN0IGludGVybmFsQ29ubmVjdGlvbnMgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdJbnRlcm5hbCBDb25uZWN0aW9ucycgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Db25uICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIG9wZW4gU1FMIGludGVybmFsIGNvbm5lY3Rpb25zJ10pO1xyXG4gICAgY29uc3QgZXh0ZXJuYWxDb25uZWN0aW9ucyAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0V4dGVybmFsIENvbm5lY3Rpb25zJyAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLkNvbm4gICBdLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2Ygb3BlbiBTUUwgZXh0ZXJuYWwgY29ubmVjdGlvbnMnXSk7XHJcbiAgICBjb25zdCBpZGxlQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnSWRsZSBDb25uZWN0aW9ucycgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuQ29ubiAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBvcGVuIFNRTCBpZGxlIGNvbm5lY3Rpb25zJ10pO1xyXG4gICAgY29uc3Qgc3FsVHJhbnNhY3Rpb25zICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ09wZW4gVHJhbnNhY3Rpb25zJyAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlRyYW5zICBdLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2Ygb3BlbiBTUUwgdHJhbnNhY3Rpb25zJ10pO1xyXG4gICAgY29uc3QgaW50ZXJuYWxUcmFuc2FjdGlvbnMgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0ludGVybmFsIFRyYW5zYWN0aW9ucycgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlRyYW5zICBdLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgaW50ZXJuYWwgdHJhbnNhY3Rpb25zJ10pO1xyXG4gICAgY29uc3QgZXh0ZXJuYWxUcmFuc2FjdGlvbnMgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0V4dGVybmFsIFRyYW5zYWN0aW9ucycgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlRyYW5zICBdLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgZXh0ZXJuYWwgdHJhbnNhY3Rpb25zJ10pO1xyXG4gICAgY29uc3QgdXNlclRyYW5zYWN0aW9ucyAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1VzZXIgVHJhbnNhY3Rpb25zJyAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlRyYW5zICBdLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgdXNlciB0cmFuc2FjdGlvbnMnXSk7XHJcbiAgICBjb25zdCBzcWxCbG9ja2VkVHJhbnMgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnQmxvY2tlZCBUcmFuc2FjdGlvbnMnICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBibG9ja2VkIFNRTCB0cmFuc2FjdGlvbnMnXSk7XHJcbiAgICBjb25zdCBzcWxTdGF0ZW1lbnRzICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnU3RhdGVtZW50cycgICAgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuU3RtdCAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuU3RtdFBlclNlYyBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBmaW5pc2hlZCBTUUwgc3RhdGVtZW50cyddKTtcclxuICAgIGNvbnN0IGNpZFJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdBY3RpdmUgQ29tbWl0IElEIFJhbmdlJyAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnUmFuZ2UgYmV0d2VlbiBuZXdlc3QgYW5kIG9sZGVzdCBhY3RpdmUgY29tbWl0IElEJ10pO1xyXG4gICAgY29uc3QgdGlkUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0FjdGl2ZSBUcmFuc2FjdGlvbiBJRCBSYW5nZSddLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdSYW5nZSBiZXR3ZWVuIG5ld2VzdCBhbmQgb2xkZXN0IGFjdGl2ZSB0cmFuc2FjdGlvbiBJRCddKTtcclxuICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0Q291bnQgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdQZW5kaW5nIFJlcXVlc3QgQ291bnQnICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIHBlbmRpbmcgc2Vzc2lvbiByZXF1ZXN0cyddKTtcclxuICAgIGNvbnN0IG12Y2NOdW0gICAgICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdBY3RpdmUgVmVyc2lvbnMnICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIGFjdGl2ZSBNVkNDIHZlcnNpb25zJ10pO1xyXG4gICAgY29uc3QgYWNxdWlyZWRSZWNvcmRMb2NrcyAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0FjcXVpcmVkIFJlY29yZCBMb2NrcycgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgYWNxdWlyZWQgcmVjb3JkIGxvY2tzJ10pO1xyXG4gICAgY29uc3Qgc2VhcmNoQ291bnQgICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1JlYWQgUmVxdWVzdHMnICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlJlcSAgICBdLCBbSXRlbS51bml0LCBVbml0LlJlcVBlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgcmVhZCByZXF1ZXN0cyAoc2VsZWN0KSddKTtcclxuICAgIGNvbnN0IGluZGV4aW5nQ291bnQgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdXcml0ZSBSZXF1ZXN0cycgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5SZXEgICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5SZXFQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIHdyaXRlIHJlcXVlc3RzIChpbnNlcnQsdXBkYXRlLGRlbGV0ZSknXSk7XHJcbiAgICBjb25zdCBtZXJnZUNvdW50ICAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnTWVyZ2UgUmVxdWVzdHMnICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuUmVxICAgIF0sIFtJdGVtLnVuaXQsIFVuaXQuUmVxUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBtZXJnZSByZXF1ZXN0cyddKTtcclxuICAgIGNvbnN0IHVubG9hZENvdW50ICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdDb2x1bW4gVW5sb2FkcycgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5SZXEgICAgXSwgW0l0ZW0udW5pdCwgVW5pdC5SZXFQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIGNvbHVtbiB1bmxvYWRzJ10pO1xyXG4gICAgY29uc3QgaW5kZXhzZXJ2ZXJUaHJlYWRzICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0FjdGl2ZSBUaHJlYWRzJyAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgYWN0aXZlIHRocmVhZHMnXSk7XHJcbiAgICBjb25zdCB3YWl0aW5nVGhyZWFkcyAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnV2FpdGluZyBUaHJlYWRzJyAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiB3YWl0aW5nIHRocmVhZHMnXSk7XHJcbiAgICBjb25zdCB0b3RhbFRocmVhZHMgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnVG90YWwgVGhyZWFkcycgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuRW1wdHkgICAgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ1RvdGFsIG51bWJlciBvZiB0aHJlYWRzJ10pO1xyXG4gICAgY29uc3QgYWN0aXZlU3FsRXhlY3V0b3JzICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0FjdGl2ZSBTcWxFeGVjdXRvcnMnICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2YgYWN0aXZlIFNxbEV4ZWN1dG9ycyddKTtcclxuICAgIGNvbnN0IHdhaXRpbmdTcWxFeGVjdXRvcnMgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdXYWl0aW5nIFNxbEV4ZWN1dG9ycycgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5FbXB0eSAgICAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIHdhaXRpbmcgU3FsRXhlY3V0b3JzJ10pO1xyXG4gICAgY29uc3QgdG90YWxTcWxFeGVjdXRvcnMgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1RvdGFsIFNxbEV4ZWN1dG9ycycgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LkVtcHR5ICAgICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdUb3RhbCBudW1iZXIgb2YgU3FsRXhlY3V0b3JzJ10pO1xyXG4gICAgY29uc3QgZGF0YVdyaXRlU2l6ZSAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0RhdGEgV3JpdGUgU2l6ZScgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLldSU2l6ZSBdLCBbSXRlbS51bml0LCBVbml0Lk1CUGVyU2VjICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdCeXRlcyB3cml0dGVuIHRvIGRhdGEgYXJlYSddKTtcclxuICAgIGNvbnN0IGRhdGFXcml0ZVRpbWUgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdEYXRhIFdyaXRlIFRpbWUnICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5XUlRpbWUgXSwgW0l0ZW0udW5pdCwgVW5pdC5TZWNQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnVGltZSB1c2VkIGZvciB3cml0aW5nIHRvIGRhdGEgYXJlYSddKTtcclxuICAgIGNvbnN0IGxvZ1dyaXRlU2l6ZSAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdMb2cgV3JpdGUgU2l6ZScgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5XUlNpemUgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQlBlclNlYyAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQnl0ZXMgd3JpdHRlbiB0byBsb2cgYXJlYSddKTtcclxuICAgIGNvbnN0IGxvZ1dyaXRlVGltZSAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdMb2cgV3JpdGUgVGltZScgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5XUlRpbWUgXSwgW0l0ZW0udW5pdCwgVW5pdC5TZWNQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnVGltZSB1c2VkIGZvciB3cml0aW5nIHRvIGxvZyBhcmVhJ10pO1xyXG4gICAgY29uc3QgZGF0YVJlYWRTaXplICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0RhdGEgUmVhZCBTaXplJyAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLldSU2l6ZSBdLCBbSXRlbS51bml0LCBVbml0Lk1CUGVyU2VjICAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdCeXRlcyByZWFkIGZyb20gZGF0YSBhcmVhJ10pO1xyXG4gICAgY29uc3QgZGF0YVJlYWRUaW1lICAgICAgICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0RhdGEgUmVhZCBUaW1lJyAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLldSVGltZSBdLCBbSXRlbS51bml0LCBVbml0LlNlY1BlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdUaW1lIHVzZWQgZm9yIHJlYWRpbmcgZnJvbSBkYXRhIGFyZWEnXSk7XHJcbiAgICBjb25zdCBsb2dSZWFkU2l6ZSAgICAgICAgICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnTG9nIFJlYWQgU2l6ZScgICAgICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuV1JTaXplIF0sIFtJdGVtLnVuaXQsIFVuaXQuTUJQZXJTZWMgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ0J5dGVzIHJlYWQgZnJvbSBsb2cgYXJlYSddKTtcclxuICAgIGNvbnN0IGxvZ1JlYWRUaW1lICAgICAgICAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdMb2cgUmVhZCBUaW1lJyAgICAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5XUlRpbWUgXSwgW0l0ZW0udW5pdCwgVW5pdC5TZWNQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnVGltZSB1c2VkIGZvciByZWFkaW5nIGZyb20gbG9nIGFyZWEnXSk7XHJcbiAgICBjb25zdCBkYXRhQmFja3VwV3JpdGVTaXplICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGF0YSBCYWNrdXAgV3JpdGUgU2l6ZScgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuV1JTaXplIF0sIFtJdGVtLnVuaXQsIFVuaXQuTUJQZXJTZWMgICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ0J5dGVzIHdyaXR0ZW4gdG8gZGF0YSBiYWNrdXAnXSk7XHJcbiAgICBjb25zdCBkYXRhQmFja3VwV3JpdGVUaW1lICAgICAgICAgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRGF0YSBCYWNrdXAgV3JpdGUgVGltZScgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuV1JUaW1lIF0sIFtJdGVtLnVuaXQsIFVuaXQuU2VjUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ1RpbWUgdXNlZCBmb3Igd3JpdGluZyB0byBkYXRhIGJhY2t1cCddKTtcclxuICAgIGNvbnN0IGxvZ0JhY2t1cFdyaXRlU2l6ZSAgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdMb2cgQmFja3VwIFdyaXRlIFNpemUnICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5XUlNpemUgXSwgW0l0ZW0udW5pdCwgVW5pdC5NQlBlclNlYyAgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnQnl0ZXMgd3JpdHRlbiB0byBsb2cgYmFja3VwJ10pO1xyXG4gICAgY29uc3QgbG9nQmFja3VwV3JpdGVUaW1lICAgICAgICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0xvZyBCYWNrdXAgV3JpdGUgVGltZScgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLldSVGltZSBdLCBbSXRlbS51bml0LCBVbml0LlNlY1BlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdUaW1lIHVzZWQgZm9yIHdyaXRpbmcgdG8gbG9nIGJhY2t1cCddKTtcclxuICAgIGNvbnN0IG11dGV4Q29sbGlzaW9uQ291bnQgICAgICAgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdNdXRleCBDb2xsaXNpb25zJyAgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5Db2xQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIGNvbGxpc2lvbnMgb24gbXV0ZXhlcyddKTtcclxuICAgIGNvbnN0IHJlYWRXcml0ZUxvY2tDb2xsaXNpb25Db3VudCAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdSZWFkL1dyaXRlIExvY2sgQ29sbGlzaW9ucycgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5Db2xQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIGNvbGxpc2lvbnMgb24gcmVhZC93cml0ZSBsb2NrcyddKTtcclxuICAgIGNvbnN0IGFkbWlzc2luQ29udHJvbEFkbWl0Q291bnQgICAgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdBZG1pdHRlZCBSZXF1ZXN0cycgICAgICAgICAgXSwgW0l0ZW0ueVNjYWxlLCAwLCBdLCBbSXRlbS55U2NhbGVHcm91cCwgU2NhbGVHcm91cC5Vbmtub3duXSwgW0l0ZW0udW5pdCwgVW5pdC5SZXFQZXJTZWMgIF0sIFtJdGVtLm1heCwgLTFdLCBbSXRlbS5hdmVyYWdlLCAtMV0sIFtJdGVtLnN1bSwgLTFdLCBbSXRlbS5sYXN0LCAtMV0sIFtJdGVtLmRlc2NyaXB0aW9uLCAnTnVtYmVyIG9mIHNlc3Npb24gcmVxdWVzdHMgYWRtaXR0ZWQgYnkgYWRtaXNzaW9uIGNvbnRyb2wnXSk7XHJcbiAgICBjb25zdCBhZG1pc3Npb25Db250cm9sUmVqZWN0Q291bnQgICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnUmVqZWN0ZWQgUmVxdWVzdHMnICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuUmVxUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBzZXNzaW9uIHJlcXVlc3RzIHJlamVjdGVkIGJ5IGFkbWlzc2lvbiBjb250cm9sJ10pO1xyXG4gICAgY29uc3QgYWRtaXNzaW9uQ29udHJvbFdhaXRpbmdSZXF1ZXN0cyA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1dhaXRpbmcgUmVxdWVzdHMnICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LlJlcVBlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2Ygc2Vzc2lvbiByZXF1ZXN0cyB3YWl0aW5nIGluIGFkbWlzc2lvbiBjb250cm9sIHF1ZXVlJ10pO1xyXG4gICAgY29uc3QgYWRtaXNzaW9uQ29udHJvbFdhaXRUaW1lICAgICAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ1dhaXQgVGltZScgICAgICAgICAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LlNlY1BlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdUb3RhbCB3YWl0IHRpbWUgb2Ygc2Vzc2lvbiByZXF1ZXN0cyBxdWV1ZWQgaW4gYWRtaXNzaW9uIGNvbnRyb2wgcXVldWUnXSk7XHJcbiAgICBjb25zdCBhZG1pc3Npb25Db250cm9sRW5xdWV1ZUNvdW50ICAgID0gaW5mb0l0ZW0oW0l0ZW0ua3BpLCAnRW5xdWV1ZWQgUmVxdWVzdHMnICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuUmVxUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiBzZXNzaW9uIHJlcXVlc3RzIGVucXVldWVkIGJ5IGFkbWlzc2lvbiBjb250cm9sJ10pO1xyXG4gICAgY29uc3QgYWRtaXNzaW9uQ29udHJvbERlcXVldWVDb3VudCAgICA9IGluZm9JdGVtKFtJdGVtLmtwaSwgJ0RlcXVldWVkIFJlcXVlc3RzJyAgICAgICAgICBdLCBbSXRlbS55U2NhbGUsIDAsIF0sIFtJdGVtLnlTY2FsZUdyb3VwLCBTY2FsZUdyb3VwLlVua25vd25dLCBbSXRlbS51bml0LCBVbml0LlJlcVBlclNlYyAgXSwgW0l0ZW0ubWF4LCAtMV0sIFtJdGVtLmF2ZXJhZ2UsIC0xXSwgW0l0ZW0uc3VtLCAtMV0sIFtJdGVtLmxhc3QsIC0xXSwgW0l0ZW0uZGVzY3JpcHRpb24sICdOdW1iZXIgb2Ygc2Vzc2lvbiByZXF1ZXN0cyBkZXF1ZXVlZCBieSBhZG1pc3Npb24gY29udHJvbCddKTtcclxuICAgIGNvbnN0IGFkbWlzc2lvbkNvbnRyb2xUaW1lb3V0Q291bnQgICAgPSBpbmZvSXRlbShbSXRlbS5rcGksICdUaW1lZCBvdXQgUmVxdWVzdHMnICAgICAgICAgIF0sIFtJdGVtLnlTY2FsZSwgMCwgXSwgW0l0ZW0ueVNjYWxlR3JvdXAsIFNjYWxlR3JvdXAuVW5rbm93bl0sIFtJdGVtLnVuaXQsIFVuaXQuUmVxUGVyU2VjICBdLCBbSXRlbS5tYXgsIC0xXSwgW0l0ZW0uYXZlcmFnZSwgLTFdLCBbSXRlbS5zdW0sIC0xXSwgW0l0ZW0ubGFzdCwgLTFdLCBbSXRlbS5kZXNjcmlwdGlvbiwgJ051bWJlciBvZiB0aW1lZCBvdXQgc2Vzc2lvbiByZXF1ZXN0cyBpbiBhZG1pc3Npb24gY29udHJvbCBxdWV1ZSddKTtcclxuXHJcbiAgICAvLyBnZW5lcmF0ZSBIb3N0XHJcbiAgICBjb25zdCBsb2FkSGlzdG9yeUluZm9Ib3N0OiBMb2FkSGlzdG9yeUluZm9Ib3N0ID0ge1xyXG4gICAgICBjcHVVc2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogY3B1VXNlZCAgICAgICAgICAgICxcclxuICAgICAgbWVtb3J5UmVzaWRlbnQgICAgICAgICAgICAgICAgICA6IG1lbW9yeVJlc2lkZW50ICAgICAsXHJcbiAgICAgIG1lbW9yeVRvdGFsUmVzaWRlbnQgICAgICAgICAgICAgOiBtZW1vcnlUb3RhbFJlc2lkZW50LFxyXG4gICAgICBtZW1vcnlVc2VkICAgICAgICAgICAgICAgICAgICAgIDogbWVtb3J5VXNlZCAgICAgICAgICxcclxuICAgICAgbWVtb3J5TGltaXQgICAgICAgICAgICAgICAgICAgICA6IG1lbW9yeUxpbWl0ICAgICAgICAsXHJcbiAgICAgIG1lbW9yeVNpemUgICAgICAgICAgICAgICAgICAgICAgOiBtZW1vcnlTaXplICAgICAgICAgLFxyXG4gICAgICBkaXNrVXNlZCAgICAgICAgICAgICAgICAgICAgICAgIDogZGlza1VzZWQgICAgICAgICAgICxcclxuICAgICAgZGlza1NpemUgICAgICAgICAgICAgICAgICAgICAgICA6IGRpc2tTaXplICAgICAgICAgICAsXHJcbiAgICAgIG5ldHdvcmtJbiAgICAgICAgICAgICAgICAgICAgICAgOiBuZXR3b3JrSW4gICAgICAgICAgLFxyXG4gICAgICBuZXR3b3JrT3V0ICAgICAgICAgICAgICAgICAgICAgIDogbmV0d29ya091dCAgICAgICAgICxcclxuICAgICAgc3dhcEluICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN3YXBJbiAgICAgICAgICAgICAsXHJcbiAgICAgIHN3YXBPdXQgICAgICAgICAgICAgICAgICAgICAgICAgOiBzd2FwT3V0ICAgICAgICAgICAgLFxyXG4gICAgfTtcclxuICAgIC8vIGdlbmVyYXRlIEluZGV4IFNlcnZlclxyXG4gICAgY29uc3QgbG9hZEhpc3RvcnlJbmZvSW5kZXhTZXJ2ZXI6IExvYWRIaXN0b3J5SW5mb0luZGV4U2VydmVyID0ge1xyXG4gICAgICBpbmRleHNlcnZlckNwdSAgICAgICAgICAgICAgICAgIDogaW5kZXhzZXJ2ZXJDcHUgICAgICAsXHJcbiAgICAgIGluZGV4c2VydmVyQ3B1U3lzICAgICAgICAgICAgICAgOiBpbmRleHNlcnZlckNwdVN5cyAgICxcclxuICAgICAgaW5kZXhzZXJ2ZXJNZW1Vc2VkICAgICAgICAgICAgICA6IGluZGV4c2VydmVyTWVtVXNlZCAgLFxyXG4gICAgICBpbmRleHNlcnZlck1lbUxpbWl0ICAgICAgICAgICAgIDogaW5kZXhzZXJ2ZXJNZW1MaW1pdCAsXHJcbiAgICAgIGluZGV4c2VydmVySGFuZGxlcyAgICAgICAgICAgICAgOiBpbmRleHNlcnZlckhhbmRsZXMgICxcclxuICAgICAgaW5kZXhzZXJ2ZXJQaW5ndGltZSAgICAgICAgICAgICA6IGluZGV4c2VydmVyUGluZ3RpbWUgLFxyXG4gICAgICBpbmRleHNlcnZlclN3YXBJbiAgICAgICAgICAgICAgIDogaW5kZXhzZXJ2ZXJTd2FwSW4gICAsXHJcbiAgICB9O1xyXG4gICAgLy8gZ2VuZXJhdGUgU1FMXHJcbiAgICBjb25zdCBsb2FkSGlzdG9yeUluZm9TUUw6IExvYWRIaXN0b3J5SW5mb1NRTCA9IHtcclxuICAgICAgc3FsQ29ubmVjdGlvbnMgICAgICAgICAgICAgICAgICA6IHNxbENvbm5lY3Rpb25zICAgICAgLFxyXG4gICAgICBpbnRlcm5hbENvbm5lY3Rpb25zICAgICAgICAgICAgIDogaW50ZXJuYWxDb25uZWN0aW9ucyAsXHJcbiAgICAgIGV4dGVybmFsQ29ubmVjdGlvbnMgICAgICAgICAgICAgOiBleHRlcm5hbENvbm5lY3Rpb25zICxcclxuICAgICAgaWRsZUNvbm5lY3Rpb25zICAgICAgICAgICAgICAgICA6IGlkbGVDb25uZWN0aW9ucyAgICAgLFxyXG4gICAgICBzcWxUcmFuc2FjdGlvbnMgICAgICAgICAgICAgICAgIDogc3FsVHJhbnNhY3Rpb25zICAgICAsXHJcbiAgICAgIGludGVybmFsVHJhbnNhY3Rpb25zICAgICAgICAgICAgOiBpbnRlcm5hbFRyYW5zYWN0aW9ucyxcclxuICAgICAgZXh0ZXJuYWxUcmFuc2FjdGlvbnMgICAgICAgICAgICA6IGV4dGVybmFsVHJhbnNhY3Rpb25zLFxyXG4gICAgICB1c2VyVHJhbnNhY3Rpb25zICAgICAgICAgICAgICAgIDogdXNlclRyYW5zYWN0aW9ucyAgICAsXHJcbiAgICAgIHNxbEJsb2NrZWRUcmFucyAgICAgICAgICAgICAgICAgOiBzcWxCbG9ja2VkVHJhbnMgICAgICxcclxuICAgICAgc3FsU3RhdGVtZW50cyAgICAgICAgICAgICAgICAgICA6IHNxbFN0YXRlbWVudHMgICAgICAgLFxyXG4gICAgICBjaWRSYW5nZSAgICAgICAgICAgICAgICAgICAgICAgIDogY2lkUmFuZ2UgICAgICAgICAgICAsXHJcbiAgICAgIHRpZFJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgOiB0aWRSYW5nZSAgICAgICAgICAgICxcclxuICAgICAgcGVuZGluZ1JlcXVlc3RDb3VudCAgICAgICAgICAgICA6IHBlbmRpbmdSZXF1ZXN0Q291bnQgLFxyXG4gICAgfTtcclxuICAgIC8vIGdlbmVyYXRlIFJvdyBTdG9yZVxyXG4gICAgY29uc3QgbG9hZEhpc3RvcnlJbmZvUm93U3RvcmU6IExvYWRIaXN0b3J5SW5mb1Jvd1N0b3JlID0ge1xyXG4gICAgICBtdmNjTnVtICAgICAgICAgICAgICAgICAgICAgICAgIDogbXZjY051bSAgICAgICAgICAgICxcclxuICAgICAgYWNxdWlyZWRSZWNvcmRMb2NrcyAgICAgICAgICAgICA6IGFjcXVpcmVkUmVjb3JkTG9ja3MsXHJcbiAgICB9O1xyXG4gICAgLy8gZ2VuZXJhdGUgQ29sdW1uIFN0b3JlXHJcbiAgICBjb25zdCBsb2FkSGlzdG9yeUluZm9Db2x1bW5TdG9yZTogTG9hZEhpc3RvcnlJbmZvQ29sdW1uU3RvcmUgPSB7XHJcbiAgICAgIHNlYXJjaENvdW50ICAgICAgICAgICAgICAgICAgICAgOiBzZWFyY2hDb3VudCAgLFxyXG4gICAgICBpbmRleGluZ0NvdW50ICAgICAgICAgICAgICAgICAgIDogaW5kZXhpbmdDb3VudCxcclxuICAgICAgbWVyZ2VDb3VudCAgICAgICAgICAgICAgICAgICAgICA6IG1lcmdlQ291bnQgICAsXHJcbiAgICAgIHVubG9hZENvdW50ICAgICAgICAgICAgICAgICAgICAgOiB1bmxvYWRDb3VudCAgLFxyXG4gICAgfTtcclxuICAgIC8vIGdlbmVyYXRlIFRocmVhZHNcclxuICAgIGNvbnN0IGxvYWRIaXN0b3J5SW5mb1RocmVhZHM6IExvYWRIaXN0b3J5SW5mb1RocmVhZHMgPSB7XHJcbiAgICAgIGluZGV4c2VydmVyVGhyZWFkcyAgICAgICAgICAgICAgOiBpbmRleHNlcnZlclRocmVhZHMgLFxyXG4gICAgICB3YWl0aW5nVGhyZWFkcyAgICAgICAgICAgICAgICAgIDogd2FpdGluZ1RocmVhZHMgICAgICxcclxuICAgICAgdG90YWxUaHJlYWRzICAgICAgICAgICAgICAgICAgICA6IHRvdGFsVGhyZWFkcyAgICAgICAsXHJcbiAgICAgIGFjdGl2ZVNxbEV4ZWN1dG9ycyAgICAgICAgICAgICAgOiBhY3RpdmVTcWxFeGVjdXRvcnMgLFxyXG4gICAgICB3YWl0aW5nU3FsRXhlY3V0b3JzICAgICAgICAgICAgIDogd2FpdGluZ1NxbEV4ZWN1dG9ycyxcclxuICAgICAgdG90YWxTcWxFeGVjdXRvcnMgICAgICAgICAgICAgICA6IHRvdGFsU3FsRXhlY3V0b3JzICAsXHJcbiAgICB9O1xyXG4gICAgLy8gZ2VuZXJhdGUgUGVyc2lzdGVuY2VcclxuICAgIGNvbnN0IGxvYWRIaXN0b3J5SW5mb1BlcnNpc3RlbmNlOiBMb2FkSGlzdG9yeUluZm9QZXJzaXN0ZW5jZSA9IHtcclxuICAgICAgZGF0YVdyaXRlU2l6ZSAgICAgICAgICAgICAgICAgICA6IGRhdGFXcml0ZVNpemUsXHJcbiAgICAgIGRhdGFXcml0ZVRpbWUgICAgICAgICAgICAgICAgICAgOiBkYXRhV3JpdGVUaW1lLFxyXG4gICAgICBsb2dXcml0ZVNpemUgICAgICAgICAgICAgICAgICAgIDogbG9nV3JpdGVTaXplICxcclxuICAgICAgbG9nV3JpdGVUaW1lICAgICAgICAgICAgICAgICAgICA6IGxvZ1dyaXRlVGltZSAsXHJcblxyXG4gICAgICBkYXRhUmVhZFNpemUgICAgICAgICAgICAgICAgICAgIDogZGF0YVJlYWRTaXplICxcclxuICAgICAgZGF0YVJlYWRUaW1lICAgICAgICAgICAgICAgICAgICA6IGRhdGFSZWFkVGltZSAsXHJcbiAgICAgIGxvZ1JlYWRTaXplICAgICAgICAgICAgICAgICAgICAgOiBsb2dSZWFkU2l6ZSAgLFxyXG4gICAgICBsb2dSZWFkVGltZSAgICAgICAgICAgICAgICAgICAgIDogbG9nUmVhZFRpbWUgICxcclxuICAgIH07XHJcbiAgICAvLyBnZW5lcmF0ZSBCYWNrdXBcclxuICAgIGNvbnN0IGxvYWRIaXN0b3J5SW5mb0JhY2t1cDogTG9hZEhpc3RvcnlJbmZvQmFja3VwID0ge1xyXG4gICAgICBkYXRhQmFja3VwV3JpdGVTaXplICAgICAgICAgICAgIDogZGF0YUJhY2t1cFdyaXRlU2l6ZSxcclxuICAgICAgZGF0YUJhY2t1cFdyaXRlVGltZSAgICAgICAgICAgICA6IGRhdGFCYWNrdXBXcml0ZVRpbWUsXHJcbiAgICAgIGxvZ0JhY2t1cFdyaXRlU2l6ZSAgICAgICAgICAgICAgOiBsb2dCYWNrdXBXcml0ZVNpemUgLFxyXG4gICAgICBsb2dCYWNrdXBXcml0ZVRpbWUgICAgICAgICAgICAgIDogbG9nQmFja3VwV3JpdGVUaW1lICxcclxuICAgIH07XHJcbiAgICAvLyBnZW5lcmF0ZSBTeW5jaHJvbml6YXRpb24gUHJpbWl0aXZlc1xyXG4gICAgY29uc3QgbG9hZEhpc3RvcnlJbmZvU3luY2hyb25pemF0aW9uUHJpbWl0aXZlczogTG9hZEhpc3RvcnlJbmZvU3luY1ByaW1pdGl2ZXMgPSB7XHJcbiAgICAgIG11dGV4Q29sbGlzaW9uQ291bnQgICAgICAgICAgICAgOiBtdXRleENvbGxpc2lvbkNvdW50ICAgICAgICAsXHJcbiAgICAgIHJlYWRXcml0ZUxvY2tDb2xsaXNpb25Db3VudCAgICAgOiByZWFkV3JpdGVMb2NrQ29sbGlzaW9uQ291bnQsXHJcbiAgICB9O1xyXG4gICAgLy8gU2Vzc2lvbiBBZG1pc3Npb24gQ29udHJvbFxyXG4gICAgY29uc3QgbG9hZEhpc3RvcnlJbmZvU2Vzc2lvbkFkbWlzc2lvbkNvbnRyb2w6IExvYWRIaXN0b3J5SW5mb1Nlc3Npb25BZG1pc3Npb25Db250cm9sID0ge1xyXG4gICAgICBhZG1pc3NpbkNvbnRyb2xBZG1pdENvdW50ICAgICAgIDogYWRtaXNzaW5Db250cm9sQWRtaXRDb3VudCAgICAgICxcclxuICAgICAgYWRtaXNzaW9uQ29udHJvbFJlamVjdENvdW50ICAgICA6IGFkbWlzc2lvbkNvbnRyb2xSZWplY3RDb3VudCAgICAsXHJcbiAgICAgIGFkbWlzc2lvbkNvbnRyb2xXYWl0aW5nUmVxdWVzdHMgOiBhZG1pc3Npb25Db250cm9sV2FpdGluZ1JlcXVlc3RzLFxyXG4gICAgICBhZG1pc3Npb25Db250cm9sV2FpdFRpbWUgICAgICAgIDogYWRtaXNzaW9uQ29udHJvbFdhaXRUaW1lICAgICAgICxcclxuICAgICAgYWRtaXNzaW9uQ29udHJvbEVucXVldWVDb3VudCAgICA6IGFkbWlzc2lvbkNvbnRyb2xFbnF1ZXVlQ291bnQgICAsXHJcbiAgICAgIGFkbWlzc2lvbkNvbnRyb2xEZXF1ZXVlQ291bnQgICAgOiBhZG1pc3Npb25Db250cm9sRGVxdWV1ZUNvdW50ICAgLFxyXG4gICAgICBhZG1pc3Npb25Db250cm9sVGltZW91dENvdW50ICAgIDogYWRtaXNzaW9uQ29udHJvbFRpbWVvdXRDb3VudCAgICxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ0hvc3QnOiBsb2FkSGlzdG9yeUluZm9Ib3N0LFxyXG4gICAgICAnSW5kZXggU2VydmVyJzogbG9hZEhpc3RvcnlJbmZvSW5kZXhTZXJ2ZXIsXHJcbiAgICAgICdTUUwnOiBsb2FkSGlzdG9yeUluZm9TUUwsXHJcbiAgICAgICdSb3cgU3RvcmUnOiBsb2FkSGlzdG9yeUluZm9Sb3dTdG9yZSxcclxuICAgICAgJ0NvbHVtbiBTdG9yZSc6IGxvYWRIaXN0b3J5SW5mb0NvbHVtblN0b3JlLFxyXG4gICAgICAnVGhyZWFkcyc6IGxvYWRIaXN0b3J5SW5mb1RocmVhZHMsXHJcbiAgICAgICdQZXJzaXN0ZW5jZSc6IGxvYWRIaXN0b3J5SW5mb1BlcnNpc3RlbmNlLFxyXG4gICAgICAnQmFja3VwJzogbG9hZEhpc3RvcnlJbmZvQmFja3VwLFxyXG4gICAgICAnU3luY2hyb25pemF0aW9uIFByaW1pdGl2ZXMnOiBsb2FkSGlzdG9yeUluZm9TeW5jaHJvbml6YXRpb25QcmltaXRpdmVzLFxyXG4gICAgICAnU2Vzc2lvbiBBZG1pc3Npb24gQ29udHJvbCc6IGxvYWRIaXN0b3J5SW5mb1Nlc3Npb25BZG1pc3Npb25Db250cm9sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2V0IHJnYmNvbG9yIG9iamVjdCB2aWEgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2dldFJnYkNvbG9yKHJlZDogbnVtYmVyLCBncmVlbjogbnVtYmVyLCBibHVlOiBudW1iZXIsIGFscGhhOiBudW1iZXIpOiBDb2xvclJnYmEge1xyXG4gICAgcmV0dXJuIHtyZWQ6IHJlZCwgZ3JlZW46IGdyZWVuLCBibHVlOiBibHVlLCBhbHBoYTogYWxwaGF9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2dldFlTY2FsZUZvckl0ZW0oaXRlbTogYW55LCB5U2NhbGU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4geVNjYWxlID4gaXRlbVtJdGVtLnlTY2FsZV0gPyAoaXRlbVtJdGVtLnVuaXRdID09PSBVbml0LlBDVCA/IDEwMCA6IHlTY2FsZSkgOiBpdGVtW0l0ZW0ueVNjYWxlXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIF9nZXRNYXhWYWx1ZU9mR3JvdXAoZ3JvdXBJdGVtczogYW55KTogbnVtYmVyIHtcclxuICAgIGxldCBtYXggPSAwO1xyXG4gICAgaWYgKGdyb3VwSXRlbXMpIHtcclxuICAgICAgbWF4ID0gZ3JvdXBJdGVtcy5yZWR1Y2UoKG1heFZhbHVlLCBjdXJyZW50KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQuTWF4ID4gbWF4VmFsdWUgPyBjdXJyZW50Lk1heCA6IG1heFZhbHVlO1xyXG4gICAgICB9LCAwKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtYXg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRMb2FkSGlzdG9yeUluZm8ocG9ydDogc3RyaW5nKTogTG9hZEhpc3RvcnlJbmZvIHtcclxuICAgIGlmICghdGhpcy5fbG9hZEhpc3RvcnlJbmZvc1twb3J0XSkge1xyXG4gICAgICB0aGlzLl9sb2FkSGlzdG9yeUluZm9zW3BvcnRdID0gVUlTZXJ2aWNlLl9nZW5lcmF0ZUxvYWRIaXN0b3J5SW5mbygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRIaXN0b3J5SW5mb3NbcG9ydF07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRQcm9jZXNzaW5nVW5pdChpdGVtS2V5OiBzdHJpbmcsIHBvcnQ6IHN0cmluZyk6IFVuaXRUeXBlIHtcclxuICAgIGNvbnN0IGhpc3RvcnlEZXRhaWxJdGVtOiBMb2FkSGlzdG9yeUluZm9JdGVtID0gdGhpcy5fZ2V0SXRlbUJ5S2V5KGl0ZW1LZXksIHBvcnQpO1xyXG4gICAgaWYgKGhpc3RvcnlEZXRhaWxJdGVtKSB7XHJcbiAgICAgIGxldCB1bml0ID0gaGlzdG9yeURldGFpbEl0ZW0uVW5pdDtcclxuICAgICAgaWYgKCF1bml0KSB7XHJcbiAgICAgICAgdW5pdCA9ICcnO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBVSVNlcnZpY2UuX3VuaXRUeXBlW3VuaXRdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0T3ZlcnZpZXcgKGtleTogc3RyaW5nLCBvdmVydmlldzogTG9hZEhpc3RvcnlJbmZvSXRlbSwgdW5pdDogVW5pdFR5cGUsIHBvcnQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgaGlzdG9yeURldGFpbEl0ZW0gPSB0aGlzLl9nZXRJdGVtQnlLZXkoa2V5LCBwb3J0KTtcclxuICAgIGlmIChoaXN0b3J5RGV0YWlsSXRlbSkge1xyXG4gICAgICBoaXN0b3J5RGV0YWlsSXRlbS5NYXggPSBvdmVydmlldy5NYXggPj0gMCA/IG92ZXJ2aWV3Lk1heCA6IDA7XHJcbiAgICAgIGhpc3RvcnlEZXRhaWxJdGVtLkF2ZXJhZ2UgPSBvdmVydmlldy5BdmVyYWdlID49IDAgPyBvdmVydmlldy5BdmVyYWdlIDogMDtcclxuICAgICAgLy8gb25seSBUWVBFX0NPTlZFUlNJT05fTUJTRUMgYW5kIFRZUEVfQ09OVkVSVElPTl9TRUMgKGVnOiBNQi9zLCByZXEvcyBzdG10L3MuLi4pIG5lZWQgc3VtXHJcbiAgICAgIGhpc3RvcnlEZXRhaWxJdGVtLlN1bSA9IGlzVW5pdFRpbWVSZWxhdGVkKHVuaXQpID8gKG92ZXJ2aWV3LlN1bSA+PSAwID8gb3ZlcnZpZXcuU3VtIDogMCkgOiAnLSc7XHJcbiAgICAgIGhpc3RvcnlEZXRhaWxJdGVtLkxhc3QgPSBvdmVydmlldy5MYXN0ID49IDAgPyBvdmVydmlldy5MYXN0IDogMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNvbnZlcnQgdW5pdCB2YWx1ZXMgKGVnOiBieXRlIHRvIE1CIG9yIEdCKSBhbmQgZ2VuZXJhdGUgdGhlIGNvbnRyb2wgZGF0YSAoc3VtLCBtYXgsIGF2ZykgZm9yIG9uZSByb3dcclxuICAgKi9cclxuICBwcml2YXRlIF9jb252ZXJ0VW5pdEFuZEdlbmVyYXRlUm93Q29udHJvbERhdGEocm93OiBDaGFydENvbnRlbnREYXRhSXRlbVtdLCBrZXk6IHN0cmluZywgdW5pdDogVW5pdFR5cGUsIHBvcnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICBpZiAocm93KSB7XHJcbiAgICAgICAgY29uc3Qgb3ZlcnZpZXc6IExvYWRIaXN0b3J5SW5mb0l0ZW0gPSB7U3VtOiAwLCBNYXg6IDAsIEF2ZXJhZ2U6IDAsIExhc3Q6IDB9O1xyXG4gICAgICAgIGNvbnN0IGlnbm9yZWRUYWlsTGluZU51bSA9IGdldElnbm9yZWRMaW5lTnVtRnJvbVRhaWwoKTtcclxuICAgICAgICBsZXQgaW52YWxpZENvdW50ID0gMDtcclxuICAgICAgICAvLyBjb252ZXJ0IHVuaXQgYW5kIGNhbGN1bGF0ZSB0aGUgb3ZlcnZpZXcgZGF0YSwgc2tpcCB0aGUgZmlyc3QsIGFuZCBsYXN0IHRocmVlIHJvd3MuXHJcbiAgICAgICAgcm93LmZvckVhY2goKGl0ZW0sIGluZGV4LCBhcnJheURhdGEpID0+IHtcclxuICAgICAgICAgIC8vIHNraXAgaWdub3JlZCBsaW5lKHMpIGZyb20gdGFpbFxyXG4gICAgICAgICAgaWYgKGluZGV4IDw9IHJvdy5sZW5ndGggLSBpZ25vcmVkVGFpbExpbmVOdW0gLSAxKSB7XHJcbiAgICAgICAgICAgIGlmIChhcnJheURhdGFbaW5kZXhdLnkgPj0gMCkge1xyXG4gICAgICAgICAgICAgIGFycmF5RGF0YVtpbmRleF0ueSA9IGdldFZhbHVlQnlVbml0KGl0ZW0ueSwgdW5pdCk7XHJcbiAgICAgICAgICAgICAgb3ZlcnZpZXcuU3VtICs9IGFycmF5RGF0YVtpbmRleF0ueTtcclxuICAgICAgICAgICAgICBpZiAoaXNVbml0VGltZVJlbGF0ZWQodW5pdCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gaGFuYSBzdHVkaW8sIGZvciB0aG9zZSB0aW1lIHJlbGF0ZWQgY29sdW1uLCB0aGUgZmlyc3QgdmFsdWUgaXMgc2V0IHRvIDBcclxuICAgICAgICAgICAgICAgICAgYXJyYXlEYXRhW2luZGV4XS55ID0gMDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIGdldCB2YWx1ZSBmb3IgdW5pdCBsaWtlOiBNQi9zICAodmFsdWUgLyBzZWNvbmRzKVxyXG4gICAgICAgICAgICAgICAgICBjb25zdCB0aW1lRGlmZiA9IGFycmF5RGF0YVtpbmRleF0ueCAtIGFycmF5RGF0YVtpbmRleCAtIDFdLng7XHJcbiAgICAgICAgICAgICAgICAgIGFycmF5RGF0YVtpbmRleF0ueSA9IHRpbWVEaWZmICE9PSAwID8gYXJyYXlEYXRhW2luZGV4XS55ICogMTAwMCAvIHRpbWVEaWZmIDogMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYXJyYXlEYXRhW2luZGV4XS55ID0gZ2V0Um91bmRlZFZhbHVlKGFycmF5RGF0YVtpbmRleF0ueSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChhcnJheURhdGFbaW5kZXhdLnkgPiBvdmVydmlldy5NYXgpIHtcclxuICAgICAgICAgICAgICAgIG92ZXJ2aWV3Lk1heCA9IGFycmF5RGF0YVtpbmRleF0ueTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gc2V0IHZhbHVlIHRvIDAsIGZvciB0aG9zZSBwb2ludHMgd2l0aCB2YWx1ZSAtMSBvciA8IDBcclxuICAgICAgICAgICAgICBhcnJheURhdGFbaW5kZXhdLnkgPSAwO1xyXG4gICAgICAgICAgICAgIC8vIGludmFsaWQgY291bnQgKyAxLCBmb3IgY2FsY3VsYXRpbmcgdGhlIGF2ZXJhZ2UgKG5vdCB0aW1lIHJlbGF0aXZlKVxyXG4gICAgICAgICAgICAgIGludmFsaWRDb3VudCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChyb3cubGVuZ3RoID49IChpZ25vcmVkVGFpbExpbmVOdW0gKyBpbnZhbGlkQ291bnQpKSB7XHJcbiAgICAgICAgICBpZiAoaXNVbml0VGltZVJlbGF0ZWQodW5pdCkpIHtcclxuICAgICAgICAgICAgY29uc3QgdGltZVBlcmlvZCA9IHJvd1tyb3cubGVuZ3RoIC0gaWdub3JlZFRhaWxMaW5lTnVtIC0gMV0ueCAtIHJvd1swXS54O1xyXG4gICAgICAgICAgICBvdmVydmlldy5BdmVyYWdlID0gdGltZVBlcmlvZCAhPT0gMCA/IGdldFJvdW5kZWRWYWx1ZShvdmVydmlldy5TdW0gKiAxMDAwIC8gdGltZVBlcmlvZCkgOiAwO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsaWRJdGVtQ291bnQgPSByb3cubGVuZ3RoIC0gaWdub3JlZFRhaWxMaW5lTnVtIC0gaW52YWxpZENvdW50O1xyXG4gICAgICAgICAgICBvdmVydmlldy5BdmVyYWdlID0gdmFsaWRJdGVtQ291bnQgPiAwID8gZ2V0Um91bmRlZFZhbHVlKG92ZXJ2aWV3LlN1bSAvIHZhbGlkSXRlbUNvdW50KSA6IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBvdmVydmlldy5MYXN0ID0gcm93W3Jvdy5sZW5ndGggLSBpZ25vcmVkVGFpbExpbmVOdW0gLSAxXS55O1xyXG4gICAgICAgICAgb3ZlcnZpZXcuU3VtID0gZ2V0Um91bmRlZFZhbHVlKG92ZXJ2aWV3LlN1bSk7XHJcbiAgICAgICAgICBvdmVydmlldy5NYXggPSBnZXRSb3VuZGVkVmFsdWUob3ZlcnZpZXcuTWF4KTtcclxuXHJcbiAgICAgICAgICAvLyByZW1vdmUgdGhvc2UgaWdub3JlZCBsaW5lc1xyXG4gICAgICAgICAgcm93Lmxlbmd0aCA9IHJvdy5sZW5ndGggLSBpZ25vcmVkVGFpbExpbmVOdW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3NldE92ZXJ2aWV3KGtleSwgb3ZlcnZpZXcsIHVuaXQsIHBvcnQpO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc29sdmUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9vcCBmcm9tIGFsbCBoaXN0b3J5IGl0ZW1zLCBwdXQgdGhvc2UgaGlzdG9yeSBpdGVtcyB3aGljaFxyXG4gICAqIGhhdmUgdGhlIHNhbWUgeVNjYWxlR3JvdXAgdG9nZXRoZXIsIHVzaW5nIHlTY2FsZUdyb3VwIGFzIGtleS5cclxuICAgKiBlZzoge19fU0NBTEVfR1JPVVBfQ1BVOltpdGVtMSwgaXRlbTIuLi5dLCBfX1NDQUxFX0dST1VQX1VOS05PV046W2l0ZW0zLCBpdGVtNC4uLl19XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZ2V0WVNjYWxlR3JvdXBXaXRoSGlzdG9yeUl0ZW1zKHBvcnQ6IHN0cmluZyk6IHt9IHtcclxuICAgIGNvbnN0IHlTY2FsZUdyb3VwID0ge307XHJcbiAgICBjb25zdCBsb2FkSGlzdG9yeUluZm8gPSB0aGlzLl9nZXRMb2FkSGlzdG9yeUluZm8ocG9ydCk7XHJcblxyXG4gICAgT2JqZWN0LmtleXMobG9hZEhpc3RvcnlJbmZvKS5mb3JFYWNoKHBhcmVudEtleSA9PiB7XHJcbiAgICAgIE9iamVjdC5rZXlzKGxvYWRIaXN0b3J5SW5mb1twYXJlbnRLZXldKS5mb3JFYWNoKGNoaWxkS2V5ID0+IHtcclxuICAgICAgICBjb25zdCBkZXRhaWxJdGVtID0gbG9hZEhpc3RvcnlJbmZvW3BhcmVudEtleV1bY2hpbGRLZXldO1xyXG4gICAgICAgIGNvbnN0IHlTY2FsZUdyb3VwS2V5ID0gZGV0YWlsSXRlbS5fWVNjYWxlR3JvdXA7XHJcbiAgICAgICAgaWYgKCF5U2NhbGVHcm91cFt5U2NhbGVHcm91cEtleV0pIHtcclxuICAgICAgICAgIHlTY2FsZUdyb3VwW3lTY2FsZUdyb3VwS2V5XSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB5U2NhbGVHcm91cFt5U2NhbGVHcm91cEtleV0ucHVzaChkZXRhaWxJdGVtKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB5U2NhbGVHcm91cDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldFlTY2FsZU9mR3JvdXAoZ3JvdXBJdGVtczogYW55LCBncm91cDogU2NhbGVHcm91cCkge1xyXG4gICAgaWYgKGdyb3VwSXRlbXMpIHtcclxuICAgICAgaWYgKGdyb3VwID09PSBTY2FsZUdyb3VwLlVua25vd24pIHtcclxuICAgICAgICBncm91cEl0ZW1zLmZvckVhY2goaXRlbSA9PiBpdGVtW0l0ZW0ueVNjYWxlXSA9IFVJU2VydmljZS5fZ2V0WVNjYWxlRm9ySXRlbShpdGVtLCBjYWxjdWxhdGVZU2NhbGUoaXRlbS5NYXgpKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgeVNjYWxlID0gY2FsY3VsYXRlWVNjYWxlKFVJU2VydmljZS5fZ2V0TWF4VmFsdWVPZkdyb3VwKGdyb3VwSXRlbXMpKTtcclxuICAgICAgICBncm91cEl0ZW1zLmZvckVhY2goaXRlbSA9PiAgaXRlbVtJdGVtLnlTY2FsZV0gPSBVSVNlcnZpY2UuX2dldFlTY2FsZUZvckl0ZW0oaXRlbSwgeVNjYWxlKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEl0ZW1CeUtleShrZXk6IHN0cmluZywgcG9ydDogc3RyaW5nKTogYW55IHtcclxuICAgIGNvbnN0IGxvYWRIaXN0b3J5SW5mbyA9IHRoaXMuX2dldExvYWRIaXN0b3J5SW5mbyhwb3J0KTtcclxuICAgIGZvciAoIGNvbnN0IGl0ZW1LZXkgb2YgT2JqZWN0LmtleXMobG9hZEhpc3RvcnlJbmZvKSkge1xyXG4gICAgICBpZiAoa2V5IGluIGxvYWRIaXN0b3J5SW5mb1tpdGVtS2V5XSkge1xyXG4gICAgICAgIHJldHVybiBsb2FkSGlzdG9yeUluZm9baXRlbUtleV1ba2V5XTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogcmVzZXQgdGhlIGxvYWQgaGlzdG9yeSBpbmZvIG9iamVjdCwgdG8gcHJldmVudCBtZW1vcnkgbGVha1xyXG4gICAqL1xyXG4gIHB1YmxpYyBjbGVhckxvYWRIaXN0b3J5SW5mb3MoKSB7XHJcbiAgICB0aGlzLl9sb2FkSGlzdG9yeUluZm9zID0ge307XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBnZXQgYWxsIHRoZSBkYXRhIGZvciB0aGUgc2VsZWN0aW9uIHRhYmxlXHJcbiAgICovXHJcbiAgcHVibGljIGdldFNlbGVjdGlvblRhYmxlUm93cyhoZWFkZXJLZXlzOiBzdHJpbmdbXSwgcG9ydDogc3RyaW5nLCBkZWZhdWx0RGlzcGxheUl0ZW1zOiBzdHJpbmdbXSk6IGFueVtdIHtcclxuICAgIGNvbnN0IHJvd3M6IGFueVtdID0gW107XHJcbiAgICBjb25zdCBsb2FkSGlzdG9yeUluZm8gPSB0aGlzLl9nZXRMb2FkSGlzdG9yeUluZm8ocG9ydCk7XHJcblxyXG4gICAgY29uc3QgZGVmYXVsdEl0ZW1zID0gZGVmYXVsdERpc3BsYXlJdGVtcyAmJiBkZWZhdWx0RGlzcGxheUl0ZW1zLmxlbmd0aCA+IDAgPyBkZWZhdWx0RGlzcGxheUl0ZW1zIDogdGhpcy5fREVGQVVMVF9ESVNQTEFZX0lURU1TO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKGxvYWRIaXN0b3J5SW5mbykuZm9yRWFjaChrZXlQYXJlbnQgPT4ge1xyXG4gICAgICByb3dzLnB1c2goe0tQSToga2V5UGFyZW50LCBoZWFkZXI6IHRydWV9KTtcclxuICAgICAgY29uc3QgbGVuID0gcm93cy5sZW5ndGg7XHJcbiAgICAgIHJvd3MucHVzaCguLi5PYmplY3Qua2V5cyhsb2FkSGlzdG9yeUluZm9ba2V5UGFyZW50XSlcclxuICAgICAgICAuZmlsdGVyKGtleUNoaWxkID0+IGhlYWRlcktleXMuaW5jbHVkZXMoa2V5Q2hpbGQpKVxyXG4gICAgICAgIC5tYXAoa2V5Q2hpbGQgPT4ge1xyXG4gICAgICAgICAgbG9hZEhpc3RvcnlJbmZvW2tleVBhcmVudF1ba2V5Q2hpbGRdLmhlYWRlciA9IGZhbHNlO1xyXG4gICAgICAgICAgbG9hZEhpc3RvcnlJbmZvW2tleVBhcmVudF1ba2V5Q2hpbGRdLmNoZWNrZWQgPSBkZWZhdWx0SXRlbXMuaW5jbHVkZXMoa2V5Q2hpbGQpO1xyXG4gICAgICAgICAgcmV0dXJuIGxvYWRIaXN0b3J5SW5mb1trZXlQYXJlbnRdW2tleUNoaWxkXTtcclxuICAgICAgfSkpO1xyXG4gICAgICBpZiAobGVuID09PSByb3dzLmxlbmd0aCkge1xyXG4gICAgICAgIC8vIG5vIHN1YiBpdGVtcywgcmVtb3ZlIHRoZSBoZWFkZXJcclxuICAgICAgICByb3dzLnBvcCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcm93cztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGdldCBhbGwgaGlkZGVuIGNvbHVtbnMuIFRob3NlIGhpZGRlbiBjb2x1bW5zID0gaW5wdXQgaGlkZGVuIGNvbHVtbnMgKyBkZWZhdWx0IGhpZGRlbiBjb2x1bW5zXHJcbiAgICogQHBhcmFtIGhpZGVNZWFzdXJlQ29sdW1ucyB0aGUgYXJyYXkgY29udGFpbnMgdGhlIGNvbHVtbnMgbGlzdCB0aGF0IG5lZWQgdG8gYmUgaGlkZGVuLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRIaWRkZW5Db2x1bW5zKGhpZGVNZWFzdXJlQ29sdW1uczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XHJcbiAgICAvLyBvbmx5IG1lYXN1cmUgY29sdW1ucyBjYW4gYmUgaGlkZGVuXHJcbiAgICBjb25zdCBoaWRlQ29sdW1ucyA9IGhpZGVNZWFzdXJlQ29sdW1ucyA/IGhpZGVNZWFzdXJlQ29sdW1ucy5maWx0ZXIoY29sdW1uID0+IHRoaXMuX01FQVNVUkVfQ09MVU1OUy5pbmNsdWRlcyhjb2x1bW4pKSA6IFtdO1xyXG4gICAgcmV0dXJuIGhpZGVDb2x1bW5zID8gdGhpcy5fSElERURfQ09MVU1OUy5jb25jYXQoaGlkZUNvbHVtbnMpIDogdGhpcy5fSElERURfQ09MVU1OUztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGdldCBoZWFkZXIgaW5mb3JtYXRpb24gYW5kIGZvcm1hdCBpdCB0byB7aGVhZEtleToga2V5LCBoZWFkVGV4dDogdGV4dH1cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0SGVhZGVyKGtleXM6IHN0cmluZ1tdLCBwb3J0OiBzdHJpbmcpOiBDaGFydENvbnRlbnRIZWFkZXJbXSB7XHJcbiAgICByZXR1cm4ga2V5cy5tYXAoa2V5ID0+IHtcclxuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2dldEl0ZW1CeUtleShrZXksIHBvcnQpO1xyXG4gICAgICBpZiAoaXRlbSAhPSBudWxsICYmICdLUEknIGluIGl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gKHtrZXk6IGtleSwgdGV4dDogaXRlbS5LUEl9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oYCR7a2V5fSBpcyBub3QgY29uZmlndXJlZC5gKTtcclxuICAgICAgfVxyXG4gICAgfSkuZmlsdGVyKGtleSA9PiBrZXkgIT0gbnVsbCApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBzZWxlY3RlZCBpdGVtcywgd2hpY2ggbmVlZCB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIGNoYXJ0LlxyXG4gICAqIEBwYXJhbSBoZWFkZXJLZXlzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGtleXMgb2YgaGVhZGVyXHJcbiAgICogQHBhcmFtIHBvcnQgdGhlIHJlbGF0aXZlIHBvcnRcclxuICAgKiBAcGFyYW0gZGVmYXVsdERpc3BsYXlJdGVtcyB0aGUgaXRlbXMgbGlzdCB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGRlZmF1bHQuXHJcbiAgICovXHJcbiAgcHVibGljIGdldERpc3BsYXlJdGVtcyhoZWFkZXJLZXlzOiBzdHJpbmdbXSwgcG9ydDogc3RyaW5nLCBkZWZhdWx0RGlzcGxheUl0ZW1zOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvblRhYmxlID0gdGhpcy5nZXRTZWxlY3Rpb25UYWJsZVJvd3MoaGVhZGVyS2V5cywgcG9ydCwgZGVmYXVsdERpc3BsYXlJdGVtcyk7XHJcbiAgICByZXR1cm4gc2VsZWN0aW9uVGFibGUuZmlsdGVyKHJvdyA9PiByb3cuY2hlY2tlZCkubWFwKHJvdyA9PiByb3cuS1BJKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgWSBTY2FsZSBieSB0aGUga2V5cyBhbmQgcG9ydFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRZU2NhbGUoa2V5czogc3RyaW5nW10sIHBvcnQ6IHN0cmluZyk6IG51bWJlcltdIHtcclxuICAgIGNvbnN0IHlTY2FsZXMgPSBbXTtcclxuICAgIGlmIChrZXlzKSB7XHJcbiAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgIHlTY2FsZXMucHVzaCh0aGlzLl9nZXRJdGVtQnlLZXkoa2V5LCBwb3J0KVtJdGVtLnlTY2FsZV0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB5U2NhbGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgWSBTY2FsZSBmb3IgdGhlIHBvcnRcclxuICAgKi9cclxuICBwdWJsaWMgZ2VuZXJhdGVZU2NhbGUocG9ydDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCB5U2NhbGVHcm91cCA9IHRoaXMuX2dldFlTY2FsZUdyb3VwV2l0aEhpc3RvcnlJdGVtcyhwb3J0KTtcclxuICAgIFVJU2VydmljZS5fWVNjYWxlR3JvdXBMaXN0LmZvckVhY2goZ3JvdXAgPT4ge1xyXG4gICAgICBjb25zdCBoaXN0b3J5SXRlbXMgPSB5U2NhbGVHcm91cFtncm91cF07XHJcbiAgICAgIGlmIChoaXN0b3J5SXRlbXMpIHtcclxuICAgICAgICB0aGlzLl9zZXRZU2NhbGVPZkdyb3VwKGhpc3RvcnlJdGVtcywgZ3JvdXApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNvbnZlcnQgdW5pdCB2YWx1ZXMgKGVnOiBieXRlIHRvIE1CIG9yIEdCKSBhbmQgZ2VuZXJhdGUgdGhlIGNvbnRyb2wgZGF0YSAoc3VtLCBtYXgsIGF2ZylcclxuICAgKiBAcGFyYW0gZGF0YSB0aGUgbmFtZXNlcnZlciBoaXN0b3J5IGRhdGFcclxuICAgKiBAcGFyYW0gaGVhZGVyIGhlYWRlciBsaXN0XHJcbiAgICogQHBhcmFtIHBvcnQgc2VsZWN0ZWQgcG9ydFxyXG4gICAqL1xyXG4gIHB1YmxpYyBjb252ZXJ0VW5pdEFuZEdlbmVyYXRlQ29udHJvbERhdGEoZGF0YTogQ2hhcnRDb250ZW50RGF0YUl0ZW1bXVtdLCBoZWFkZXI6IHN0cmluZ1tdLCBwb3J0OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcclxuICAgIGlmIChkYXRhICYmIGhlYWRlcikge1xyXG4gICAgICBkYXRhLmZvckVhY2goKHJvdywgaW5kZXgpID0+IHtcclxuICAgICAgICBpZiAocm93KSB7XHJcbiAgICAgICAgICAvLyBnZXQgZGV0YWlsIGhpc3RvcnkgaXRlbSBrZXksIGxpa2UgaW5kZXhzZXJ2ZXJDcHVcclxuICAgICAgICAgIGNvbnN0IGl0ZW1LZXkgPSBoZWFkZXJbaW5kZXhdO1xyXG4gICAgICAgICAgY29uc3QgdW5pdCA9IHRoaXMuX2dldFByb2Nlc3NpbmdVbml0KGl0ZW1LZXksIHBvcnQpO1xyXG4gICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLl9jb252ZXJ0VW5pdEFuZEdlbmVyYXRlUm93Q29udHJvbERhdGEocm93LCBpdGVtS2V5LCB1bml0LCBwb3J0KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=