@dev-tcloud/tcloud-ui 2.4.14 → 3.0.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 (190) hide show
  1. package/README.md +3 -1
  2. package/esm2022/dev-tcloud-tcloud-ui.mjs +4 -4
  3. package/esm2022/lib/_directives/align/align.directive.mjs +42 -42
  4. package/esm2022/lib/_directives/currency/currency.directive.mjs +160 -160
  5. package/esm2022/lib/_directives/directives.module.mjs +39 -39
  6. package/esm2022/lib/_directives/el-copy/el-copy.directive.mjs +68 -68
  7. package/esm2022/lib/_directives/hover-parent/hover-parent.directive.mjs +58 -58
  8. package/esm2022/lib/_directives/tooltip/tooltip.directive.mjs +151 -151
  9. package/esm2022/lib/_modules/tcloud-ui-accordion/components/tcloud-ui-accordion-body/tcloud-ui-accordion-body.component.mjs +34 -34
  10. package/esm2022/lib/_modules/tcloud-ui-accordion/components/tcloud-ui-accordion-title/tcloud-ui-accordion-title.component.mjs +54 -54
  11. package/esm2022/lib/_modules/tcloud-ui-accordion/services/tcloud-ui-accordion.service.mjs +37 -37
  12. package/esm2022/lib/_modules/tcloud-ui-accordion/tcloud-ui-accordion.component.mjs +75 -75
  13. package/esm2022/lib/_modules/tcloud-ui-accordion/tcloud-ui-accordion.module.mjs +34 -34
  14. package/esm2022/lib/_modules/tcloud-ui-choice-issues/tcloud-ui-choice-issues.component.mjs +87 -87
  15. package/esm2022/lib/_modules/tcloud-ui-choice-issues/tcloud-ui-choice-issues.module.mjs +31 -31
  16. package/esm2022/lib/_modules/tcloud-ui-data-list/services/data-list.service.mjs +37 -37
  17. package/esm2022/lib/_modules/tcloud-ui-data-list/tcloud-ui-data-list-option/tcloud-ui-data-list-option.component.mjs +65 -65
  18. package/esm2022/lib/_modules/tcloud-ui-data-list/tcloud-ui-data-list.component.mjs +317 -317
  19. package/esm2022/lib/_modules/tcloud-ui-data-list/tcloud-ui-data-list.mjs +2 -2
  20. package/esm2022/lib/_modules/tcloud-ui-data-list/tcloud-ui-data-list.module.mjs +36 -36
  21. package/esm2022/lib/_modules/tcloud-ui-datepicker/tcloud-ui-datepicker.component.mjs +440 -440
  22. package/esm2022/lib/_modules/tcloud-ui-datepicker/tcloud-ui-datepicker.module.mjs +31 -31
  23. package/esm2022/lib/_modules/tcloud-ui-datepicker-time/tcloud-ui-datepicker-time.component.mjs +320 -320
  24. package/esm2022/lib/_modules/tcloud-ui-datepicker-time/tcloud-ui-datepicker-time.module.mjs +39 -39
  25. package/esm2022/lib/_modules/tcloud-ui-filters/components/range-date/range-date.component.mjs +213 -213
  26. package/esm2022/lib/_modules/tcloud-ui-filters/tcloud-ui-filters.component.mjs +537 -534
  27. package/esm2022/lib/_modules/tcloud-ui-filters/tcloud-ui-filters.mjs +19 -19
  28. package/esm2022/lib/_modules/tcloud-ui-filters/tcloud-ui-filters.module.mjs +44 -44
  29. package/esm2022/lib/_modules/tcloud-ui-input-password/tcloud-ui-input-password.component.mjs +142 -142
  30. package/esm2022/lib/_modules/tcloud-ui-input-password/tcloud-ui-input-password.module.mjs +31 -31
  31. package/esm2022/lib/_modules/tcloud-ui-input-search/tcloud-ui-input-search.component.mjs +66 -66
  32. package/esm2022/lib/_modules/tcloud-ui-input-search/tcloud-ui-input-search.module.mjs +31 -31
  33. package/esm2022/lib/_modules/tcloud-ui-label-token/tcloud-ui-label-token.component.mjs +36 -36
  34. package/esm2022/lib/_modules/tcloud-ui-label-token/tcloud-ui-label-token.module.mjs +30 -30
  35. package/esm2022/lib/_modules/tcloud-ui-line-step-circle/tcloud-ui-line-step-circle.component.mjs +93 -93
  36. package/esm2022/lib/_modules/tcloud-ui-line-step-circle/tcloud-ui-line-step-circle.module.mjs +24 -24
  37. package/esm2022/lib/_modules/tcloud-ui-line-step-title/tcloud-ui-line-step-title.component.mjs +42 -42
  38. package/esm2022/lib/_modules/tcloud-ui-line-step-title/tcloud-ui-line-step-title.mjs +1 -1
  39. package/esm2022/lib/_modules/tcloud-ui-line-step-title/tcloud-ui-line-step-title.module.mjs +18 -18
  40. package/esm2022/lib/_modules/tcloud-ui-linha-logo/tcloud-ui-linha-logo.component.mjs +65 -65
  41. package/esm2022/lib/_modules/tcloud-ui-linha-logo/tcloud-ui-linha-logo.module.mjs +24 -24
  42. package/esm2022/lib/_modules/tcloud-ui-loading/components/tcloud-ui-cubes/tcloud-ui-cubes.component.mjs +10 -10
  43. package/esm2022/lib/_modules/tcloud-ui-loading/tcloud-ui-loading.component.mjs +29 -29
  44. package/esm2022/lib/_modules/tcloud-ui-loading/tcloud-ui-loading.module.mjs +20 -20
  45. package/esm2022/lib/_modules/tcloud-ui-modal/components/tcloud-ui-modal-body/tcloud-ui-modal-body.component.mjs +13 -13
  46. package/esm2022/lib/_modules/tcloud-ui-modal/components/tcloud-ui-modal-footer/tcloud-ui-modal-footer.component.mjs +61 -61
  47. package/esm2022/lib/_modules/tcloud-ui-modal/components/tcloud-ui-modal-header/tcloud-ui-modal-header.component.mjs +24 -24
  48. package/esm2022/lib/_modules/tcloud-ui-modal/services/tcloud-modal.service.mjs +63 -63
  49. package/esm2022/lib/_modules/tcloud-ui-modal/tcloud-ui-modal.component.mjs +203 -203
  50. package/esm2022/lib/_modules/tcloud-ui-modal/tcloud-ui-modal.mjs +1 -1
  51. package/esm2022/lib/_modules/tcloud-ui-modal/tcloud-ui-modal.module.mjs +46 -46
  52. package/esm2022/lib/_modules/tcloud-ui-multi-input/tcloud-ui-multi-input.component.mjs +152 -152
  53. package/esm2022/lib/_modules/tcloud-ui-multi-input/tcloud-ui-multi-input.module.mjs +27 -27
  54. package/esm2022/lib/_modules/tcloud-ui-multi-select/tcloud-ui-multi-select.component.mjs +167 -167
  55. package/esm2022/lib/_modules/tcloud-ui-multi-select/tcloud-ui-multi-select.module.mjs +27 -27
  56. package/esm2022/lib/_modules/tcloud-ui-multiples-values/tcloud-ui-multiples-values.component.mjs +348 -348
  57. package/esm2022/lib/_modules/tcloud-ui-multiples-values/tcloud-ui-multiples-values.module.mjs +35 -35
  58. package/esm2022/lib/_modules/tcloud-ui-not-found/tcloud-ui-not-found.component.mjs +19 -19
  59. package/esm2022/lib/_modules/tcloud-ui-not-found/tcloud-ui-not-found.module.mjs +24 -24
  60. package/esm2022/lib/_modules/tcloud-ui-number-step/tcloud-ui-number-step.component.mjs +99 -99
  61. package/esm2022/lib/_modules/tcloud-ui-number-step/tcloud-ui-number-step.module.mjs +24 -24
  62. package/esm2022/lib/_modules/tcloud-ui-progress-bar/tcloud-ui-progress-bar.component.mjs +165 -161
  63. package/esm2022/lib/_modules/tcloud-ui-progress-bar/tcloud-ui-progress-bar.module.mjs +20 -20
  64. package/esm2022/lib/_modules/tcloud-ui-reorder-items/tcloud-ui-reorder-items.component.mjs +105 -105
  65. package/esm2022/lib/_modules/tcloud-ui-reorder-items/tcloud-ui-reorder-items.mjs +1 -1
  66. package/esm2022/lib/_modules/tcloud-ui-reorder-items/tcloud-ui-reorder-items.module.mjs +23 -23
  67. package/esm2022/lib/_modules/tcloud-ui-scroll-box/tcloud-ui-scroll-box.component.mjs +46 -46
  68. package/esm2022/lib/_modules/tcloud-ui-scroll-box/tcloud-ui-scroll-box.module.mjs +24 -24
  69. package/esm2022/lib/_modules/tcloud-ui-tab-menu/components/tcloud-ui-tab-content/tcloud-ui-tab-content.component.mjs +36 -36
  70. package/esm2022/lib/_modules/tcloud-ui-tab-menu/components/tcloud-ui-tab-head/tcloud-ui-tab-head.component.mjs +85 -85
  71. package/esm2022/lib/_modules/tcloud-ui-tab-menu/components/tcloud-ui-tab-subtitle/tcloud-ui-tab-subtitle.component.mjs +69 -69
  72. package/esm2022/lib/_modules/tcloud-ui-tab-menu/components/tcloud-ui-tab-title/tcloud-ui-tab-title.component.mjs +71 -71
  73. package/esm2022/lib/_modules/tcloud-ui-tab-menu/services/tab-menu.service.mjs +104 -104
  74. package/esm2022/lib/_modules/tcloud-ui-tab-menu/tcloud-ui-tab-menu.component.mjs +64 -64
  75. package/esm2022/lib/_modules/tcloud-ui-tab-menu/tcloud-ui-tab-menu.mjs +1 -1
  76. package/esm2022/lib/_modules/tcloud-ui-tab-menu/tcloud-ui-tab-menu.module.mjs +44 -44
  77. package/esm2022/lib/_modules/tcloud-ui-table/tcloud-ui-table.component.mjs +21 -21
  78. package/esm2022/lib/_modules/tcloud-ui-table/tcloud-ui-table.module.mjs +24 -24
  79. package/esm2022/lib/_modules/tcloud-ui-welcome/tcloud-ui-welcome.component.mjs +37 -37
  80. package/esm2022/lib/_modules/tcloud-ui-welcome/tcloud-ui-welcome.module.mjs +24 -24
  81. package/esm2022/lib/_pipes/array-to-text.mjs +29 -29
  82. package/esm2022/lib/_pipes/bytes.mjs +31 -31
  83. package/esm2022/lib/_pipes/cnpj.mjs +37 -37
  84. package/esm2022/lib/_pipes/cpf.mjs +37 -37
  85. package/esm2022/lib/_pipes/datebr.mjs +102 -102
  86. package/esm2022/lib/_pipes/index.mjs +8 -8
  87. package/esm2022/lib/_pipes/monthname.mjs +25 -25
  88. package/esm2022/lib/_pipes/respective.mjs +73 -73
  89. package/esm2022/lib/_pipes/statusinfo.mjs +78 -78
  90. package/esm2022/lib/_pipes/tcloud-pipes.module.mjs +74 -74
  91. package/esm2022/lib/_services/loading-transitions.service.mjs +52 -52
  92. package/esm2022/lib/_services/search-in-object.service.mjs +99 -99
  93. package/esm2022/lib/tcloud-ui.module.mjs +222 -222
  94. package/esm2022/public-api.mjs +107 -107
  95. package/fesm2022/dev-tcloud-tcloud-ui.mjs +6284 -6277
  96. package/fesm2022/dev-tcloud-tcloud-ui.mjs.map +1 -1
  97. package/index.d.ts +5 -5
  98. package/lib/_directives/align/align.directive.d.ts +13 -13
  99. package/lib/_directives/currency/currency.directive.d.ts +24 -24
  100. package/lib/_directives/directives.module.d.ts +11 -11
  101. package/lib/_directives/el-copy/el-copy.directive.d.ts +13 -13
  102. package/lib/_directives/hover-parent/hover-parent.directive.d.ts +15 -15
  103. package/lib/_directives/tooltip/tooltip.directive.d.ts +18 -18
  104. package/lib/_modules/tcloud-ui-accordion/components/tcloud-ui-accordion-body/tcloud-ui-accordion-body.component.d.ts +11 -11
  105. package/lib/_modules/tcloud-ui-accordion/components/tcloud-ui-accordion-title/tcloud-ui-accordion-title.component.d.ts +20 -20
  106. package/lib/_modules/tcloud-ui-accordion/services/tcloud-ui-accordion.service.d.ts +20 -20
  107. package/lib/_modules/tcloud-ui-accordion/tcloud-ui-accordion.component.d.ts +27 -27
  108. package/lib/_modules/tcloud-ui-accordion/tcloud-ui-accordion.module.d.ts +10 -10
  109. package/lib/_modules/tcloud-ui-choice-issues/tcloud-ui-choice-issues.component.d.ts +27 -27
  110. package/lib/_modules/tcloud-ui-choice-issues/tcloud-ui-choice-issues.module.d.ts +9 -9
  111. package/lib/_modules/tcloud-ui-data-list/services/data-list.service.d.ts +20 -20
  112. package/lib/_modules/tcloud-ui-data-list/tcloud-ui-data-list-option/tcloud-ui-data-list-option.component.d.ts +23 -23
  113. package/lib/_modules/tcloud-ui-data-list/tcloud-ui-data-list.component.d.ts +74 -74
  114. package/lib/_modules/tcloud-ui-data-list/tcloud-ui-data-list.d.ts +5 -5
  115. package/lib/_modules/tcloud-ui-data-list/tcloud-ui-data-list.module.d.ts +10 -10
  116. package/lib/_modules/tcloud-ui-datepicker/tcloud-ui-datepicker.component.d.ts +59 -59
  117. package/lib/_modules/tcloud-ui-datepicker/tcloud-ui-datepicker.module.d.ts +9 -9
  118. package/lib/_modules/tcloud-ui-datepicker-time/tcloud-ui-datepicker-time.component.d.ts +52 -52
  119. package/lib/_modules/tcloud-ui-datepicker-time/tcloud-ui-datepicker-time.module.d.ts +11 -11
  120. package/lib/_modules/tcloud-ui-filters/components/range-date/range-date.component.d.ts +41 -41
  121. package/lib/_modules/tcloud-ui-filters/tcloud-ui-filters.component.d.ts +64 -63
  122. package/lib/_modules/tcloud-ui-filters/tcloud-ui-filters.d.ts +40 -40
  123. package/lib/_modules/tcloud-ui-filters/tcloud-ui-filters.module.d.ts +12 -12
  124. package/lib/_modules/tcloud-ui-input-password/tcloud-ui-input-password.component.d.ts +36 -36
  125. package/lib/_modules/tcloud-ui-input-password/tcloud-ui-input-password.module.d.ts +9 -9
  126. package/lib/_modules/tcloud-ui-input-search/tcloud-ui-input-search.component.d.ts +28 -28
  127. package/lib/_modules/tcloud-ui-input-search/tcloud-ui-input-search.module.d.ts +9 -9
  128. package/lib/_modules/tcloud-ui-label-token/tcloud-ui-label-token.component.d.ts +14 -14
  129. package/lib/_modules/tcloud-ui-label-token/tcloud-ui-label-token.module.d.ts +9 -9
  130. package/lib/_modules/tcloud-ui-line-step-circle/tcloud-ui-line-step-circle.component.d.ts +28 -28
  131. package/lib/_modules/tcloud-ui-line-step-circle/tcloud-ui-line-step-circle.module.d.ts +8 -8
  132. package/lib/_modules/tcloud-ui-line-step-title/tcloud-ui-line-step-title.component.d.ts +12 -12
  133. package/lib/_modules/tcloud-ui-line-step-title/tcloud-ui-line-step-title.d.ts +5 -5
  134. package/lib/_modules/tcloud-ui-line-step-title/tcloud-ui-line-step-title.module.d.ts +8 -8
  135. package/lib/_modules/tcloud-ui-linha-logo/tcloud-ui-linha-logo.component.d.ts +17 -17
  136. package/lib/_modules/tcloud-ui-linha-logo/tcloud-ui-linha-logo.module.d.ts +8 -8
  137. package/lib/_modules/tcloud-ui-loading/components/tcloud-ui-cubes/tcloud-ui-cubes.component.d.ts +5 -5
  138. package/lib/_modules/tcloud-ui-loading/tcloud-ui-loading.component.d.ts +11 -11
  139. package/lib/_modules/tcloud-ui-loading/tcloud-ui-loading.module.d.ts +9 -9
  140. package/lib/_modules/tcloud-ui-modal/components/tcloud-ui-modal-body/tcloud-ui-modal-body.component.d.ts +8 -8
  141. package/lib/_modules/tcloud-ui-modal/components/tcloud-ui-modal-footer/tcloud-ui-modal-footer.component.d.ts +26 -26
  142. package/lib/_modules/tcloud-ui-modal/components/tcloud-ui-modal-header/tcloud-ui-modal-header.component.d.ts +12 -12
  143. package/lib/_modules/tcloud-ui-modal/services/tcloud-modal.service.d.ts +28 -28
  144. package/lib/_modules/tcloud-ui-modal/tcloud-ui-modal.component.d.ts +68 -68
  145. package/lib/_modules/tcloud-ui-modal/tcloud-ui-modal.d.ts +4 -4
  146. package/lib/_modules/tcloud-ui-modal/tcloud-ui-modal.module.d.ts +12 -12
  147. package/lib/_modules/tcloud-ui-multi-input/tcloud-ui-multi-input.component.d.ts +39 -39
  148. package/lib/_modules/tcloud-ui-multi-input/tcloud-ui-multi-input.module.d.ts +9 -9
  149. package/lib/_modules/tcloud-ui-multi-select/tcloud-ui-multi-select.component.d.ts +39 -39
  150. package/lib/_modules/tcloud-ui-multi-select/tcloud-ui-multi-select.module.d.ts +9 -9
  151. package/lib/_modules/tcloud-ui-multiples-values/tcloud-ui-multiples-values.component.d.ts +69 -69
  152. package/lib/_modules/tcloud-ui-multiples-values/tcloud-ui-multiples-values.module.d.ts +10 -10
  153. package/lib/_modules/tcloud-ui-not-found/tcloud-ui-not-found.component.d.ts +8 -8
  154. package/lib/_modules/tcloud-ui-not-found/tcloud-ui-not-found.module.d.ts +8 -8
  155. package/lib/_modules/tcloud-ui-number-step/tcloud-ui-number-step.component.d.ts +29 -29
  156. package/lib/_modules/tcloud-ui-number-step/tcloud-ui-number-step.module.d.ts +8 -8
  157. package/lib/_modules/tcloud-ui-progress-bar/tcloud-ui-progress-bar.component.d.ts +31 -29
  158. package/lib/_modules/tcloud-ui-progress-bar/tcloud-ui-progress-bar.module.d.ts +8 -8
  159. package/lib/_modules/tcloud-ui-reorder-items/tcloud-ui-reorder-items.component.d.ts +17 -17
  160. package/lib/_modules/tcloud-ui-reorder-items/tcloud-ui-reorder-items.d.ts +4 -4
  161. package/lib/_modules/tcloud-ui-reorder-items/tcloud-ui-reorder-items.module.d.ts +8 -8
  162. package/lib/_modules/tcloud-ui-scroll-box/tcloud-ui-scroll-box.component.d.ts +13 -13
  163. package/lib/_modules/tcloud-ui-scroll-box/tcloud-ui-scroll-box.module.d.ts +8 -8
  164. package/lib/_modules/tcloud-ui-tab-menu/components/tcloud-ui-tab-content/tcloud-ui-tab-content.component.d.ts +15 -15
  165. package/lib/_modules/tcloud-ui-tab-menu/components/tcloud-ui-tab-head/tcloud-ui-tab-head.component.d.ts +24 -24
  166. package/lib/_modules/tcloud-ui-tab-menu/components/tcloud-ui-tab-subtitle/tcloud-ui-tab-subtitle.component.d.ts +21 -21
  167. package/lib/_modules/tcloud-ui-tab-menu/components/tcloud-ui-tab-title/tcloud-ui-tab-title.component.d.ts +22 -22
  168. package/lib/_modules/tcloud-ui-tab-menu/services/tab-menu.service.d.ts +38 -38
  169. package/lib/_modules/tcloud-ui-tab-menu/tcloud-ui-tab-menu.component.d.ts +23 -23
  170. package/lib/_modules/tcloud-ui-tab-menu/tcloud-ui-tab-menu.d.ts +4 -4
  171. package/lib/_modules/tcloud-ui-tab-menu/tcloud-ui-tab-menu.module.d.ts +12 -12
  172. package/lib/_modules/tcloud-ui-table/tcloud-ui-table.component.d.ts +10 -10
  173. package/lib/_modules/tcloud-ui-table/tcloud-ui-table.module.d.ts +8 -8
  174. package/lib/_modules/tcloud-ui-welcome/tcloud-ui-welcome.component.d.ts +17 -17
  175. package/lib/_modules/tcloud-ui-welcome/tcloud-ui-welcome.module.d.ts +8 -8
  176. package/lib/_pipes/array-to-text.d.ts +8 -8
  177. package/lib/_pipes/bytes.d.ts +8 -8
  178. package/lib/_pipes/cnpj.d.ts +9 -9
  179. package/lib/_pipes/cpf.d.ts +9 -9
  180. package/lib/_pipes/datebr.d.ts +11 -11
  181. package/lib/_pipes/index.d.ts +8 -8
  182. package/lib/_pipes/monthname.d.ts +8 -8
  183. package/lib/_pipes/respective.d.ts +11 -11
  184. package/lib/_pipes/statusinfo.d.ts +15 -15
  185. package/lib/_pipes/tcloud-pipes.module.d.ts +15 -15
  186. package/lib/_services/loading-transitions.service.d.ts +16 -16
  187. package/lib/_services/search-in-object.service.d.ts +19 -19
  188. package/lib/tcloud-ui.module.d.ts +33 -33
  189. package/package.json +1 -1
  190. package/public-api.d.ts +76 -76
@@ -1,534 +1,537 @@
1
- import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
2
- import { TCCondition, TCFiltersType } from './tcloud-ui-filters';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- import * as i2 from "@angular/forms";
6
- import * as i3 from "../tcloud-ui-datepicker-time/tcloud-ui-datepicker-time.component";
7
- import * as i4 from "../tcloud-ui-datepicker/tcloud-ui-datepicker.component";
8
- import * as i5 from "./components/range-date/range-date.component";
9
- export class TCloudUiFiltersComponent {
10
- set data(data) {
11
- // this._data = JSON.parse(JSON.stringify(data));
12
- }
13
- get data() { return this._data; }
14
- set filters(filters) {
15
- //this._filters = filters;
16
- }
17
- get filters() { return this._filters; }
18
- set submitText(v) {
19
- if (v && v !== this._submitText) {
20
- this._submitText = v;
21
- }
22
- }
23
- get submitText() { return this._submitText; }
24
- constructor(datepipe) {
25
- this.datepipe = datepipe;
26
- this.datepickers = [];
27
- this.inputs = [];
28
- this.show_filters = false;
29
- this._submitText = 'Filtrar';
30
- this.btnSubmitClass = 'tc-btn-primary';
31
- this.useOnChangeSubmit = true; // useOnChangeSubmit - Submit automatico quando for alterado quanquer input
32
- this.useButtonSubmit = false; // useButtonSubmit - Exibe um botão de submit e não executa a busca automaticamente
33
- this.useNormalizeCaseSensitive = true; // useNormalizeCaseSensitive - Não valida caixa alta ou baixa e caracteres especiais
34
- this.useRangeDate = true;
35
- this.useFilterAccept = false;
36
- this.result = new EventEmitter();
37
- this.onFilter = new EventEmitter();
38
- this.onChange = new EventEmitter();
39
- this.onSubmit = new EventEmitter();
40
- this.descriptionStart = '';
41
- this.descriptionStop = '';
42
- this.first_active_filter = false;
43
- this.start_stop = false;
44
- this.start_stop_width = 0;
45
- this.start_stop_und = ''; // px ou %
46
- this.first = true;
47
- this.start_filter_fc = undefined;
48
- }
49
- ngOnInit() {
50
- setTimeout(() => {
51
- if (this.filters && (this.filters).length > 0) {
52
- for (let i = 0; i < (this.filters).length; i++) {
53
- if (this.filters[i].value) {
54
- if (this.filters[i].type === 'datetime-local') {
55
- try {
56
- this.filters[i].searchText = new Date(`${this.filters[i].value}`);
57
- }
58
- catch (error) { }
59
- }
60
- else {
61
- this.filters[i].searchText = this.filters[i].value;
62
- }
63
- this.first_active_filter = true;
64
- }
65
- }
66
- }
67
- this.start_stop = (this.useRangeDate) ? this.is_start_stop_datetime() : false;
68
- this.toSubmit();
69
- });
70
- }
71
- is_start_stop_datetime() {
72
- let start = false;
73
- let stop = false;
74
- if (this.filters && (this.filters).length > 0) {
75
- this.start_stop_width = 0;
76
- for (let i = 0; i < (this.filters).length; i++) {
77
- if (this.filters[i].id === 'start') {
78
- start = true;
79
- this.start_stop_width += this.getValueWidth(this.filters[i].width);
80
- this.start_stop_und = this.getUnidade(this.filters[i].width);
81
- this.descriptionStart = this.filters[i].description;
82
- }
83
- if (this.filters[i].id === 'stop') {
84
- stop = true;
85
- this.start_stop_width += this.getValueWidth(this.filters[i].width);
86
- this.descriptionStop = this.filters[i].description;
87
- }
88
- }
89
- }
90
- return (start && stop) ? true : false;
91
- }
92
- getValueWidth(v) {
93
- let und = this.getUnidade(v);
94
- v = (v).replace(und, '');
95
- return +(v);
96
- }
97
- getUnidade(v) {
98
- let und = '%';
99
- if (v && (v).includes('px')) {
100
- und = 'px';
101
- }
102
- return und;
103
- }
104
- ngOnChanges(changes) {
105
- if (changes && changes['data']) {
106
- const data = changes['data'].currentValue;
107
- if (this._data !== data) {
108
- this._data = JSON.parse(JSON.stringify(data));
109
- this.search_data = JSON.parse(JSON.stringify(data));
110
- this.init();
111
- }
112
- }
113
- if (changes && changes['filters']) {
114
- const filters = changes['filters'].currentValue;
115
- if (this._filters !== filters) {
116
- this._filters = JSON.parse(JSON.stringify(filters));
117
- this.init();
118
- }
119
- }
120
- }
121
- init() {
122
- if (this.data && this.filters) {
123
- this.show_filters = true;
124
- if (this.filters && (this.filters).length > 0) {
125
- (this.filters).forEach((filter) => {
126
- this.searchIn(filter, 'sync');
127
- });
128
- }
129
- if (!this.useOnChangeSubmit) {
130
- this.result_accept(this.data);
131
- }
132
- if (this.useOnChangeSubmit || this.useButtonSubmit) {
133
- this.start_filter();
134
- }
135
- }
136
- }
137
- normalize(text) {
138
- if (this.useNormalizeCaseSensitive) {
139
- const v = (((`${text}`).normalize('NFD').replace(/[\u0300-\u036f]/g, "")).trim()).toLowerCase();
140
- return v;
141
- }
142
- return text;
143
- }
144
- toSubmit() {
145
- if (this.filters && (this.filters).length > 0) {
146
- this.init();
147
- }
148
- this.emitSubmitFilters();
149
- }
150
- emitSubmitFilters() {
151
- let filters = JSON.parse(JSON.stringify(this.filters));
152
- if (filters && (filters).length > 0) {
153
- (filters).forEach((filter, i) => {
154
- if (filter.width) {
155
- delete (filters[i].width);
156
- }
157
- if (filter.placeholder) {
158
- delete (filters[i].placeholder);
159
- }
160
- if (filter.description) {
161
- delete (filters[i].description);
162
- }
163
- if ((!filter.searchText || filter.searchText && filter.searchText === '') && filter.type !== "boolean") {
164
- delete (filters[i]);
165
- }
166
- if (filter.type === "boolean") {
167
- if (!filter.searchText) {
168
- filter.searchText = false;
169
- }
170
- }
171
- });
172
- }
173
- this.onSubmit.emit(this.filters);
174
- }
175
- collectionFind(obj, path) {
176
- const pathArray = path.split(".");
177
- let current = obj;
178
- for (let i = 0; i < pathArray.length; i++) {
179
- const key = pathArray[i];
180
- if (key.includes('[') && key.includes(']')) {
181
- const nextKeys = pathArray.slice(i + 1);
182
- const index = key.substring(key.indexOf('[') + 1, key.indexOf(']'));
183
- const arrayKey = key.substring(0, key.indexOf('['));
184
- if (current && current[arrayKey] && current[arrayKey][index]) {
185
- return this.collectionFind(current[arrayKey][index], nextKeys.join("."));
186
- }
187
- }
188
- if (key.includes("[]")) {
189
- const arrayKey = key.replace("[]", "");
190
- current = current[arrayKey] || [];
191
- const nextKeys = pathArray.slice(i + 1);
192
- const results = [];
193
- for (let j = 0; j < current.length; j++) {
194
- let result = this.collectionFind(current[j], nextKeys.join("."));
195
- if (result !== undefined) {
196
- results.push(result);
197
- }
198
- }
199
- if (results.length === 0) {
200
- return undefined;
201
- }
202
- return results;
203
- }
204
- else {
205
- if (!current || (current && !current[key])) {
206
- return undefined;
207
- }
208
- current = current[key];
209
- if (current === undefined) {
210
- return undefined;
211
- }
212
- }
213
- }
214
- return current;
215
- }
216
- searchInRange(range_date) {
217
- if (this.filters && (this.filters).length > 0) {
218
- let event = {};
219
- event.datepickertime = true;
220
- for (let i = 0; i < (this.filters).length; i++) {
221
- if (this.filters[i] && this.filters[i].id && this.filters[i].id === 'start') {
222
- this.filters[i].value = range_date?.result?.start;
223
- this.filters[i].searchText = range_date?.result?.start;
224
- event.innerValue = this.start_value = range_date?.result?.start;
225
- this.searchIn(this.filters[i], event);
226
- }
227
- if (this.filters[i] && this.filters[i].id && this.filters[i].id === 'stop') {
228
- this.filters[i].value = range_date?.result?.stop;
229
- this.filters[i].searchText = range_date?.result?.stop;
230
- event.innerValue = this.stop_value = range_date?.result?.stop;
231
- this.searchIn(this.filters[i], event);
232
- }
233
- }
234
- if (this.first || this.useOnChangeSubmit) {
235
- this.toSubmit();
236
- }
237
- }
238
- this.first = false;
239
- }
240
- convertDataToNumber(dataString) {
241
- try {
242
- const [dia, mes, ano] = dataString.split('/');
243
- return +(`${ano}${mes}${dia}`);
244
- }
245
- catch (error) { }
246
- return 0;
247
- }
248
- searchIn(item, event) {
249
- this.start_filter_fc = undefined;
250
- let isValid = true;
251
- if (event === 'sync' && isValid) {
252
- isValid = false;
253
- this.onChange.emit(true);
254
- }
255
- if (typeof event === 'boolean' && isValid) {
256
- isValid = false;
257
- item.searchText = event;
258
- this.onChange.emit(true);
259
- }
260
- if ((event === undefined || event === null || event === '') && isValid) {
261
- isValid = false;
262
- item.searchText = '';
263
- this.onChange.emit(true);
264
- }
265
- if (event?.datepickertime && isValid) {
266
- isValid = false;
267
- item.searchText = event?.innerValue;
268
- this.onChange.emit(true);
269
- }
270
- if (event?.target?.value && isValid) {
271
- isValid = false;
272
- item.searchText = this.normalize(event.target.value);
273
- this.onChange.emit(true);
274
- }
275
- if (event?.target?.value === '' && isValid) {
276
- isValid = false;
277
- item.searchText = '';
278
- this.onChange.emit(true);
279
- }
280
- if (item.type === 'date-local' && item.value) {
281
- isValid = false;
282
- item.searchText = `${this.convertDataToNumber(item.value)}`;
283
- this.onChange.emit(true);
284
- }
285
- if (event && event.result && (event.result.start || event.result.stop)) {
286
- isValid = false;
287
- this.onChange.emit(true);
288
- }
289
- if (this.useOnChangeSubmit || this.first_active_filter) {
290
- this.start_filter_fc = this.start_filter();
291
- this.first_active_filter = false;
292
- }
293
- if (!this.useButtonSubmit) {
294
- this.emitSubmitFilters();
295
- }
296
- }
297
- getDateUTC(dt) {
298
- const ano = dt.getFullYear();
299
- const mes = dt.getMonth();
300
- const dia = dt.getDate();
301
- const horas = dt.getHours();
302
- const minutos = dt.getMinutes();
303
- const segundos = dt.getSeconds();
304
- return new Date(Date.UTC(ano, mes, dia, horas, minutos, segundos));
305
- }
306
- start_filter() {
307
- for (let i = 0; i < (this.data).length; i++) {
308
- this.setDataIndex(i, true);
309
- for (let j = 0; j < (this.filters).length; j++) {
310
- const filter_item = this.filters[j];
311
- if (filter_item.searchText && typeof (filter_item.searchText) === 'string' && filter_item.searchText !== '' && filter_item.type !== TCFiltersType.number && filter_item.type !== TCFiltersType.date) {
312
- filter_item.searchText = this.normalize(filter_item.searchText);
313
- let item_value = this.collectionFind(this.data[i], filter_item.searchIn);
314
- if (item_value) {
315
- item_value = this.normalize(item_value);
316
- if (typeof filter_item.notIn === 'boolean' && filter_item.notIn) {
317
- if ((item_value === filter_item.searchText)) {
318
- this.setDataIndex(i, false);
319
- }
320
- }
321
- else {
322
- if (filter_item.type === TCFiltersType.select) {
323
- // Exclusivo para select
324
- if (filter_item.data && (filter_item.data).length > 0) {
325
- // uso do select com o notValues: string[]
326
- let current_option = [];
327
- for (let k = 0; k < (filter_item.data).length; k++) {
328
- const k_item = filter_item.data[k];
329
- if (`${k_item?.value}` === `${filter_item.searchText}`) {
330
- current_option = k_item?.notValues;
331
- break;
332
- }
333
- }
334
- if (current_option && (current_option).length > 0) {
335
- for (let v = 0; v < (current_option).length; v++) {
336
- const v_item = current_option[v];
337
- if ((item_value === v_item)) {
338
- this.setDataIndex(i, false);
339
- }
340
- }
341
- }
342
- else {
343
- // uso normal do select
344
- if (!(item_value === filter_item.searchText)) {
345
- this.setDataIndex(i, false);
346
- }
347
- }
348
- }
349
- }
350
- else {
351
- if (!(item_value.includes(filter_item.searchText) || item_value === filter_item.searchText)) {
352
- this.setDataIndex(i, false);
353
- }
354
- }
355
- }
356
- }
357
- else {
358
- this.setDataIndex(i, false);
359
- }
360
- }
361
- if (filter_item.searchText && filter_item.searchText instanceof Date && !isNaN(filter_item.searchText.valueOf()) && filter_item.type === TCFiltersType.datetime) {
362
- let item_value = this.collectionFind(this.data[i], filter_item.searchIn);
363
- try {
364
- item_value = new Date(item_value);
365
- }
366
- catch (error) { }
367
- if (item_value && item_value instanceof Date && !isNaN(item_value.valueOf())) {
368
- let is_accept = false;
369
- const dt_target = ((filter_item.searchText).getTime()).toString().substring(0, 10); /* + (3 * 60 * 60 * 1000); */
370
- const dt_current = ((item_value).getTime()).toString().substring(0, 10);
371
- if (filter_item.condition) {
372
- switch (filter_item.condition) {
373
- case TCCondition.gt:
374
- is_accept = (Number(dt_target) > Number(dt_current));
375
- break;
376
- case TCCondition.lt:
377
- is_accept = (Number(dt_target) < Number(dt_current));
378
- break;
379
- case TCCondition.gte:
380
- is_accept = (Number(dt_target) <= Number(dt_current));
381
- break;
382
- case TCCondition.lte:
383
- is_accept = (Number(dt_target) >= Number(dt_current));
384
- break;
385
- case TCCondition.equal:
386
- is_accept = (Number(dt_target) === Number(dt_current));
387
- break;
388
- case TCCondition.notEqual:
389
- is_accept = (Number(dt_target) != Number(dt_current));
390
- break;
391
- default: is_accept = (Number(dt_target) == Number(dt_current));
392
- }
393
- }
394
- else {
395
- is_accept = (Number(filter_item.searchText) === Number(item_value));
396
- }
397
- if (!is_accept) {
398
- this.setDataIndex(i, false);
399
- }
400
- }
401
- }
402
- if (filter_item.searchText && typeof Number(filter_item.searchText) === 'number' && (filter_item.type === TCFiltersType.number || filter_item.type === TCFiltersType.date)) {
403
- filter_item.searchText = Number(filter_item.searchText);
404
- let item_value = this.collectionFind(this.data[i], filter_item.searchIn);
405
- if (typeof Number(item_value) === 'number') {
406
- item_value = Number(item_value);
407
- let is_accept = false;
408
- if (filter_item.condition) {
409
- switch (filter_item.condition) {
410
- case TCCondition.gt:
411
- is_accept = (Number(filter_item.searchText) > Number(item_value));
412
- break;
413
- case TCCondition.lt:
414
- is_accept = (Number(filter_item.searchText) < Number(item_value));
415
- break;
416
- case TCCondition.gte:
417
- is_accept = (Number(filter_item.searchText) <= Number(item_value));
418
- break;
419
- case TCCondition.lte:
420
- is_accept = (Number(filter_item.searchText) >= Number(item_value));
421
- break;
422
- case TCCondition.equal:
423
- is_accept = (Number(filter_item.searchText) === Number(item_value));
424
- break;
425
- case TCCondition.notEqual:
426
- is_accept = (Number(filter_item.searchText) != Number(item_value));
427
- break;
428
- default: is_accept = (Number(filter_item.searchText) == Number(item_value));
429
- }
430
- }
431
- else {
432
- is_accept = (Number(filter_item.searchText) === Number(item_value));
433
- }
434
- if (!is_accept) {
435
- this.setDataIndex(i, false);
436
- }
437
- }
438
- }
439
- if (typeof (filter_item.searchText) === 'boolean' && filter_item.searchText === true) {
440
- let item_value = this.collectionFind(this.data[i], filter_item.searchIn);
441
- if (item_value && (item_value).length > 0) {
442
- let qtd_is_true = 0;
443
- for (let i = 0; i < ((item_value).length); i++) {
444
- const item = item_value[i];
445
- if (item === filter_item.searchText) {
446
- qtd_is_true++;
447
- }
448
- }
449
- if (qtd_is_true === 0) {
450
- this.setDataIndex(i, false);
451
- }
452
- }
453
- else {
454
- if (!(item_value === filter_item.searchText)) {
455
- this.setDataIndex(i, false);
456
- }
457
- }
458
- }
459
- }
460
- } // end for
461
- this.toResult();
462
- }
463
- toResult() {
464
- const search_data = [];
465
- let is_filter = false;
466
- for (let i = 0; i < (this.filters).length; i++) {
467
- if (this.filters[i].searchText && this.filters[i].searchText !== '') {
468
- is_filter = true;
469
- break;
470
- }
471
- }
472
- if (is_filter) {
473
- for (let i = 0; i < (this.data).length; i++) {
474
- if (this.data && this.data[i] && this.data[i]['tc_filter_accept']) {
475
- (search_data).push(this.data[i]);
476
- }
477
- }
478
- this.result_accept(search_data);
479
- this.onFilter.emit({ ...this.filters });
480
- return;
481
- }
482
- this.result_accept(this.data);
483
- this.onFilter.emit({ ...this.filters });
484
- }
485
- setDataIndex(index, value) {
486
- if (this.data && this.data[index]) {
487
- this.data[index]['tc_filter_accept'] = value;
488
- }
489
- }
490
- result_accept(data) {
491
- if (!this.useFilterAccept && data && (data).length > 0) {
492
- for (let i = 0; i < (data).length; i++) {
493
- delete data[i]['tc_filter_accept'];
494
- }
495
- }
496
- this.result.emit(data);
497
- }
498
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TCloudUiFiltersComponent, deps: [{ token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Component }); }
499
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TCloudUiFiltersComponent, selector: "tcloud-ui-filters", inputs: { data: "data", filters: "filters", submitText: "submitText", btnSubmitClass: "btnSubmitClass", useOnChangeSubmit: "useOnChangeSubmit", useButtonSubmit: "useButtonSubmit", useNormalizeCaseSensitive: "useNormalizeCaseSensitive", useRangeDate: "useRangeDate", useFilterAccept: "useFilterAccept" }, outputs: { result: "result", onFilter: "onFilter", onChange: "onChange", onSubmit: "onSubmit" }, viewQueries: [{ propertyName: "_formulario", first: true, predicate: ["_formulario"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"show_filters\" class=\"tcloud-ui-filters area-filter\">\r\n <ng-container *ngFor=\"let item of filters; let i = index\">\r\n\r\n <ng-container *ngIf=\"!item.type || (item.type && item.type !== 'boolean')\">\r\n\r\n <ng-container *ngIf=\"item.type === 'date-local'\">\r\n\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(item.value !== undefined && item.value !== null && item.value !== '')\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <tcloud-ui-datepicker \r\n #_input\r\n name=\"input_{{i+1}}\"\r\n [modeInput]=\"true\"\r\n [(ngModel)]=\"item.value\"\r\n (ngModelChange)=\"searchIn(item, _input)\">\r\n </tcloud-ui-datepicker>\r\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"!(item.value !== undefined && item.value !== null && item.value !== '')\" (click)=\"searchIn(item, null); item.searchText = undefined; item.value = ''\">\r\n <i class=\"fas fa-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type !== 'date-local'\">\r\n <ng-container *ngIf=\"item.type === 'datetime-local'\">\r\n\r\n <ng-container *ngIf=\"(item.id === 'start' || item.id === 'stop') && useRangeDate\">\r\n <!-- PERIOD RANGE DATE -->\r\n <ng-container *ngIf=\"item.id === 'start'\">\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+start_stop_width+''+start_stop_und : ''\">\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(_range_date && _range_date.result && _range_date.result.start && _range_date.result.stop )\" class=\"fas fa-filter icon-filter\"></i>&nbsp;</div>\r\n <range-date \r\n #_range_date ngModel name=\"input_{{i+1}}\" \r\n [defaultValuePeriodStartStop]=\"item.defaultValuePeriodStartStop\"\r\n [descriptionStart]=\"descriptionStart\"\r\n [descriptionStop]=\"descriptionStop\"\r\n required \r\n (onChange)=\"searchInRange(_range_date); searchIn(item, _range_date)\">\r\n </range-date>\r\n </div>\r\n </ng-container> \r\n <input *ngIf=\"item.id === 'start'\" #_input name=\"input_{{i+1}}\" type=\"hidden\" [(ngModel)]=\"start_value\"> \r\n <input *ngIf=\"item.id === 'stop'\" #_input name=\"input_{{i+1}}\" type=\"hidden\" [(ngModel)]=\"stop_value\"> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!item.id || !useRangeDate\">\r\n\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(item.value !== undefined && item.value !== null && item.value !== '')\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <tcloud-ui-datepicker-time \r\n #_input \r\n [(ngModel)]=\"item.value\" \r\n name=\"input_{{i+1}}\" \r\n [useOptionsDateTime]=\"(item && item.useOptionsDateTime) ? true : false\"\r\n (eventChange)=\"searchIn(item, _input)\" >\r\n </tcloud-ui-datepicker-time>\r\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"!(item.value !== undefined && item.value !== null && item.value !== '')\" (click)=\"searchIn(item, null); item.searchText = undefined; item.value = ''\">\r\n <i class=\"fas fa-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n </ng-container>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"item.type !== 'select' && item.type !== 'datetime-local' && item.type !== 'date-local'\">\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.value !== ''\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <input \r\n #_input\r\n [(ngModel)]=\"item.value\"\r\n placeholder=\"{{ (item.placeholder !== '') ? item.placeholder : '' }}\"\r\n name=\"input_{{i+1}}\" \r\n type=\"{{ (item.type === 'number') ? 'text' : item.type }}\" \r\n class=\"tc-form-control\" \r\n (keyup)=\"searchIn(item, $event)\"> \r\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"_input.value === ''\" (click)=\"searchIn(item, null); _input.value = ''\">\r\n <i class=\"fas fa-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type === 'select' && item.data && (item.data).length > 0\" >\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.value !== ''\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <select \r\n #_input\r\n [(ngModel)]=\"item.value\"\r\n name=\"input_{{i+1}}\" \r\n class=\"tc-form-control\" \r\n (change)=\"searchIn(item, $event)\">\r\n <option [ngValue]=\"\"></option>\r\n <ng-container *ngFor=\"let v of item.data\">\r\n <option [value]=\"v.value\">{{ v.description }}</option>\r\n </ng-container>\r\n </select>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </ng-container>\r\n\r\n\r\n <ng-container *ngIf=\"item.type && item.type === 'boolean'\">\r\n \r\n <div class=\"box-filter-input\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n <div class=\"m-description tc-title-ellipsis\" title=\"{{ item.description }}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.checked === true\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"area-input-checkbox\">\r\n <div class=\"tc-form-control\">\r\n <label>\r\n {{ item.placeholder }}\r\n <input \r\n #_input\r\n placeholder=\"{{ (item.placeholder !== '') ? item.placeholder : '' }}\"\r\n name=\"input_{{i+1}}\" \r\n type=\"checkbox\" \r\n (change)=\"searchIn(item, _input.checked)\"> \r\n </label>\r\n </div> \r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n\r\n <div class=\"text-right mb-1 mr-1\" *ngIf=\"useButtonSubmit\">\r\n <button type=\"button\" class=\"tc-btn {{ btnSubmitClass }}\" (click)=\"toSubmit()\" >{{ submitText }}</button>\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- <pre>{{ inputs | json }}</pre> -->\r\n<!-- <pre> {{ data | json }} </pre> -->\r\n\r\n<!-- <p>FILTERS</p><pre> {{ filters | json }}</pre> -->\r\n\r\n<!--\r\n <pre>start_stop: {{ start_stop }}</pre>\r\n <pre>start_stop_width: {{ start_stop_width }}</pre>\r\n <pre>start_stop_und: {{ start_stop_und }}</pre>\r\n-->", styles: [".box-filter-input{display:inline-grid;padding:10px 5px;position:relative}.area-filter{border:1px solid #eeeeee;border-radius:5px;margin-bottom:5px}.btn-clear-filter-text{position:absolute;right:8px;top:38px;background-color:#fff;border:none;cursor:pointer;color:#aaa}.to-hide{display:none}.icon-filter{color:#ccc}.to-active{color:var(--tc-primary)}.area-input-checkbox label{cursor:pointer;margin-bottom:0;color:#9f9f9f}.area-input-checkbox div.tc-form-control{height:40px}.m-description{margin-bottom:3px}input{color:#535353}input[type=text],input[type=number],select{height:40px!important}.type-hidden{display:none;width:0px!important}.box-type-global_vars{display:none!important;width:0px!important}.tc-title-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.TCloudUiDatepickerTimeComponent, selector: "tcloud-ui-datepicker-time", inputs: ["ngModel", "minDate", "maxDate", "useOptionsDateTime"], outputs: ["ngModelChange", "onChange", "eventChange"] }, { kind: "component", type: i4.TCloudUiDatepickerComponent, selector: "tcloud-ui-datepicker", inputs: ["multiple", "maxNumberOfDates", "daysOfWeekDisabled", "minDate", "maxDate", "datesDisabled", "modeInput", "useBorder", "childInputDateTime", "startViewInMinDate", "startViewInMaxDate", "disabled", "ngModel", "code"], outputs: ["onChange", "ngModelChange", "onCheckDate"] }, { kind: "component", type: i5.TCloudUiRangeDateComponent, selector: "range-date", inputs: ["defaultValuePeriodStartStop", "required", "descriptionStart", "descriptionStop"], outputs: ["onChange"] }] }); }
500
- }
501
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TCloudUiFiltersComponent, decorators: [{
502
- type: Component,
503
- args: [{ selector: 'tcloud-ui-filters', template: "<div *ngIf=\"show_filters\" class=\"tcloud-ui-filters area-filter\">\r\n <ng-container *ngFor=\"let item of filters; let i = index\">\r\n\r\n <ng-container *ngIf=\"!item.type || (item.type && item.type !== 'boolean')\">\r\n\r\n <ng-container *ngIf=\"item.type === 'date-local'\">\r\n\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(item.value !== undefined && item.value !== null && item.value !== '')\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <tcloud-ui-datepicker \r\n #_input\r\n name=\"input_{{i+1}}\"\r\n [modeInput]=\"true\"\r\n [(ngModel)]=\"item.value\"\r\n (ngModelChange)=\"searchIn(item, _input)\">\r\n </tcloud-ui-datepicker>\r\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"!(item.value !== undefined && item.value !== null && item.value !== '')\" (click)=\"searchIn(item, null); item.searchText = undefined; item.value = ''\">\r\n <i class=\"fas fa-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type !== 'date-local'\">\r\n <ng-container *ngIf=\"item.type === 'datetime-local'\">\r\n\r\n <ng-container *ngIf=\"(item.id === 'start' || item.id === 'stop') && useRangeDate\">\r\n <!-- PERIOD RANGE DATE -->\r\n <ng-container *ngIf=\"item.id === 'start'\">\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+start_stop_width+''+start_stop_und : ''\">\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(_range_date && _range_date.result && _range_date.result.start && _range_date.result.stop )\" class=\"fas fa-filter icon-filter\"></i>&nbsp;</div>\r\n <range-date \r\n #_range_date ngModel name=\"input_{{i+1}}\" \r\n [defaultValuePeriodStartStop]=\"item.defaultValuePeriodStartStop\"\r\n [descriptionStart]=\"descriptionStart\"\r\n [descriptionStop]=\"descriptionStop\"\r\n required \r\n (onChange)=\"searchInRange(_range_date); searchIn(item, _range_date)\">\r\n </range-date>\r\n </div>\r\n </ng-container> \r\n <input *ngIf=\"item.id === 'start'\" #_input name=\"input_{{i+1}}\" type=\"hidden\" [(ngModel)]=\"start_value\"> \r\n <input *ngIf=\"item.id === 'stop'\" #_input name=\"input_{{i+1}}\" type=\"hidden\" [(ngModel)]=\"stop_value\"> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!item.id || !useRangeDate\">\r\n\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(item.value !== undefined && item.value !== null && item.value !== '')\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <tcloud-ui-datepicker-time \r\n #_input \r\n [(ngModel)]=\"item.value\" \r\n name=\"input_{{i+1}}\" \r\n [useOptionsDateTime]=\"(item && item.useOptionsDateTime) ? true : false\"\r\n (eventChange)=\"searchIn(item, _input)\" >\r\n </tcloud-ui-datepicker-time>\r\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"!(item.value !== undefined && item.value !== null && item.value !== '')\" (click)=\"searchIn(item, null); item.searchText = undefined; item.value = ''\">\r\n <i class=\"fas fa-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n </ng-container>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"item.type !== 'select' && item.type !== 'datetime-local' && item.type !== 'date-local'\">\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.value !== ''\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <input \r\n #_input\r\n [(ngModel)]=\"item.value\"\r\n placeholder=\"{{ (item.placeholder !== '') ? item.placeholder : '' }}\"\r\n name=\"input_{{i+1}}\" \r\n type=\"{{ (item.type === 'number') ? 'text' : item.type }}\" \r\n class=\"tc-form-control\" \r\n (keyup)=\"searchIn(item, $event)\"> \r\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"_input.value === ''\" (click)=\"searchIn(item, null); _input.value = ''\">\r\n <i class=\"fas fa-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type === 'select' && item.data && (item.data).length > 0\" >\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.value !== ''\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <select \r\n #_input\r\n [(ngModel)]=\"item.value\"\r\n name=\"input_{{i+1}}\" \r\n class=\"tc-form-control\" \r\n (change)=\"searchIn(item, $event)\">\r\n <option [ngValue]=\"\"></option>\r\n <ng-container *ngFor=\"let v of item.data\">\r\n <option [value]=\"v.value\">{{ v.description }}</option>\r\n </ng-container>\r\n </select>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </ng-container>\r\n\r\n\r\n <ng-container *ngIf=\"item.type && item.type === 'boolean'\">\r\n \r\n <div class=\"box-filter-input\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n <div class=\"m-description tc-title-ellipsis\" title=\"{{ item.description }}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.checked === true\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"area-input-checkbox\">\r\n <div class=\"tc-form-control\">\r\n <label>\r\n {{ item.placeholder }}\r\n <input \r\n #_input\r\n placeholder=\"{{ (item.placeholder !== '') ? item.placeholder : '' }}\"\r\n name=\"input_{{i+1}}\" \r\n type=\"checkbox\" \r\n (change)=\"searchIn(item, _input.checked)\"> \r\n </label>\r\n </div> \r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n\r\n <div class=\"text-right mb-1 mr-1\" *ngIf=\"useButtonSubmit\">\r\n <button type=\"button\" class=\"tc-btn {{ btnSubmitClass }}\" (click)=\"toSubmit()\" >{{ submitText }}</button>\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- <pre>{{ inputs | json }}</pre> -->\r\n<!-- <pre> {{ data | json }} </pre> -->\r\n\r\n<!-- <p>FILTERS</p><pre> {{ filters | json }}</pre> -->\r\n\r\n<!--\r\n <pre>start_stop: {{ start_stop }}</pre>\r\n <pre>start_stop_width: {{ start_stop_width }}</pre>\r\n <pre>start_stop_und: {{ start_stop_und }}</pre>\r\n-->", styles: [".box-filter-input{display:inline-grid;padding:10px 5px;position:relative}.area-filter{border:1px solid #eeeeee;border-radius:5px;margin-bottom:5px}.btn-clear-filter-text{position:absolute;right:8px;top:38px;background-color:#fff;border:none;cursor:pointer;color:#aaa}.to-hide{display:none}.icon-filter{color:#ccc}.to-active{color:var(--tc-primary)}.area-input-checkbox label{cursor:pointer;margin-bottom:0;color:#9f9f9f}.area-input-checkbox div.tc-form-control{height:40px}.m-description{margin-bottom:3px}input{color:#535353}input[type=text],input[type=number],select{height:40px!important}.type-hidden{display:none;width:0px!important}.box-type-global_vars{display:none!important;width:0px!important}.tc-title-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
504
- }], ctorParameters: function () { return [{ type: i1.DatePipe }]; }, propDecorators: { _formulario: [{
505
- type: ViewChild,
506
- args: ['_formulario']
507
- }], data: [{
508
- type: Input
509
- }], filters: [{
510
- type: Input
511
- }], submitText: [{
512
- type: Input
513
- }], btnSubmitClass: [{
514
- type: Input
515
- }], useOnChangeSubmit: [{
516
- type: Input
517
- }], useButtonSubmit: [{
518
- type: Input
519
- }], useNormalizeCaseSensitive: [{
520
- type: Input
521
- }], useRangeDate: [{
522
- type: Input
523
- }], useFilterAccept: [{
524
- type: Input
525
- }], result: [{
526
- type: Output
527
- }], onFilter: [{
528
- type: Output
529
- }], onChange: [{
530
- type: Output
531
- }], onSubmit: [{
532
- type: Output
533
- }] } });
534
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGNsb3VkLXVpLWZpbHRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGNsb3VkLXVpL3NyYy9saWIvX21vZHVsZXMvdGNsb3VkLXVpLWZpbHRlcnMvdGNsb3VkLXVpLWZpbHRlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGNsb3VkLXVpL3NyYy9saWIvX21vZHVsZXMvdGNsb3VkLXVpLWZpbHRlcnMvdGNsb3VkLXVpLWZpbHRlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVwSCxPQUFPLEVBQUUsV0FBVyxFQUFpQixhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQU9oRixNQUFNLE9BQU8sd0JBQXdCO0lBYW5DLElBQWEsSUFBSSxDQUFDLElBQVM7UUFDekIsaURBQWlEO0lBQ25ELENBQUM7SUFDRCxJQUFJLElBQUksS0FBUyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBR3JDLElBQWEsT0FBTyxDQUFDLE9BQVk7UUFDL0IsMEJBQTBCO0lBQzVCLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBUyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRzNDLElBQWEsVUFBVSxDQUFDLENBQVM7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBQ0QsSUFBSSxVQUFVLEtBQVcsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQXVCbkQsWUFDVSxRQUFrQjtRQUFsQixh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QyxTQUFTO3VCQUFDLGFBQWE7Z0JBU1gsSUFBSTtzQkFBaEIsS0FBSztnQkFNTyxPQUFPO3NCQUFuQixLQUFLO2dCQU1PLFVBQVU7c0JBQXRCLEtBQUs7Z0JBT0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUQ0NvbmRpdGlvbiwgVENEYXRhRmlsdGVycywgVENGaWx0ZXJzVHlwZSB9IGZyb20gJy4vdGNsb3VkLXVpLWZpbHRlcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0Y2xvdWQtdWktZmlsdGVycycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RjbG91ZC11aS1maWx0ZXJzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90Y2xvdWQtdWktZmlsdGVycy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUQ2xvdWRVaUZpbHRlcnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIGRhdGVwaWNrZXJzID0gW10gYXMgYW55O1xyXG5cclxuICBAVmlld0NoaWxkKCdfZm9ybXVsYXJpbycpICBfZm9ybXVsYXJpbzogTmdGb3JtIHwgdW5kZWZpbmVkO1xyXG5cclxuICBpbnB1dHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHNob3dfZmlsdGVyczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzZWFyY2hfZGF0YTogYW55IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIF9kYXRhOiBhbnkgfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgc2V0IGRhdGEoZGF0YTogYW55KXtcclxuICAgIC8vIHRoaXMuX2RhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICB9XHJcbiAgZ2V0IGRhdGEoKTogYW55eyByZXR1cm4gdGhpcy5fZGF0YTsgfVxyXG5cclxuICBwcml2YXRlIF9maWx0ZXJzOiBUQ0RhdGFGaWx0ZXJzIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIHNldCBmaWx0ZXJzKGZpbHRlcnM6IGFueSl7XHJcbiAgICAvL3RoaXMuX2ZpbHRlcnMgPSBmaWx0ZXJzO1xyXG4gIH1cclxuICBnZXQgZmlsdGVycygpOiBhbnl7IHJldHVybiB0aGlzLl9maWx0ZXJzOyB9XHJcblxyXG4gIHByaXZhdGUgX3N1Ym1pdFRleHQ6IHN0cmluZyA9ICdGaWx0cmFyJztcclxuICBASW5wdXQoKSBzZXQgc3VibWl0VGV4dCh2OiBzdHJpbmcpeyBcclxuICAgIGlmKCB2ICYmIHYgIT09IHRoaXMuX3N1Ym1pdFRleHQgKXtcclxuICAgICAgdGhpcy5fc3VibWl0VGV4dCA9IHY7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBzdWJtaXRUZXh0KCk6c3RyaW5neyByZXR1cm4gdGhpcy5fc3VibWl0VGV4dDsgfVxyXG5cclxuICBASW5wdXQoKSBidG5TdWJtaXRDbGFzczogc3RyaW5nID0gJ3RjLWJ0bi1wcmltYXJ5JztcclxuICBASW5wdXQoKSB1c2VPbkNoYW5nZVN1Ym1pdDogYm9vbGVhbiA9IHRydWU7IC8vIHVzZU9uQ2hhbmdlU3VibWl0IC0gU3VibWl0IGF1dG9tYXRpY28gcXVhbmRvIGZvciBhbHRlcmFkbyBxdWFucXVlciBpbnB1dFxyXG4gIEBJbnB1dCgpIHVzZUJ1dHRvblN1Ym1pdDogYm9vbGVhbiA9IGZhbHNlOyAvLyB1c2VCdXR0b25TdWJtaXQgLSBFeGliZSB1bSBib3TDo28gZGUgc3VibWl0IGUgbsOjbyBleGVjdXRhIGEgYnVzY2EgYXV0b21hdGljYW1lbnRlXHJcbiAgQElucHV0KCkgdXNlTm9ybWFsaXplQ2FzZVNlbnNpdGl2ZTogYm9vbGVhbiA9IHRydWU7IC8vIHVzZU5vcm1hbGl6ZUNhc2VTZW5zaXRpdmUgLSBOw6NvIHZhbGlkYSBjYWl4YSBhbHRhIG91IGJhaXhhIGUgY2FyYWN0ZXJlcyBlc3BlY2lhaXNcclxuICBASW5wdXQoKSB1c2VSYW5nZURhdGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHVzZUZpbHRlckFjY2VwdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgcmVzdWx0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uRmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGRlc2NyaXB0aW9uU3RhcnQ6IHN0cmluZyA9ICcnO1xyXG4gIGRlc2NyaXB0aW9uU3RvcDogc3RyaW5nID0gJyc7XHJcblxyXG4gIHByaXZhdGUgZmlyc3RfYWN0aXZlX2ZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzdGFydF9zdG9wOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc3RhcnRfc3RvcF93aWR0aDogbnVtYmVyID0gMDtcclxuICBzdGFydF9zdG9wX3VuZDogc3RyaW5nID0gJyc7IC8vIHB4IG91ICVcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGRhdGVwaXBlOiBEYXRlUGlwZVxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmKCB0aGlzLmZpbHRlcnMgJiYgKHRoaXMuZmlsdGVycykubGVuZ3RoID4gMCApe1xyXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCAodGhpcy5maWx0ZXJzKS5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICBpZiggdGhpcy5maWx0ZXJzW2ldLnZhbHVlICl7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLmZpbHRlcnNbaV0udHlwZSA9PT0gJ2RhdGV0aW1lLWxvY2FsJyApe1xyXG4gICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNbaV0uc2VhcmNoVGV4dCA9IG5ldyBEYXRlKCBgJHt0aGlzLmZpbHRlcnNbaV0udmFsdWV9YCApO1xyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNbaV0uc2VhcmNoVGV4dCA9IHRoaXMuZmlsdGVyc1tpXS52YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmZpcnN0X2FjdGl2ZV9maWx0ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gICAgICBcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnN0YXJ0X3N0b3AgPSAodGhpcy51c2VSYW5nZURhdGUpID8gdGhpcy5pc19zdGFydF9zdG9wX2RhdGV0aW1lKCkgOiBmYWxzZTtcclxuICAgICAgdGhpcy50b1N1Ym1pdCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc19zdGFydF9zdG9wX2RhdGV0aW1lKCl7XHJcbiAgICBsZXQgc3RhcnQgPSBmYWxzZTtcclxuICAgIGxldCBzdG9wID0gZmFsc2U7XHJcbiAgICBpZiggdGhpcy5maWx0ZXJzICYmICh0aGlzLmZpbHRlcnMpLmxlbmd0aCA+IDAgKXtcclxuICAgICAgdGhpcy5zdGFydF9zdG9wX3dpZHRoID0gMDtcclxuICAgICAgZm9yKGxldCBpID0gMDsgaSA8ICh0aGlzLmZpbHRlcnMpLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICBpZiggdGhpcy5maWx0ZXJzW2ldLmlkID09PSAnc3RhcnQnICl7XHJcbiAgICAgICAgICBzdGFydCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0X3N0b3Bfd2lkdGggKz0gdGhpcy5nZXRWYWx1ZVdpZHRoKHRoaXMuZmlsdGVyc1tpXS53aWR0aCk7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0X3N0b3BfdW5kID0gdGhpcy5nZXRVbmlkYWRlKHRoaXMuZmlsdGVyc1tpXS53aWR0aCk7XHJcbiAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uU3RhcnQgPSB0aGlzLmZpbHRlcnNbaV0uZGVzY3JpcHRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLmZpbHRlcnNbaV0uaWQgPT09ICdzdG9wJyApe1xyXG4gICAgICAgICAgc3RvcCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0X3N0b3Bfd2lkdGggKz0gdGhpcy5nZXRWYWx1ZVdpZHRoKHRoaXMuZmlsdGVyc1tpXS53aWR0aCk7XHJcbiAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uU3RvcCA9IHRoaXMuZmlsdGVyc1tpXS5kZXNjcmlwdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAoIHN0YXJ0ICYmIHN0b3AgKSA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldFZhbHVlV2lkdGgodjogc3RyaW5nKTpudW1iZXIge1xyXG4gICAgbGV0IHVuZCA9IHRoaXMuZ2V0VW5pZGFkZSh2KTtcclxuICAgIHYgPSAodikucmVwbGFjZSh1bmQsICcnKTtcclxuICAgIHJldHVybiArKHYpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VW5pZGFkZSh2OiBzdHJpbmcpOnN0cmluZyB7XHJcbiAgICBsZXQgdW5kID0gJyUnO1xyXG4gICAgaWYoIHYgJiYgKHYpLmluY2x1ZGVzKCdweCcpICl7XHJcbiAgICAgIHVuZCA9ICdweCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kO1xyXG4gIH1cclxuIFxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7ICBcclxuICAgIFxyXG4gICAgaWYoIGNoYW5nZXMgJiYgY2hhbmdlc1snZGF0YSddICl7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBjaGFuZ2VzWydkYXRhJ10uY3VycmVudFZhbHVlO1xyXG4gICAgICBpZiggdGhpcy5fZGF0YSAhPT0gZGF0YSApe1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICB0aGlzLnNlYXJjaF9kYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiggY2hhbmdlcyAmJiBjaGFuZ2VzWydmaWx0ZXJzJ10gKXtcclxuICAgICAgY29uc3QgZmlsdGVycyA9IGNoYW5nZXNbJ2ZpbHRlcnMnXS5jdXJyZW50VmFsdWU7XHJcbiAgICAgIGlmKCB0aGlzLl9maWx0ZXJzICE9PSBmaWx0ZXJzICl7XHJcbiAgICAgICAgdGhpcy5fZmlsdGVycyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZmlsdGVycykpO1xyXG4gICAgICAgIHRoaXMuaW5pdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQoKXtcclxuICAgIGlmKCB0aGlzLmRhdGEgJiYgdGhpcy5maWx0ZXJzICl7XHJcbiAgICAgIHRoaXMuc2hvd19maWx0ZXJzID0gdHJ1ZTtcclxuICAgICAgaWYoIHRoaXMuZmlsdGVycyAmJiAodGhpcy5maWx0ZXJzKS5sZW5ndGggPiAwICl7XHJcbiAgICAgICAgKHRoaXMuZmlsdGVycykuZm9yRWFjaCgoZmlsdGVyOiBUQ0RhdGFGaWx0ZXJzKSA9PiB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICB0aGlzLnNlYXJjaEluKGZpbHRlciwgJ3N5bmMnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBcclxuICAgICAgaWYoICF0aGlzLnVzZU9uQ2hhbmdlU3VibWl0ICl7XHJcbiAgICAgICAgdGhpcy5yZXN1bHRfYWNjZXB0KHRoaXMuZGF0YSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmKCB0aGlzLnVzZU9uQ2hhbmdlU3VibWl0IHx8IHRoaXMudXNlQnV0dG9uU3VibWl0ICl7XHJcbiAgICAgICAgdGhpcy5zdGFydF9maWx0ZXIoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBub3JtYWxpemUodGV4dDogYW55KTogc3RyaW5ne1xyXG4gICAgaWYoIHRoaXMudXNlTm9ybWFsaXplQ2FzZVNlbnNpdGl2ZSApe1xyXG4gICAgICBjb25zdCB2ID0gKCAoIChgJHt0ZXh0fWApLm5vcm1hbGl6ZSgnTkZEJykucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgXCJcIikgKS50cmltKCkgKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICByZXR1cm4gdjtcclxuICAgIH1cclxuICAgIHJldHVybiB0ZXh0O1xyXG4gIH1cclxuXHJcbiAgdG9TdWJtaXQoKXtcclxuICAgIGlmKCB0aGlzLmZpbHRlcnMgJiYgKHRoaXMuZmlsdGVycykubGVuZ3RoID4gMCApe1xyXG4gICAgICB0aGlzLmluaXQoKTtcclxuICAgIH1cclxuICAgIHRoaXMuZW1pdFN1Ym1pdEZpbHRlcnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdFN1Ym1pdEZpbHRlcnMoKXtcclxuICAgIGxldCBmaWx0ZXJzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlcnMpKTtcclxuICAgIGlmKCBmaWx0ZXJzICYmIChmaWx0ZXJzKS5sZW5ndGggPiAwICl7XHJcbiAgICAgIChmaWx0ZXJzKS5mb3JFYWNoKChmaWx0ZXI6IFRDRGF0YUZpbHRlcnMsIGk6IG51bWJlcikgPT4ge1xyXG5cclxuICAgICAgICBpZiggZmlsdGVyLndpZHRoICl7IGRlbGV0ZShmaWx0ZXJzW2ldLndpZHRoKTsgfVxyXG4gICAgICAgIGlmKCBmaWx0ZXIucGxhY2Vob2xkZXIgKXsgZGVsZXRlKGZpbHRlcnNbaV0ucGxhY2Vob2xkZXIpOyB9XHJcbiAgICAgICAgaWYoIGZpbHRlci5kZXNjcmlwdGlvbiApeyBkZWxldGUoZmlsdGVyc1tpXS5kZXNjcmlwdGlvbik7IH1cclxuXHJcbiAgICAgICAgaWYoICghZmlsdGVyLnNlYXJjaFRleHQgfHwgZmlsdGVyLnNlYXJjaFRleHQgJiYgZmlsdGVyLnNlYXJjaFRleHQgPT09ICcnKSAmJiBmaWx0ZXIudHlwZSAhPT0gXCJib29sZWFuXCIgKXtcclxuICAgICAgICAgIGRlbGV0ZShmaWx0ZXJzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIGZpbHRlci50eXBlID09PSBcImJvb2xlYW5cIiApe1xyXG4gICAgICAgICAgaWYoICFmaWx0ZXIuc2VhcmNoVGV4dCApe1xyXG4gICAgICAgICAgICBmaWx0ZXIuc2VhcmNoVGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgfSk7XHJcbiAgICB9ICAgXHJcbiAgICBcclxuICAgIHRoaXMub25TdWJtaXQuZW1pdCh0aGlzLmZpbHRlcnMpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgY29sbGVjdGlvbkZpbmQob2JqOiBhbnksIHBhdGg6IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KFwiLlwiKTtcclxuICAgIGxldCBjdXJyZW50ID0gb2JqO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3Qga2V5ID0gcGF0aEFycmF5W2ldO1xyXG5cclxuICAgICAgaWYgKGtleS5pbmNsdWRlcygnWycpICYmIGtleS5pbmNsdWRlcygnXScpKSB7XHJcbiAgICAgICAgY29uc3QgbmV4dEtleXMgPSBwYXRoQXJyYXkuc2xpY2UoaSArIDEpO1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0ga2V5LnN1YnN0cmluZyhrZXkuaW5kZXhPZignWycpICsgMSwga2V5LmluZGV4T2YoJ10nKSk7XHJcbiAgICAgICAgY29uc3QgYXJyYXlLZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGtleS5pbmRleE9mKCdbJykpO1xyXG4gICAgICAgIGlmKCBjdXJyZW50ICYmIGN1cnJlbnRbYXJyYXlLZXldICYmIGN1cnJlbnRbYXJyYXlLZXldW2luZGV4XSApe1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkZpbmQoY3VycmVudFthcnJheUtleV1baW5kZXhdLCBuZXh0S2V5cy5qb2luKFwiLlwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgaWYgKGtleS5pbmNsdWRlcyhcIltdXCIpKSB7XHJcbiAgICAgICAgY29uc3QgYXJyYXlLZXkgPSBrZXkucmVwbGFjZShcIltdXCIsIFwiXCIpO1xyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2FycmF5S2V5XSB8fCBbXTtcclxuICAgICAgICBjb25zdCBuZXh0S2V5cyA9IHBhdGhBcnJheS5zbGljZShpICsgMSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY3VycmVudC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuY29sbGVjdGlvbkZpbmQoY3VycmVudFtqXSwgbmV4dEtleXMuam9pbihcIi5cIikpO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpOyBcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiggIWN1cnJlbnQgfHwgKGN1cnJlbnQgJiYgIWN1cnJlbnRba2V5XSkgKXtcclxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XHJcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50O1xyXG4gIH1cclxuICAgIFxyXG4gIGZpcnN0OiBib29sZWFuID0gdHJ1ZTtcclxuICBzdGFydF9maWx0ZXJfZmM6IGFueSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgc3RhcnRfdmFsdWU6IGFueSB8IHVuZGVmaW5lZDtcclxuICBzdG9wX3ZhbHVlOiBhbnkgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHNlYXJjaEluUmFuZ2UoIHJhbmdlX2RhdGU6IGFueSl7XHJcbiAgICBcclxuICAgIGlmKCB0aGlzLmZpbHRlcnMgJiYgKHRoaXMuZmlsdGVycykubGVuZ3RoID4gMCApe1xyXG5cclxuICAgICAgbGV0IGV2ZW50ID0ge30gYXMgYW55OyBcclxuICAgICAgZXZlbnQuZGF0ZXBpY2tlcnRpbWUgPSB0cnVlO1xyXG5cclxuICAgICAgZm9yKCBsZXQgaSA9IDA7IGkgPCAodGhpcy5maWx0ZXJzKS5sZW5ndGg7IGkrKyApe1xyXG5cclxuICAgICAgICBpZiggdGhpcy5maWx0ZXJzW2ldICYmIHRoaXMuZmlsdGVyc1tpXS5pZCAmJiB0aGlzLmZpbHRlcnNbaV0uaWQgPT09ICdzdGFydCcgKXtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyc1tpXS52YWx1ZSA9IHJhbmdlX2RhdGU/LnJlc3VsdD8uc3RhcnQhO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzW2ldLnNlYXJjaFRleHQgPSByYW5nZV9kYXRlPy5yZXN1bHQ/LnN0YXJ0ITtcclxuICAgICAgICAgIGV2ZW50LmlubmVyVmFsdWUgPSB0aGlzLnN0YXJ0X3ZhbHVlID0gcmFuZ2VfZGF0ZT8ucmVzdWx0Py5zdGFydCE7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaEluKHRoaXMuZmlsdGVyc1tpXSwgZXZlbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoIHRoaXMuZmlsdGVyc1tpXSAmJiB0aGlzLmZpbHRlcnNbaV0uaWQgJiYgdGhpcy5maWx0ZXJzW2ldLmlkID09PSAnc3RvcCcgKXtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyc1tpXS52YWx1ZSA9IHJhbmdlX2RhdGU/LnJlc3VsdD8uc3RvcCE7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNbaV0uc2VhcmNoVGV4dCA9IHJhbmdlX2RhdGU/LnJlc3VsdD8uc3RvcCE7XHJcbiAgICAgICAgICBldmVudC5pbm5lclZhbHVlID0gdGhpcy5zdG9wX3ZhbHVlID0gcmFuZ2VfZGF0ZT8ucmVzdWx0Py5zdG9wITtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoSW4odGhpcy5maWx0ZXJzW2ldLCBldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmKCB0aGlzLmZpcnN0IHx8IHRoaXMudXNlT25DaGFuZ2VTdWJtaXQgKXtcclxuICAgICAgICB0aGlzLnRvU3VibWl0KCk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICB9XHJcbiAgICB0aGlzLmZpcnN0ID0gZmFsc2U7XHJcblxyXG4gIH1cclxuXHJcbiAgY29udmVydERhdGFUb051bWJlcihkYXRhU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgW2RpYSwgbWVzLCBhbm9dID0gZGF0YVN0cmluZy5zcGxpdCgnLycpO1xyXG4gICAgICByZXR1cm4gKyhgJHthbm99JHttZXN9JHtkaWF9YCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge31cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoSW4oaXRlbTogVENEYXRhRmlsdGVycywgZXZlbnQ/OiBhbnkpe1xyXG5cclxuICAgIFxyXG5cclxuICAgIHRoaXMuc3RhcnRfZmlsdGVyX2ZjID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIGxldCBpc1ZhbGlkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiggZXZlbnQgPT09ICdzeW5jJyAmJiBpc1ZhbGlkICl7XHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCB0eXBlb2YgZXZlbnQgPT09ICdib29sZWFuJyAmJiBpc1ZhbGlkICl7XHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgaXRlbS5zZWFyY2hUZXh0ID0gZXZlbnQ7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiggKGV2ZW50ID09PSB1bmRlZmluZWQgfHwgZXZlbnQgPT09IG51bGwgfHwgZXZlbnQgPT09ICcnKSAmJiBpc1ZhbGlkICl7XHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgaXRlbS5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiggZXZlbnQ/LmRhdGVwaWNrZXJ0aW1lICAmJiBpc1ZhbGlkICl7XHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgaXRlbS5zZWFyY2hUZXh0ID0gZXZlbnQ/LmlubmVyVmFsdWU7ICAgICAgXHJcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZihldmVudD8udGFyZ2V0Py52YWx1ZSAmJiBpc1ZhbGlkICl7XHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgaXRlbS5zZWFyY2hUZXh0ID0gdGhpcy5ub3JtYWxpemUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKGV2ZW50Py50YXJnZXQ/LnZhbHVlID09PSAnJyAmJiBpc1ZhbGlkICl7XHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgaXRlbS5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiggaXRlbS50eXBlID09PSAnZGF0ZS1sb2NhbCcgJiYgaXRlbS52YWx1ZSApe1xyXG4gICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICAgIGl0ZW0uc2VhcmNoVGV4dCA9IGAke3RoaXMuY29udmVydERhdGFUb051bWJlciggaXRlbS52YWx1ZSApfWA7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiggZXZlbnQgJiYgZXZlbnQucmVzdWx0ICYmICggZXZlbnQucmVzdWx0LnN0YXJ0IHx8IGV2ZW50LnJlc3VsdC5zdG9wICkgKXtcclxuICAgICAgaXNWYWxpZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbiAgICBcclxuICAgIGlmKCB0aGlzLnVzZU9uQ2hhbmdlU3VibWl0IHx8IHRoaXMuZmlyc3RfYWN0aXZlX2ZpbHRlciApeyAgICAgIFxyXG4gICAgICB0aGlzLnN0YXJ0X2ZpbHRlcl9mYyA9IHRoaXMuc3RhcnRfZmlsdGVyKCk7XHJcbiAgICAgIHRoaXMuZmlyc3RfYWN0aXZlX2ZpbHRlciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCAhdGhpcy51c2VCdXR0b25TdWJtaXQgKXtcclxuICAgICAgdGhpcy5lbWl0U3VibWl0RmlsdGVycygpO1xyXG4gICAgfSBcclxuICB9XHJcblxyXG4gIGdldERhdGVVVEMoZHQ6IGFueSl7XHJcbiAgICBjb25zdCBhbm8gPSBkdC5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3QgbWVzID0gZHQuZ2V0TW9udGgoKTtcclxuICAgIGNvbnN0IGRpYSA9IGR0LmdldERhdGUoKTtcclxuICAgIGNvbnN0IGhvcmFzID0gZHQuZ2V0SG91cnMoKTtcclxuICAgIGNvbnN0IG1pbnV0b3MgPSBkdC5nZXRNaW51dGVzKCk7XHJcbiAgICBjb25zdCBzZWd1bmRvcyA9IGR0LmdldFNlY29uZHMoKTtcclxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhhbm8sIG1lcywgZGlhLCBob3JhcywgbWludXRvcywgc2VndW5kb3MpKTtcclxuICB9XHJcblxyXG4gIFxyXG4gIHN0YXJ0X2ZpbHRlcigpe1xyXG4gICAgZm9yKCBsZXQgaSA9IDA7IGkgPCAodGhpcy5kYXRhKS5sZW5ndGg7IGkrKyApe1xyXG5cclxuICAgICAgdGhpcy5zZXREYXRhSW5kZXgoaSwgdHJ1ZSk7XHJcblxyXG4gICAgICBmb3IoIGxldCBqID0gMDsgaiA8ICh0aGlzLmZpbHRlcnMpLmxlbmd0aDsgaisrICl7ICAgICAgICBcclxuICAgICAgICBjb25zdCBmaWx0ZXJfaXRlbSA9IHRoaXMuZmlsdGVyc1tqXTsgICBcclxuXHJcbiAgICAgICAgaWYoIGZpbHRlcl9pdGVtLnNlYXJjaFRleHQgJiYgdHlwZW9mIChmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSA9PT0gJ3N0cmluZycgJiYgZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCAhPT0gJycgJiYgZmlsdGVyX2l0ZW0udHlwZSAhPT0gVENGaWx0ZXJzVHlwZS5udW1iZXIgJiYgZmlsdGVyX2l0ZW0udHlwZSAhPT0gVENGaWx0ZXJzVHlwZS5kYXRlICl7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGZpbHRlcl9pdGVtLnNlYXJjaFRleHQgPSB0aGlzLm5vcm1hbGl6ZShmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KTsgICAgICAgIFxyXG4gICAgICAgICAgbGV0IGl0ZW1fdmFsdWUgPSB0aGlzLmNvbGxlY3Rpb25GaW5kKHRoaXMuZGF0YVtpXSwgZmlsdGVyX2l0ZW0uc2VhcmNoSW4pO1xyXG4gICAgICAgICAgaWYoIGl0ZW1fdmFsdWUgKXtcclxuICAgICAgICAgICAgaXRlbV92YWx1ZSA9IHRoaXMubm9ybWFsaXplKGl0ZW1fdmFsdWUpOyAgIFxyXG5cclxuICAgICAgICAgICAgaWYoIHR5cGVvZiBmaWx0ZXJfaXRlbS5ub3RJbiA9PT0gJ2Jvb2xlYW4nICYmIGZpbHRlcl9pdGVtLm5vdEluICl7XHJcbiAgICAgICAgICAgICAgaWYoICggaXRlbV92YWx1ZSA9PT0gZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCApICl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGFJbmRleChpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuXHJcbiAgICAgICAgICAgICAgaWYoIGZpbHRlcl9pdGVtLnR5cGUgPT09IFRDRmlsdGVyc1R5cGUuc2VsZWN0ICl7XHJcbiAgICAgICAgICAgICAgICAvLyBFeGNsdXNpdm8gcGFyYSBzZWxlY3RcclxuICAgICAgICAgICAgICAgIGlmKCBmaWx0ZXJfaXRlbS5kYXRhICYmIChmaWx0ZXJfaXRlbS5kYXRhKS5sZW5ndGggPiAwICl7XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyB1c28gZG8gc2VsZWN0IGNvbSBvIG5vdFZhbHVlczogc3RyaW5nW11cclxuICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRfb3B0aW9uID0gW107XHJcbiAgICAgICAgICAgICAgICAgIGZvciggbGV0IGsgPSAwOyBrIDwgKGZpbHRlcl9pdGVtLmRhdGEpLmxlbmd0aDsgaysrICl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga19pdGVtID0gZmlsdGVyX2l0ZW0uZGF0YVtrXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggYCR7a19pdGVtPy52YWx1ZX1gID09PSBgJHtmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0fWAgICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X29wdGlvbiA9IGtfaXRlbT8ubm90VmFsdWVzITtcclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgaWYoIGN1cnJlbnRfb3B0aW9uICYmIChjdXJyZW50X29wdGlvbikubGVuZ3RoID4gMCApe1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciggbGV0IHYgPSAwOyB2IDwgKGN1cnJlbnRfb3B0aW9uKS5sZW5ndGg7IHYrKyApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdl9pdGVtID0gY3VycmVudF9vcHRpb25bdl07ICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYoICggaXRlbV92YWx1ZSA9PT0gdl9pdGVtICkgKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhSW5kZXgoaSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHVzbyBub3JtYWwgZG8gc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoICEoIGl0ZW1fdmFsdWUgPT09IGZpbHRlcl9pdGVtLnNlYXJjaFRleHQgKSApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhSW5kZXgoaSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgaWYoICEoIGl0ZW1fdmFsdWUuaW5jbHVkZXMoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCkgfHwgaXRlbV92YWx1ZSA9PT0gZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCApICl7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YUluZGV4KGksIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgdGhpcy5zZXREYXRhSW5kZXgoaSwgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gXHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIGlmKCBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0ICYmIGZpbHRlcl9pdGVtLnNlYXJjaFRleHQgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTiggZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dC52YWx1ZU9mKCkpICYmIGZpbHRlcl9pdGVtLnR5cGUgPT09IFRDRmlsdGVyc1R5cGUuZGF0ZXRpbWUgKXtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgbGV0IGl0ZW1fdmFsdWU6IGFueSA9IHRoaXMuY29sbGVjdGlvbkZpbmQodGhpcy5kYXRhW2ldLCBmaWx0ZXJfaXRlbS5zZWFyY2hJbik7XHJcblxyXG4gICAgICAgICAgdHJ5IHsgaXRlbV92YWx1ZSA9IG5ldyBEYXRlKGl0ZW1fdmFsdWUpOyB9IGNhdGNoIChlcnJvcikge31cclxuICAgICAgICAgIGlmKCBpdGVtX3ZhbHVlICYmICBpdGVtX3ZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oIGl0ZW1fdmFsdWUudmFsdWVPZigpKSApe1xyXG4gICAgICAgICAgICBsZXQgaXNfYWNjZXB0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkdF90YXJnZXQgICA9ICggKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpLmdldFRpbWUoKSApLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDEwKTsgLyogKyAoMyAqIDYwICogNjAgKiAxMDAwKTsgKi9cclxuICAgICAgICAgICAgY29uc3QgZHRfY3VycmVudCAgPSAoIChpdGVtX3ZhbHVlKS5nZXRUaW1lKCkgKS50b1N0cmluZygpLnN1YnN0cmluZygwLCAxMCk7XHJcbiAgICAgICAgICAgIGlmKCBmaWx0ZXJfaXRlbS5jb25kaXRpb24gKXtcclxuICAgICAgICAgICAgICBzd2l0Y2ggKGZpbHRlcl9pdGVtLmNvbmRpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBUQ0NvbmRpdGlvbi5ndDogICAgaXNfYWNjZXB0ID0gKCBOdW1iZXIoZHRfdGFyZ2V0KSA+ICBOdW1iZXIoZHRfY3VycmVudCkgKTsgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBUQ0NvbmRpdGlvbi5sdDogICAgaXNfYWNjZXB0ID0gKCBOdW1iZXIoZHRfdGFyZ2V0KSA8ICBOdW1iZXIoZHRfY3VycmVudCkgKTsgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBUQ0NvbmRpdGlvbi5ndGU6ICAgaXNfYWNjZXB0ID0gKCBOdW1iZXIoZHRfdGFyZ2V0KSA8PSBOdW1iZXIoZHRfY3VycmVudCkgKTsgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBUQ0NvbmRpdGlvbi5sdGU6ICAgaXNfYWNjZXB0ID0gKCBOdW1iZXIoZHRfdGFyZ2V0KSA+PSBOdW1iZXIoZHRfY3VycmVudCkgKTsgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBUQ0NvbmRpdGlvbi5lcXVhbDogaXNfYWNjZXB0ID0gKCBOdW1iZXIoZHRfdGFyZ2V0KSA9PT0gTnVtYmVyKGR0X2N1cnJlbnQpICk7ICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgVENDb25kaXRpb24ubm90RXF1YWw6IGlzX2FjY2VwdCA9ICggTnVtYmVyKGR0X3RhcmdldCkgIT0gTnVtYmVyKGR0X2N1cnJlbnQpICk7ICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGlzX2FjY2VwdCA9ICggTnVtYmVyKGR0X3RhcmdldCkgPT0gTnVtYmVyKGR0X2N1cnJlbnQpICk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBpc19hY2NlcHQgPSAoIE51bWJlcihmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSA9PT0gTnVtYmVyKGl0ZW1fdmFsdWUpICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoICFpc19hY2NlcHQgKXtcclxuICAgICAgICAgICAgICB0aGlzLnNldERhdGFJbmRleChpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFxyXG5cclxuICAgICAgICBpZiggZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCAmJiB0eXBlb2YgTnVtYmVyKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpID09PSAnbnVtYmVyJyAmJiAoIGZpbHRlcl9pdGVtLnR5cGUgPT09IFRDRmlsdGVyc1R5cGUubnVtYmVyIHx8IGZpbHRlcl9pdGVtLnR5cGUgPT09IFRDRmlsdGVyc1R5cGUuZGF0ZSApICl7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGZpbHRlcl9pdGVtLnNlYXJjaFRleHQgPSBOdW1iZXIoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCk7XHJcbiAgICAgICAgICBsZXQgaXRlbV92YWx1ZSA9IHRoaXMuY29sbGVjdGlvbkZpbmQodGhpcy5kYXRhW2ldLCBmaWx0ZXJfaXRlbS5zZWFyY2hJbik7XHJcblxyXG4gICAgICAgICAgaWYoIHR5cGVvZiBOdW1iZXIoaXRlbV92YWx1ZSkgPT09ICdudW1iZXInICl7ICAgXHJcbiAgICAgICAgICAgIGl0ZW1fdmFsdWUgPSBOdW1iZXIoaXRlbV92YWx1ZSk7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBpc19hY2NlcHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYoIGZpbHRlcl9pdGVtLmNvbmRpdGlvbiApe1xyXG5cclxuICAgICAgICAgICAgICBzd2l0Y2ggKGZpbHRlcl9pdGVtLmNvbmRpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBUQ0NvbmRpdGlvbi5ndDogICAgaXNfYWNjZXB0ID0gKCBOdW1iZXIoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCkgPiAgTnVtYmVyKGl0ZW1fdmFsdWUpICk7ICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgVENDb25kaXRpb24ubHQ6ICAgIGlzX2FjY2VwdCA9ICggTnVtYmVyKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpIDwgIE51bWJlcihpdGVtX3ZhbHVlKSApOyAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLmd0ZTogICBpc19hY2NlcHQgPSAoIE51bWJlcihmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSA8PSBOdW1iZXIoaXRlbV92YWx1ZSkgKTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLmx0ZTogICBpc19hY2NlcHQgPSAoIE51bWJlcihmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSA+PSBOdW1iZXIoaXRlbV92YWx1ZSkgKTsgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBUQ0NvbmRpdGlvbi5lcXVhbDogaXNfYWNjZXB0ID0gKCBOdW1iZXIoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCkgPT09IE51bWJlcihpdGVtX3ZhbHVlKSApOyBicmVhazsgXHJcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLm5vdEVxdWFsOiBpc19hY2NlcHQgPSAoIE51bWJlcihmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSAhPSBOdW1iZXIoaXRlbV92YWx1ZSkgKTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBpc19hY2NlcHQgPSAoIE51bWJlcihmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSA9PSBOdW1iZXIoaXRlbV92YWx1ZSkgKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGlzX2FjY2VwdCA9ICggTnVtYmVyKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpID09PSBOdW1iZXIoaXRlbV92YWx1ZSkgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggIWlzX2FjY2VwdCApe1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0RGF0YUluZGV4KGksIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBpZiggdHlwZW9mIChmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSA9PT0gJ2Jvb2xlYW4nICYmIGZpbHRlcl9pdGVtLnNlYXJjaFRleHQgPT09IHRydWUgKXtcclxuXHJcbiAgICAgICAgICBsZXQgaXRlbV92YWx1ZTogYW55ID0gdGhpcy5jb2xsZWN0aW9uRmluZCh0aGlzLmRhdGFbaV0sIGZpbHRlcl9pdGVtLnNlYXJjaEluKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgaWYoIGl0ZW1fdmFsdWUgJiYgKGl0ZW1fdmFsdWUpLmxlbmd0aCA+IDAgKXsgIFxyXG4gICAgICAgICAgICBsZXQgcXRkX2lzX3RydWUgPSAwOyAgICAgICAgICBcclxuICAgICAgICAgICAgZm9yKCBsZXQgaSA9IDA7IGkgPCAoKGl0ZW1fdmFsdWUpLmxlbmd0aCk7IGkrKyApe1xyXG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtX3ZhbHVlW2ldO1xyXG4gICAgICAgICAgICAgIGlmKCBpdGVtID09PSBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0ICl7XHJcbiAgICAgICAgICAgICAgICBxdGRfaXNfdHJ1ZSsrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggcXRkX2lzX3RydWUgPT09IDAgKXtcclxuICAgICAgICAgICAgICB0aGlzLnNldERhdGFJbmRleChpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBpZiggISggaXRlbV92YWx1ZSA9PT0gZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCApICl7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXREYXRhSW5kZXgoaSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIH1cclxuXHJcbiAgICB9IC8vIGVuZCBmb3JcclxuICAgIFxyXG4gICAgdGhpcy50b1Jlc3VsdCgpO1xyXG4gICAgICBcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9SZXN1bHQoKXtcclxuXHJcblxyXG4gICAgY29uc3Qgc2VhcmNoX2RhdGEgPSBbXTtcclxuXHJcbiAgICBsZXQgaXNfZmlsdGVyID0gZmFsc2U7XHJcbiAgICBmb3IoIGxldCBpID0gMDsgaSA8ICh0aGlzLmZpbHRlcnMpLmxlbmd0aDsgaSsrICl7XHJcbiAgICAgIGlmKCB0aGlzLmZpbHRlcnNbaV0uc2VhcmNoVGV4dCAmJiB0aGlzLmZpbHRlcnNbaV0uc2VhcmNoVGV4dCAhPT0gJycgKXtcclxuICAgICAgICBpc19maWx0ZXIgPSB0cnVlOyBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmKCBpc19maWx0ZXIgKXtcclxuICAgICAgZm9yKCBsZXQgaSA9IDA7IGkgPCAodGhpcy5kYXRhKS5sZW5ndGg7IGkrKyApe1xyXG4gICAgICAgIGlmKCB0aGlzLmRhdGEgJiYgdGhpcy5kYXRhW2ldICYmIHRoaXMuZGF0YVtpXVsndGNfZmlsdGVyX2FjY2VwdCddICl7XHJcbiAgICAgICAgICAoc2VhcmNoX2RhdGEpLnB1c2godGhpcy5kYXRhW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucmVzdWx0X2FjY2VwdChzZWFyY2hfZGF0YSk7XHJcbiAgICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7Li4udGhpcy5maWx0ZXJzfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlc3VsdF9hY2NlcHQodGhpcy5kYXRhKTtcclxuICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7Li4udGhpcy5maWx0ZXJzfSk7XHJcbiAgfVxyXG5cclxuICBzZXREYXRhSW5kZXgoaW5kZXg6IG51bWJlciwgdmFsdWU6IGJvb2xlYW4gKXtcclxuICAgIGlmKCB0aGlzLmRhdGEgJiYgdGhpcy5kYXRhW2luZGV4XSApe1xyXG4gICAgICB0aGlzLmRhdGFbaW5kZXhdWyd0Y19maWx0ZXJfYWNjZXB0J10gPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc3VsdF9hY2NlcHQoZGF0YTogYW55KXtcclxuICAgIGlmKCAhdGhpcy51c2VGaWx0ZXJBY2NlcHQgJiYgZGF0YSAmJiAoZGF0YSkubGVuZ3RoID4gMCApe1xyXG4gICAgICBmb3IoIGxldCBpID0gMDsgaSA8IChkYXRhKS5sZW5ndGg7IGkrKyApe1xyXG4gICAgICAgIGRlbGV0ZSBkYXRhW2ldWyd0Y19maWx0ZXJfYWNjZXB0J107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucmVzdWx0LmVtaXQoZGF0YSk7XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8ZGl2ICpuZ0lmPVwic2hvd19maWx0ZXJzXCIgY2xhc3M9XCJ0Y2xvdWQtdWktZmlsdGVycyBhcmVhLWZpbHRlclwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJzOyBsZXQgaSA9IGluZGV4XCI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXRlbS50eXBlIHx8IChpdGVtLnR5cGUgJiYgaXRlbS50eXBlICE9PSAnYm9vbGVhbicpXCI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50eXBlID09PSAnZGF0ZS1sb2NhbCdcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZpbHRlci1pbnB1dCB0eXBlLXt7aXRlbS50eXBlfX0gYm94LXR5cGUte3tpdGVtLnR5cGV9fVwiIFtzdHlsZV09XCIoaXRlbS53aWR0aCAhPT0gJycpID8gJ3dpZHRoOicraXRlbS53aWR0aCA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZGVzY3JpcHRpb24gdGMtdGl0bGUtZWxsaXBzaXMgYm94LXR5cGUte3tpdGVtLnR5cGV9fVwiIHRpdGxlPVwie3sgaXRlbS5kZXNjcmlwdGlvbiB9fVwiPjxpIFtjbGFzcy50by1hY3RpdmVdPVwiKGl0ZW0udmFsdWUgIT09IHVuZGVmaW5lZCAmJiBpdGVtLnZhbHVlICE9PSBudWxsICYmIGl0ZW0udmFsdWUgIT09ICcnKVwiIGNsYXNzPVwiZmFzIGZhLWZpbHRlciBpY29uLWZpbHRlclwiPjwvaT4mbmJzcDt7eyBpdGVtLmRlc2NyaXB0aW9uIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC10eXBlLXt7aXRlbS50eXBlfX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRjbG91ZC11aS1kYXRlcGlja2VyIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI19pbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImlucHV0X3t7aSsxfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVJbnB1dF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWFyY2hJbihpdGVtLCBfaW5wdXQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGNsb3VkLXVpLWRhdGVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tY2xlYXItZmlsdGVyLXRleHRcIiBbY2xhc3MudG8taGlkZV09XCIhKGl0ZW0udmFsdWUgIT09IHVuZGVmaW5lZCAmJiBpdGVtLnZhbHVlICE9PSBudWxsICYmIGl0ZW0udmFsdWUgIT09ICcnKVwiIChjbGljayk9XCJzZWFyY2hJbihpdGVtLCBudWxsKTsgaXRlbS5zZWFyY2hUZXh0ID0gdW5kZWZpbmVkOyBpdGVtLnZhbHVlID0gJydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnR5cGUgIT09ICdkYXRlLWxvY2FsJ1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2RhdGV0aW1lLWxvY2FsJ1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGl0ZW0uaWQgPT09ICdzdGFydCcgfHwgaXRlbS5pZCA9PT0gJ3N0b3AnKSAmJiB1c2VSYW5nZURhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQRVJJT0QgUkFOR0UgREFURSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uaWQgPT09ICdzdGFydCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZmlsdGVyLWlucHV0IHR5cGUte3tpdGVtLnR5cGV9fSBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgW3N0eWxlXT1cIihpdGVtLndpZHRoICE9PSAnJykgPyAnd2lkdGg6JytzdGFydF9zdG9wX3dpZHRoKycnK3N0YXJ0X3N0b3BfdW5kIDogJydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1kZXNjcmlwdGlvbiB0Yy10aXRsZS1lbGxpcHNpcyBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgdGl0bGU9XCJ7eyBpdGVtLmRlc2NyaXB0aW9uIH19XCI+PGkgW2NsYXNzLnRvLWFjdGl2ZV09XCIoX3JhbmdlX2RhdGUgJiYgX3JhbmdlX2RhdGUucmVzdWx0ICYmIF9yYW5nZV9kYXRlLnJlc3VsdC5zdGFydCAmJiBfcmFuZ2VfZGF0ZS5yZXN1bHQuc3RvcCApXCIgY2xhc3M9XCJmYXMgZmEtZmlsdGVyIGljb24tZmlsdGVyXCI+PC9pPiZuYnNwOzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyYW5nZS1kYXRlICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI19yYW5nZV9kYXRlIG5nTW9kZWwgbmFtZT1cImlucHV0X3t7aSsxfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRWYWx1ZVBlcmlvZFN0YXJ0U3RvcF09XCJpdGVtLmRlZmF1bHRWYWx1ZVBlcmlvZFN0YXJ0U3RvcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvblN0YXJ0XT1cImRlc2NyaXB0aW9uU3RhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVzY3JpcHRpb25TdG9wXT1cImRlc2NyaXB0aW9uU3RvcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwic2VhcmNoSW5SYW5nZShfcmFuZ2VfZGF0ZSk7IHNlYXJjaEluKGl0ZW0sIF9yYW5nZV9kYXRlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmFuZ2UtZGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwiaXRlbS5pZCA9PT0gJ3N0YXJ0J1wiICNfaW5wdXQgbmFtZT1cImlucHV0X3t7aSsxfX1cIiB0eXBlPVwiaGlkZGVuXCIgWyhuZ01vZGVsKV09XCJzdGFydF92YWx1ZVwiPiAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIml0ZW0uaWQgPT09ICdzdG9wJ1wiICNfaW5wdXQgbmFtZT1cImlucHV0X3t7aSsxfX1cIiB0eXBlPVwiaGlkZGVuXCIgWyhuZ01vZGVsKV09XCJzdG9wX3ZhbHVlXCI+ICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXRlbS5pZCB8fCAhdXNlUmFuZ2VEYXRlXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZpbHRlci1pbnB1dCB0eXBlLXt7aXRlbS50eXBlfX0gYm94LXR5cGUte3tpdGVtLnR5cGV9fVwiIFtzdHlsZV09XCIoaXRlbS53aWR0aCAhPT0gJycpID8gJ3dpZHRoOicraXRlbS53aWR0aCA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1kZXNjcmlwdGlvbiB0Yy10aXRsZS1lbGxpcHNpcyBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgdGl0bGU9XCJ7eyBpdGVtLmRlc2NyaXB0aW9uIH19XCI+PGkgW2NsYXNzLnRvLWFjdGl2ZV09XCIoaXRlbS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGl0ZW0udmFsdWUgIT09IG51bGwgJiYgaXRlbS52YWx1ZSAhPT0gJycpXCIgY2xhc3M9XCJmYXMgZmEtZmlsdGVyIGljb24tZmlsdGVyXCI+PC9pPiZuYnNwO3t7IGl0ZW0uZGVzY3JpcHRpb24gfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtdHlwZS17e2l0ZW0udHlwZX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRjbG91ZC11aS1kYXRlcGlja2VyLXRpbWUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNfaW5wdXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS52YWx1ZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiaW5wdXRfe3tpKzF9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlT3B0aW9uc0RhdGVUaW1lXT1cIihpdGVtICYmIGl0ZW0udXNlT3B0aW9uc0RhdGVUaW1lKSA/IHRydWUgOiBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudENoYW5nZSk9XCJzZWFyY2hJbihpdGVtLCBfaW5wdXQpXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGNsb3VkLXVpLWRhdGVwaWNrZXItdGltZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWNsZWFyLWZpbHRlci10ZXh0XCIgW2NsYXNzLnRvLWhpZGVdPVwiIShpdGVtLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgaXRlbS52YWx1ZSAhPT0gbnVsbCAmJiBpdGVtLnZhbHVlICE9PSAnJylcIiAoY2xpY2spPVwic2VhcmNoSW4oaXRlbSwgbnVsbCk7IGl0ZW0uc2VhcmNoVGV4dCA9IHVuZGVmaW5lZDsgaXRlbS52YWx1ZSA9ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50eXBlICE9PSAnc2VsZWN0JyAmJiBpdGVtLnR5cGUgIT09ICdkYXRldGltZS1sb2NhbCcgJiYgaXRlbS50eXBlICE9PSAnZGF0ZS1sb2NhbCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZmlsdGVyLWlucHV0IHR5cGUte3tpdGVtLnR5cGV9fSBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgW3N0eWxlXT1cIihpdGVtLndpZHRoICE9PSAnJykgPyAnd2lkdGg6JytpdGVtLndpZHRoIDogJydcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZGVzY3JpcHRpb24gdGMtdGl0bGUtZWxsaXBzaXMgYm94LXR5cGUte3tpdGVtLnR5cGV9fVwiIHRpdGxlPVwie3sgaXRlbS5kZXNjcmlwdGlvbiB9fVwiPjxpIFtjbGFzcy50by1hY3RpdmVdPVwiX2lucHV0LnZhbHVlICE9PSAnJ1wiIGNsYXNzPVwiZmFzIGZhLWZpbHRlciBpY29uLWZpbHRlclwiPjwvaT4mbmJzcDt7eyBpdGVtLmRlc2NyaXB0aW9uIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC10eXBlLXt7aXRlbS50eXBlfX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI19pbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgKGl0ZW0ucGxhY2Vob2xkZXIgIT09ICcnKSA/IGl0ZW0ucGxhY2Vob2xkZXIgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiaW5wdXRfe3tpKzF9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInt7IChpdGVtLnR5cGUgPT09ICdudW1iZXInKSA/ICd0ZXh0JyA6IGl0ZW0udHlwZSB9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0Yy1mb3JtLWNvbnRyb2xcIiAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cInNlYXJjaEluKGl0ZW0sICRldmVudClcIj4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWNsZWFyLWZpbHRlci10ZXh0XCIgW2NsYXNzLnRvLWhpZGVdPVwiX2lucHV0LnZhbHVlID09PSAnJ1wiIChjbGljayk9XCJzZWFyY2hJbihpdGVtLCBudWxsKTsgX2lucHV0LnZhbHVlID0gJydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdzZWxlY3QnICYmIGl0ZW0uZGF0YSAmJiAoaXRlbS5kYXRhKS5sZW5ndGggPiAwXCIgPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1maWx0ZXItaW5wdXQgdHlwZS17e2l0ZW0udHlwZX19IGJveC10eXBlLXt7aXRlbS50eXBlfX1cIiBbc3R5bGVdPVwiKGl0ZW0ud2lkdGggIT09ICcnKSA/ICd3aWR0aDonK2l0ZW0ud2lkdGggOiAnJ1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1kZXNjcmlwdGlvbiB0Yy10aXRsZS1lbGxpcHNpcyBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgdGl0bGU9XCJ7eyBpdGVtLmRlc2NyaXB0aW9uIH19XCI+PGkgW2NsYXNzLnRvLWFjdGl2ZV09XCJfaW5wdXQudmFsdWUgIT09ICcnXCIgY2xhc3M9XCJmYXMgZmEtZmlsdGVyIGljb24tZmlsdGVyXCI+PC9pPiZuYnNwO3t7IGl0ZW0uZGVzY3JpcHRpb24gfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LXR5cGUte3tpdGVtLnR5cGV9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI19pbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpbnB1dF97e2krMX19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRjLWZvcm0tY29udHJvbFwiICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNlYXJjaEluKGl0ZW0sICRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiXCI+PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2IG9mIGl0ZW0uZGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cInYudmFsdWVcIj57eyB2LmRlc2NyaXB0aW9uIH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udHlwZSAmJiBpdGVtLnR5cGUgPT09ICdib29sZWFuJ1wiPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1maWx0ZXItaW5wdXRcIiBbc3R5bGVdPVwiKGl0ZW0ud2lkdGggIT09ICcnKSA/ICd3aWR0aDonK2l0ZW0ud2lkdGggOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tZGVzY3JpcHRpb24gdGMtdGl0bGUtZWxsaXBzaXNcIiB0aXRsZT1cInt7IGl0ZW0uZGVzY3JpcHRpb24gfX1cIiB0aXRsZT1cInt7IGl0ZW0uZGVzY3JpcHRpb24gfX1cIj48aSBbY2xhc3MudG8tYWN0aXZlXT1cIl9pbnB1dC5jaGVja2VkID09PSB0cnVlXCIgY2xhc3M9XCJmYXMgZmEtZmlsdGVyIGljb24tZmlsdGVyXCI+PC9pPiZuYnNwO3t7IGl0ZW0uZGVzY3JpcHRpb24gfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmVhLWlucHV0LWNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRjLWZvcm0tY29udHJvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnBsYWNlaG9sZGVyIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI19pbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgKGl0ZW0ucGxhY2Vob2xkZXIgIT09ICcnKSA/IGl0ZW0ucGxhY2Vob2xkZXIgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImlucHV0X3t7aSsxfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNlYXJjaEluKGl0ZW0sIF9pbnB1dC5jaGVja2VkKVwiPiAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1yaWdodCBtYi0xIG1yLTFcIiAqbmdJZj1cInVzZUJ1dHRvblN1Ym1pdFwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGMtYnRuIHt7IGJ0blN1Ym1pdENsYXNzIH19XCIgKGNsaWNrKT1cInRvU3VibWl0KClcIiA+e3sgc3VibWl0VGV4dCB9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuXHJcbjwhLS0gPHByZT57eyBpbnB1dHMgfCBqc29uIH19PC9wcmU+IC0tPlxyXG48IS0tIDxwcmU+IHt7IGRhdGEgfCBqc29uIH19IDwvcHJlPiAtLT5cclxuXHJcbjwhLS0gPHA+RklMVEVSUzwvcD48cHJlPiB7eyBmaWx0ZXJzIHwganNvbiB9fTwvcHJlPiAtLT5cclxuXHJcbjwhLS1cclxuICAgIDxwcmU+c3RhcnRfc3RvcDoge3sgc3RhcnRfc3RvcCB9fTwvcHJlPlxyXG4gICAgPHByZT5zdGFydF9zdG9wX3dpZHRoOiB7eyBzdGFydF9zdG9wX3dpZHRoIH19PC9wcmU+XHJcbiAgICA8cHJlPnN0YXJ0X3N0b3BfdW5kOiB7eyBzdGFydF9zdG9wX3VuZCB9fTwvcHJlPlxyXG4tLT4iXX0=
1
+ import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
2
+ import { TCCondition, TCFiltersType } from './tcloud-ui-filters';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "@angular/forms";
6
+ import * as i3 from "../tcloud-ui-datepicker-time/tcloud-ui-datepicker-time.component";
7
+ import * as i4 from "../tcloud-ui-datepicker/tcloud-ui-datepicker.component";
8
+ import * as i5 from "./components/range-date/range-date.component";
9
+ export class TCloudUiFiltersComponent {
10
+ set data(data) {
11
+ // this._data = JSON.parse(JSON.stringify(data));
12
+ }
13
+ get data() { return this._data; }
14
+ set filters(filters) {
15
+ //this._filters = filters;
16
+ }
17
+ get filters() { return this._filters; }
18
+ set submitText(v) {
19
+ if (v && v !== this._submitText) {
20
+ this._submitText = v;
21
+ }
22
+ }
23
+ get submitText() { return this._submitText; }
24
+ constructor(datepipe) {
25
+ this.datepipe = datepipe;
26
+ this.datepickers = [];
27
+ this.inputs = [];
28
+ this.show_filters = false;
29
+ this.border = true;
30
+ this._submitText = 'Filtrar';
31
+ this.btnSubmitClass = 'tc-btn-primary';
32
+ this.useOnChangeSubmit = true; // useOnChangeSubmit - Submit automatico quando for alterado quanquer input
33
+ this.useButtonSubmit = false; // useButtonSubmit - Exibe um botão de submit e não executa a busca automaticamente
34
+ this.useNormalizeCaseSensitive = true; // useNormalizeCaseSensitive - Não valida caixa alta ou baixa e caracteres especiais
35
+ this.useRangeDate = true;
36
+ this.useFilterAccept = false;
37
+ this.result = new EventEmitter();
38
+ this.onFilter = new EventEmitter();
39
+ this.onChange = new EventEmitter();
40
+ this.onSubmit = new EventEmitter();
41
+ this.descriptionStart = '';
42
+ this.descriptionStop = '';
43
+ this.first_active_filter = false;
44
+ this.start_stop = false;
45
+ this.start_stop_width = 0;
46
+ this.start_stop_und = ''; // px ou %
47
+ this.first = true;
48
+ this.start_filter_fc = undefined;
49
+ }
50
+ ngOnInit() {
51
+ setTimeout(() => {
52
+ if (this.filters && (this.filters).length > 0) {
53
+ for (let i = 0; i < (this.filters).length; i++) {
54
+ if (this.filters[i].value) {
55
+ if (this.filters[i].type === 'datetime-local') {
56
+ try {
57
+ this.filters[i].searchText = new Date(`${this.filters[i].value}`);
58
+ }
59
+ catch (error) { }
60
+ }
61
+ else {
62
+ this.filters[i].searchText = this.filters[i].value;
63
+ }
64
+ this.first_active_filter = true;
65
+ }
66
+ }
67
+ }
68
+ this.start_stop = (this.useRangeDate) ? this.is_start_stop_datetime() : false;
69
+ this.toSubmit();
70
+ });
71
+ }
72
+ is_start_stop_datetime() {
73
+ let start = false;
74
+ let stop = false;
75
+ if (this.filters && (this.filters).length > 0) {
76
+ this.start_stop_width = 0;
77
+ for (let i = 0; i < (this.filters).length; i++) {
78
+ if (this.filters[i].id === 'start') {
79
+ start = true;
80
+ this.start_stop_width += this.getValueWidth(this.filters[i].width);
81
+ this.start_stop_und = this.getUnidade(this.filters[i].width);
82
+ this.descriptionStart = this.filters[i].description;
83
+ }
84
+ if (this.filters[i].id === 'stop') {
85
+ stop = true;
86
+ this.start_stop_width += this.getValueWidth(this.filters[i].width);
87
+ this.descriptionStop = this.filters[i].description;
88
+ }
89
+ }
90
+ }
91
+ return (start && stop) ? true : false;
92
+ }
93
+ getValueWidth(v) {
94
+ let und = this.getUnidade(v);
95
+ v = (v).replace(und, '');
96
+ return +(v);
97
+ }
98
+ getUnidade(v) {
99
+ let und = '%';
100
+ if (v && (v).includes('px')) {
101
+ und = 'px';
102
+ }
103
+ return und;
104
+ }
105
+ ngOnChanges(changes) {
106
+ if (changes && changes['data']) {
107
+ const data = changes['data'].currentValue;
108
+ if (this._data !== data) {
109
+ this._data = JSON.parse(JSON.stringify(data));
110
+ this.search_data = JSON.parse(JSON.stringify(data));
111
+ this.init();
112
+ }
113
+ }
114
+ if (changes && changes['filters']) {
115
+ const filters = changes['filters'].currentValue;
116
+ if (this._filters !== filters) {
117
+ this._filters = JSON.parse(JSON.stringify(filters));
118
+ this.init();
119
+ }
120
+ }
121
+ }
122
+ init() {
123
+ if (this.data && this.filters) {
124
+ this.show_filters = true;
125
+ if (this.filters && (this.filters).length > 0) {
126
+ (this.filters).forEach((filter) => {
127
+ this.searchIn(filter, 'sync');
128
+ });
129
+ }
130
+ if (!this.useOnChangeSubmit) {
131
+ this.result_accept(this.data);
132
+ }
133
+ if (this.useOnChangeSubmit || this.useButtonSubmit) {
134
+ this.start_filter();
135
+ }
136
+ }
137
+ }
138
+ normalize(text) {
139
+ if (this.useNormalizeCaseSensitive) {
140
+ const v = (((`${text}`).normalize('NFD').replace(/[\u0300-\u036f]/g, "")).trim()).toLowerCase();
141
+ return v;
142
+ }
143
+ return text;
144
+ }
145
+ toSubmit() {
146
+ if (this.filters && (this.filters).length > 0) {
147
+ this.init();
148
+ }
149
+ this.emitSubmitFilters();
150
+ }
151
+ emitSubmitFilters() {
152
+ let filters = JSON.parse(JSON.stringify(this.filters));
153
+ if (filters && (filters).length > 0) {
154
+ (filters).forEach((filter, i) => {
155
+ if (filter.width) {
156
+ delete (filters[i].width);
157
+ }
158
+ if (filter.placeholder) {
159
+ delete (filters[i].placeholder);
160
+ }
161
+ if (filter.description) {
162
+ delete (filters[i].description);
163
+ }
164
+ if ((!filter.searchText || filter.searchText && filter.searchText === '') && filter.type !== "boolean") {
165
+ delete (filters[i]);
166
+ }
167
+ if (filter.type === "boolean") {
168
+ if (!filter.searchText) {
169
+ filter.searchText = false;
170
+ }
171
+ }
172
+ });
173
+ }
174
+ this.onSubmit.emit(this.filters);
175
+ }
176
+ collectionFind(obj, path) {
177
+ const pathArray = path.split(".");
178
+ let current = obj;
179
+ for (let i = 0; i < pathArray.length; i++) {
180
+ const key = pathArray[i];
181
+ if (key.includes('[') && key.includes(']')) {
182
+ const nextKeys = pathArray.slice(i + 1);
183
+ const index = key.substring(key.indexOf('[') + 1, key.indexOf(']'));
184
+ const arrayKey = key.substring(0, key.indexOf('['));
185
+ if (current && current[arrayKey] && current[arrayKey][index]) {
186
+ return this.collectionFind(current[arrayKey][index], nextKeys.join("."));
187
+ }
188
+ }
189
+ if (key.includes("[]")) {
190
+ const arrayKey = key.replace("[]", "");
191
+ current = current[arrayKey] || [];
192
+ const nextKeys = pathArray.slice(i + 1);
193
+ const results = [];
194
+ for (let j = 0; j < current.length; j++) {
195
+ let result = this.collectionFind(current[j], nextKeys.join("."));
196
+ if (result !== undefined) {
197
+ results.push(result);
198
+ }
199
+ }
200
+ if (results.length === 0) {
201
+ return undefined;
202
+ }
203
+ return results;
204
+ }
205
+ else {
206
+ if (!current || (current && !current[key])) {
207
+ return undefined;
208
+ }
209
+ current = current[key];
210
+ if (current === undefined) {
211
+ return undefined;
212
+ }
213
+ }
214
+ }
215
+ return current;
216
+ }
217
+ searchInRange(range_date) {
218
+ if (this.filters && (this.filters).length > 0) {
219
+ let event = {};
220
+ event.datepickertime = true;
221
+ for (let i = 0; i < (this.filters).length; i++) {
222
+ if (this.filters[i] && this.filters[i].id && this.filters[i].id === 'start') {
223
+ this.filters[i].value = range_date?.result?.start;
224
+ this.filters[i].searchText = range_date?.result?.start;
225
+ event.innerValue = this.start_value = range_date?.result?.start;
226
+ this.searchIn(this.filters[i], event);
227
+ }
228
+ if (this.filters[i] && this.filters[i].id && this.filters[i].id === 'stop') {
229
+ this.filters[i].value = range_date?.result?.stop;
230
+ this.filters[i].searchText = range_date?.result?.stop;
231
+ event.innerValue = this.stop_value = range_date?.result?.stop;
232
+ this.searchIn(this.filters[i], event);
233
+ }
234
+ }
235
+ if (this.first || this.useOnChangeSubmit) {
236
+ this.toSubmit();
237
+ }
238
+ }
239
+ this.first = false;
240
+ }
241
+ convertDataToNumber(dataString) {
242
+ try {
243
+ const [dia, mes, ano] = dataString.split('/');
244
+ return +(`${ano}${mes}${dia}`);
245
+ }
246
+ catch (error) { }
247
+ return 0;
248
+ }
249
+ searchIn(item, event) {
250
+ this.start_filter_fc = undefined;
251
+ let isValid = true;
252
+ if (event === 'sync' && isValid) {
253
+ isValid = false;
254
+ this.onChange.emit(true);
255
+ }
256
+ if (typeof event === 'boolean' && isValid) {
257
+ isValid = false;
258
+ item.searchText = event;
259
+ this.onChange.emit(true);
260
+ }
261
+ if ((event === undefined || event === null || event === '') && isValid) {
262
+ isValid = false;
263
+ item.searchText = '';
264
+ this.onChange.emit(true);
265
+ }
266
+ if (event?.datepickertime && isValid) {
267
+ isValid = false;
268
+ item.searchText = event?.innerValue;
269
+ this.onChange.emit(true);
270
+ }
271
+ if (event?.target?.value && isValid) {
272
+ isValid = false;
273
+ item.searchText = this.normalize(event.target.value);
274
+ this.onChange.emit(true);
275
+ }
276
+ if (event?.target?.value === '' && isValid) {
277
+ isValid = false;
278
+ item.searchText = '';
279
+ this.onChange.emit(true);
280
+ }
281
+ if (item.type === 'date-local' && item.value) {
282
+ isValid = false;
283
+ item.searchText = `${this.convertDataToNumber(item.value)}`;
284
+ this.onChange.emit(true);
285
+ }
286
+ if (event && event.result && (event.result.start || event.result.stop)) {
287
+ isValid = false;
288
+ this.onChange.emit(true);
289
+ }
290
+ if (this.useOnChangeSubmit || this.first_active_filter) {
291
+ this.start_filter_fc = this.start_filter();
292
+ this.first_active_filter = false;
293
+ }
294
+ if (!this.useButtonSubmit) {
295
+ this.emitSubmitFilters();
296
+ }
297
+ }
298
+ getDateUTC(dt) {
299
+ const ano = dt.getFullYear();
300
+ const mes = dt.getMonth();
301
+ const dia = dt.getDate();
302
+ const horas = dt.getHours();
303
+ const minutos = dt.getMinutes();
304
+ const segundos = dt.getSeconds();
305
+ return new Date(Date.UTC(ano, mes, dia, horas, minutos, segundos));
306
+ }
307
+ start_filter() {
308
+ for (let i = 0; i < (this.data).length; i++) {
309
+ this.setDataIndex(i, true);
310
+ for (let j = 0; j < (this.filters).length; j++) {
311
+ const filter_item = this.filters[j];
312
+ if (filter_item.searchText && typeof (filter_item.searchText) === 'string' && filter_item.searchText !== '' && filter_item.type !== TCFiltersType.number && filter_item.type !== TCFiltersType.date) {
313
+ filter_item.searchText = this.normalize(filter_item.searchText);
314
+ let item_value = this.collectionFind(this.data[i], filter_item.searchIn);
315
+ if (item_value) {
316
+ item_value = this.normalize(item_value);
317
+ if (typeof filter_item.notIn === 'boolean' && filter_item.notIn) {
318
+ if ((item_value === filter_item.searchText)) {
319
+ this.setDataIndex(i, false);
320
+ }
321
+ }
322
+ else {
323
+ if (filter_item.type === TCFiltersType.select) {
324
+ // Exclusivo para select
325
+ if (filter_item.data && (filter_item.data).length > 0) {
326
+ // uso do select com o notValues: string[]
327
+ let current_option = [];
328
+ for (let k = 0; k < (filter_item.data).length; k++) {
329
+ const k_item = filter_item.data[k];
330
+ if (`${k_item?.value}` === `${filter_item.searchText}`) {
331
+ current_option = k_item?.notValues;
332
+ break;
333
+ }
334
+ }
335
+ if (current_option && (current_option).length > 0) {
336
+ for (let v = 0; v < (current_option).length; v++) {
337
+ const v_item = current_option[v];
338
+ if ((item_value === v_item)) {
339
+ this.setDataIndex(i, false);
340
+ }
341
+ }
342
+ }
343
+ else {
344
+ // uso normal do select
345
+ if (!(item_value === filter_item.searchText)) {
346
+ this.setDataIndex(i, false);
347
+ }
348
+ }
349
+ }
350
+ }
351
+ else {
352
+ if (!(item_value.includes(filter_item.searchText) || item_value === filter_item.searchText)) {
353
+ this.setDataIndex(i, false);
354
+ }
355
+ }
356
+ }
357
+ }
358
+ else {
359
+ this.setDataIndex(i, false);
360
+ }
361
+ }
362
+ if (filter_item.searchText && filter_item.searchText instanceof Date && !isNaN(filter_item.searchText.valueOf()) && filter_item.type === TCFiltersType.datetime) {
363
+ let item_value = this.collectionFind(this.data[i], filter_item.searchIn);
364
+ try {
365
+ item_value = new Date(item_value);
366
+ }
367
+ catch (error) { }
368
+ if (item_value && item_value instanceof Date && !isNaN(item_value.valueOf())) {
369
+ let is_accept = false;
370
+ const dt_target = ((filter_item.searchText).getTime()).toString().substring(0, 10); /* + (3 * 60 * 60 * 1000); */
371
+ const dt_current = ((item_value).getTime()).toString().substring(0, 10);
372
+ if (filter_item.condition) {
373
+ switch (filter_item.condition) {
374
+ case TCCondition.gt:
375
+ is_accept = (Number(dt_target) > Number(dt_current));
376
+ break;
377
+ case TCCondition.lt:
378
+ is_accept = (Number(dt_target) < Number(dt_current));
379
+ break;
380
+ case TCCondition.gte:
381
+ is_accept = (Number(dt_target) <= Number(dt_current));
382
+ break;
383
+ case TCCondition.lte:
384
+ is_accept = (Number(dt_target) >= Number(dt_current));
385
+ break;
386
+ case TCCondition.equal:
387
+ is_accept = (Number(dt_target) === Number(dt_current));
388
+ break;
389
+ case TCCondition.notEqual:
390
+ is_accept = (Number(dt_target) != Number(dt_current));
391
+ break;
392
+ default: is_accept = (Number(dt_target) == Number(dt_current));
393
+ }
394
+ }
395
+ else {
396
+ is_accept = (Number(filter_item.searchText) === Number(item_value));
397
+ }
398
+ if (!is_accept) {
399
+ this.setDataIndex(i, false);
400
+ }
401
+ }
402
+ }
403
+ if (filter_item.searchText && typeof Number(filter_item.searchText) === 'number' && (filter_item.type === TCFiltersType.number || filter_item.type === TCFiltersType.date)) {
404
+ filter_item.searchText = Number(filter_item.searchText);
405
+ let item_value = this.collectionFind(this.data[i], filter_item.searchIn);
406
+ if (typeof Number(item_value) === 'number') {
407
+ item_value = Number(item_value);
408
+ let is_accept = false;
409
+ if (filter_item.condition) {
410
+ switch (filter_item.condition) {
411
+ case TCCondition.gt:
412
+ is_accept = (Number(filter_item.searchText) > Number(item_value));
413
+ break;
414
+ case TCCondition.lt:
415
+ is_accept = (Number(filter_item.searchText) < Number(item_value));
416
+ break;
417
+ case TCCondition.gte:
418
+ is_accept = (Number(filter_item.searchText) <= Number(item_value));
419
+ break;
420
+ case TCCondition.lte:
421
+ is_accept = (Number(filter_item.searchText) >= Number(item_value));
422
+ break;
423
+ case TCCondition.equal:
424
+ is_accept = (Number(filter_item.searchText) === Number(item_value));
425
+ break;
426
+ case TCCondition.notEqual:
427
+ is_accept = (Number(filter_item.searchText) != Number(item_value));
428
+ break;
429
+ default: is_accept = (Number(filter_item.searchText) == Number(item_value));
430
+ }
431
+ }
432
+ else {
433
+ is_accept = (Number(filter_item.searchText) === Number(item_value));
434
+ }
435
+ if (!is_accept) {
436
+ this.setDataIndex(i, false);
437
+ }
438
+ }
439
+ }
440
+ if (typeof (filter_item.searchText) === 'boolean' && filter_item.searchText === true) {
441
+ let item_value = this.collectionFind(this.data[i], filter_item.searchIn);
442
+ if (item_value && (item_value).length > 0) {
443
+ let qtd_is_true = 0;
444
+ for (let i = 0; i < ((item_value).length); i++) {
445
+ const item = item_value[i];
446
+ if (item === filter_item.searchText) {
447
+ qtd_is_true++;
448
+ }
449
+ }
450
+ if (qtd_is_true === 0) {
451
+ this.setDataIndex(i, false);
452
+ }
453
+ }
454
+ else {
455
+ if (!(item_value === filter_item.searchText)) {
456
+ this.setDataIndex(i, false);
457
+ }
458
+ }
459
+ }
460
+ }
461
+ } // end for
462
+ this.toResult();
463
+ }
464
+ toResult() {
465
+ const search_data = [];
466
+ let is_filter = false;
467
+ for (let i = 0; i < (this.filters).length; i++) {
468
+ if (this.filters[i].searchText && this.filters[i].searchText !== '') {
469
+ is_filter = true;
470
+ break;
471
+ }
472
+ }
473
+ if (is_filter) {
474
+ for (let i = 0; i < (this.data).length; i++) {
475
+ if (this.data && this.data[i] && this.data[i]['tc_filter_accept']) {
476
+ (search_data).push(this.data[i]);
477
+ }
478
+ }
479
+ this.result_accept(search_data);
480
+ this.onFilter.emit({ ...this.filters });
481
+ return;
482
+ }
483
+ this.result_accept(this.data);
484
+ this.onFilter.emit({ ...this.filters });
485
+ }
486
+ setDataIndex(index, value) {
487
+ if (this.data && this.data[index]) {
488
+ this.data[index]['tc_filter_accept'] = value;
489
+ }
490
+ }
491
+ result_accept(data) {
492
+ if (!this.useFilterAccept && data && (data).length > 0) {
493
+ for (let i = 0; i < (data).length; i++) {
494
+ delete data[i]['tc_filter_accept'];
495
+ }
496
+ }
497
+ this.result.emit(data);
498
+ }
499
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: TCloudUiFiltersComponent, deps: [{ token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Component }); }
500
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: TCloudUiFiltersComponent, selector: "tcloud-ui-filters", inputs: { border: "border", data: "data", filters: "filters", submitText: "submitText", btnSubmitClass: "btnSubmitClass", useOnChangeSubmit: "useOnChangeSubmit", useButtonSubmit: "useButtonSubmit", useNormalizeCaseSensitive: "useNormalizeCaseSensitive", useRangeDate: "useRangeDate", useFilterAccept: "useFilterAccept" }, outputs: { result: "result", onFilter: "onFilter", onChange: "onChange", onSubmit: "onSubmit" }, viewQueries: [{ propertyName: "_formulario", first: true, predicate: ["_formulario"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"show_filters\" class=\"tcloud-ui-filters area-filter\" [class.no-border]=\"!border\">\r\n <ng-container *ngFor=\"let item of filters; let i = index\">\r\n\r\n <ng-container *ngIf=\"!item.type || (item.type && item.type !== 'boolean')\">\r\n\r\n <ng-container *ngIf=\"item.type === 'date-local'\">\r\n\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(item.value !== undefined && item.value !== null && item.value !== '')\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <tcloud-ui-datepicker \r\n #_input\r\n name=\"input_{{i+1}}\"\r\n [modeInput]=\"true\"\r\n [(ngModel)]=\"item.value\"\r\n (ngModelChange)=\"searchIn(item, _input)\">\r\n </tcloud-ui-datepicker>\r\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"!(item.value !== undefined && item.value !== null && item.value !== '')\" (click)=\"searchIn(item, null); item.searchText = undefined; item.value = ''\">\r\n <i class=\"fas fa-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type !== 'date-local'\">\r\n <ng-container *ngIf=\"item.type === 'datetime-local'\">\r\n\r\n <ng-container *ngIf=\"(item.id === 'start' || item.id === 'stop') && useRangeDate\">\r\n <!-- PERIOD RANGE DATE -->\r\n <ng-container *ngIf=\"item.id === 'start'\">\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+start_stop_width+''+start_stop_und : ''\">\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(_range_date && _range_date.result && _range_date.result.start && _range_date.result.stop )\" class=\"fas fa-filter icon-filter\"></i>&nbsp;</div>\r\n <range-date \r\n #_range_date ngModel name=\"input_{{i+1}}\" \r\n [defaultValuePeriodStartStop]=\"item.defaultValuePeriodStartStop\"\r\n [descriptionStart]=\"descriptionStart\"\r\n [descriptionStop]=\"descriptionStop\"\r\n required \r\n (onChange)=\"searchInRange(_range_date); searchIn(item, _range_date)\">\r\n </range-date>\r\n </div>\r\n </ng-container> \r\n <input *ngIf=\"item.id === 'start'\" #_input name=\"input_{{i+1}}\" type=\"hidden\" [(ngModel)]=\"start_value\"> \r\n <input *ngIf=\"item.id === 'stop'\" #_input name=\"input_{{i+1}}\" type=\"hidden\" [(ngModel)]=\"stop_value\"> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!item.id || !useRangeDate\">\r\n\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(item.value !== undefined && item.value !== null && item.value !== '')\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <tcloud-ui-datepicker-time \r\n #_input \r\n [(ngModel)]=\"item.value\" \r\n name=\"input_{{i+1}}\" \r\n [useOptionsDateTime]=\"(item && item.useOptionsDateTime) ? true : false\"\r\n (eventChange)=\"searchIn(item, _input)\" >\r\n </tcloud-ui-datepicker-time>\r\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"!(item.value !== undefined && item.value !== null && item.value !== '')\" (click)=\"searchIn(item, null); item.searchText = undefined; item.value = ''\">\r\n <i class=\"fas fa-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n </ng-container>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"item.type !== 'select' && item.type !== 'datetime-local' && item.type !== 'date-local'\">\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.value !== ''\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <input \r\n #_input\r\n [(ngModel)]=\"item.value\"\r\n placeholder=\"{{ (item.placeholder !== '') ? item.placeholder : '' }}\"\r\n name=\"input_{{i+1}}\" \r\n type=\"{{ (item.type === 'number') ? 'text' : item.type }}\" \r\n class=\"tc-form-control\" \r\n (keyup)=\"searchIn(item, $event)\"> \r\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"_input.value === ''\" (click)=\"searchIn(item, null); _input.value = ''\">\r\n <i class=\"fas fa-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type === 'select' && item.data && (item.data).length > 0\" >\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.value !== ''\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <select \r\n #_input\r\n [(ngModel)]=\"item.value\"\r\n name=\"input_{{i+1}}\" \r\n class=\"tc-form-control\" \r\n (change)=\"searchIn(item, $event)\">\r\n <option [ngValue]=\"\"></option>\r\n <ng-container *ngFor=\"let v of item.data\">\r\n <option [value]=\"v.value\">{{ v.description }}</option>\r\n </ng-container>\r\n </select>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </ng-container>\r\n\r\n\r\n <ng-container *ngIf=\"item.type && item.type === 'boolean'\">\r\n \r\n <div class=\"box-filter-input\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n <div class=\"m-description tc-title-ellipsis\" title=\"{{ item.description }}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.checked === true\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"area-input-checkbox\">\r\n <div class=\"tc-form-control\">\r\n <label>\r\n {{ item.placeholder }}\r\n <input \r\n #_input\r\n placeholder=\"{{ (item.placeholder !== '') ? item.placeholder : '' }}\"\r\n name=\"input_{{i+1}}\" \r\n type=\"checkbox\" \r\n (change)=\"searchIn(item, _input.checked)\"> \r\n </label>\r\n </div> \r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n\r\n <div class=\"text-right mb-1 mr-1\" *ngIf=\"useButtonSubmit\">\r\n <button type=\"button\" class=\"tc-btn {{ btnSubmitClass }}\" (click)=\"toSubmit()\" >{{ submitText }}</button>\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- <pre>{{ inputs | json }}</pre> -->\r\n<!-- <pre> {{ data | json }} </pre> -->\r\n\r\n<!-- <p>FILTERS</p><pre> {{ filters | json }}</pre> -->\r\n\r\n<!--\r\n <pre>start_stop: {{ start_stop }}</pre>\r\n <pre>start_stop_width: {{ start_stop_width }}</pre>\r\n <pre>start_stop_und: {{ start_stop_und }}</pre>\r\n-->", styles: [".box-filter-input{display:inline-grid;padding:10px 5px;position:relative}.area-filter{border:1px solid #eeeeee;border-radius:5px;margin-bottom:5px}.btn-clear-filter-text{position:absolute;right:8px;top:38px;background-color:#fff;border:none;cursor:pointer;color:#aaa}.to-hide{display:none}.icon-filter{color:#ccc}.to-active{color:var(--tc-primary)}.area-input-checkbox label{cursor:pointer;margin-bottom:0;color:#9f9f9f}.area-input-checkbox div.tc-form-control{height:40px}.m-description{margin-bottom:3px}input{color:#535353}input[type=text],input[type=number],select{height:40px!important}.type-hidden{display:none;width:0px!important}.box-type-global_vars{display:none!important;width:0px!important}.tc-title-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-border{border:none!important}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.TCloudUiDatepickerTimeComponent, selector: "tcloud-ui-datepicker-time", inputs: ["ngModel", "minDate", "maxDate", "useOptionsDateTime"], outputs: ["ngModelChange", "onChange", "eventChange"] }, { kind: "component", type: i4.TCloudUiDatepickerComponent, selector: "tcloud-ui-datepicker", inputs: ["multiple", "maxNumberOfDates", "daysOfWeekDisabled", "minDate", "maxDate", "datesDisabled", "modeInput", "useBorder", "childInputDateTime", "startViewInMinDate", "startViewInMaxDate", "disabled", "ngModel", "code"], outputs: ["onChange", "ngModelChange", "onCheckDate"] }, { kind: "component", type: i5.TCloudUiRangeDateComponent, selector: "range-date", inputs: ["defaultValuePeriodStartStop", "required", "descriptionStart", "descriptionStop"], outputs: ["onChange"] }] }); }
501
+ }
502
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: TCloudUiFiltersComponent, decorators: [{
503
+ type: Component,
504
+ args: [{ selector: 'tcloud-ui-filters', template: "<div *ngIf=\"show_filters\" class=\"tcloud-ui-filters area-filter\" [class.no-border]=\"!border\">\r\n <ng-container *ngFor=\"let item of filters; let i = index\">\r\n\r\n <ng-container *ngIf=\"!item.type || (item.type && item.type !== 'boolean')\">\r\n\r\n <ng-container *ngIf=\"item.type === 'date-local'\">\r\n\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(item.value !== undefined && item.value !== null && item.value !== '')\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <tcloud-ui-datepicker \r\n #_input\r\n name=\"input_{{i+1}}\"\r\n [modeInput]=\"true\"\r\n [(ngModel)]=\"item.value\"\r\n (ngModelChange)=\"searchIn(item, _input)\">\r\n </tcloud-ui-datepicker>\r\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"!(item.value !== undefined && item.value !== null && item.value !== '')\" (click)=\"searchIn(item, null); item.searchText = undefined; item.value = ''\">\r\n <i class=\"fas fa-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type !== 'date-local'\">\r\n <ng-container *ngIf=\"item.type === 'datetime-local'\">\r\n\r\n <ng-container *ngIf=\"(item.id === 'start' || item.id === 'stop') && useRangeDate\">\r\n <!-- PERIOD RANGE DATE -->\r\n <ng-container *ngIf=\"item.id === 'start'\">\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+start_stop_width+''+start_stop_und : ''\">\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(_range_date && _range_date.result && _range_date.result.start && _range_date.result.stop )\" class=\"fas fa-filter icon-filter\"></i>&nbsp;</div>\r\n <range-date \r\n #_range_date ngModel name=\"input_{{i+1}}\" \r\n [defaultValuePeriodStartStop]=\"item.defaultValuePeriodStartStop\"\r\n [descriptionStart]=\"descriptionStart\"\r\n [descriptionStop]=\"descriptionStop\"\r\n required \r\n (onChange)=\"searchInRange(_range_date); searchIn(item, _range_date)\">\r\n </range-date>\r\n </div>\r\n </ng-container> \r\n <input *ngIf=\"item.id === 'start'\" #_input name=\"input_{{i+1}}\" type=\"hidden\" [(ngModel)]=\"start_value\"> \r\n <input *ngIf=\"item.id === 'stop'\" #_input name=\"input_{{i+1}}\" type=\"hidden\" [(ngModel)]=\"stop_value\"> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!item.id || !useRangeDate\">\r\n\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"(item.value !== undefined && item.value !== null && item.value !== '')\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <tcloud-ui-datepicker-time \r\n #_input \r\n [(ngModel)]=\"item.value\" \r\n name=\"input_{{i+1}}\" \r\n [useOptionsDateTime]=\"(item && item.useOptionsDateTime) ? true : false\"\r\n (eventChange)=\"searchIn(item, _input)\" >\r\n </tcloud-ui-datepicker-time>\r\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"!(item.value !== undefined && item.value !== null && item.value !== '')\" (click)=\"searchIn(item, null); item.searchText = undefined; item.value = ''\">\r\n <i class=\"fas fa-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n </ng-container>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"item.type !== 'select' && item.type !== 'datetime-local' && item.type !== 'date-local'\">\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.value !== ''\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <input \r\n #_input\r\n [(ngModel)]=\"item.value\"\r\n placeholder=\"{{ (item.placeholder !== '') ? item.placeholder : '' }}\"\r\n name=\"input_{{i+1}}\" \r\n type=\"{{ (item.type === 'number') ? 'text' : item.type }}\" \r\n class=\"tc-form-control\" \r\n (keyup)=\"searchIn(item, $event)\"> \r\n <button class=\"btn-clear-filter-text\" [class.to-hide]=\"_input.value === ''\" (click)=\"searchIn(item, null); _input.value = ''\">\r\n <i class=\"fas fa-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type === 'select' && item.data && (item.data).length > 0\" >\r\n <div class=\"box-filter-input type-{{item.type}} box-type-{{item.type}}\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n\r\n <div class=\"m-description tc-title-ellipsis box-type-{{item.type}}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.value !== ''\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"box-type-{{item.type}}\">\r\n <select \r\n #_input\r\n [(ngModel)]=\"item.value\"\r\n name=\"input_{{i+1}}\" \r\n class=\"tc-form-control\" \r\n (change)=\"searchIn(item, $event)\">\r\n <option [ngValue]=\"\"></option>\r\n <ng-container *ngFor=\"let v of item.data\">\r\n <option [value]=\"v.value\">{{ v.description }}</option>\r\n </ng-container>\r\n </select>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </ng-container>\r\n\r\n\r\n <ng-container *ngIf=\"item.type && item.type === 'boolean'\">\r\n \r\n <div class=\"box-filter-input\" [style]=\"(item.width !== '') ? 'width:'+item.width : ''\">\r\n <div class=\"m-description tc-title-ellipsis\" title=\"{{ item.description }}\" title=\"{{ item.description }}\"><i [class.to-active]=\"_input.checked === true\" class=\"fas fa-filter icon-filter\"></i>&nbsp;{{ item.description }}</div>\r\n <div class=\"area-input-checkbox\">\r\n <div class=\"tc-form-control\">\r\n <label>\r\n {{ item.placeholder }}\r\n <input \r\n #_input\r\n placeholder=\"{{ (item.placeholder !== '') ? item.placeholder : '' }}\"\r\n name=\"input_{{i+1}}\" \r\n type=\"checkbox\" \r\n (change)=\"searchIn(item, _input.checked)\"> \r\n </label>\r\n </div> \r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n\r\n <div class=\"text-right mb-1 mr-1\" *ngIf=\"useButtonSubmit\">\r\n <button type=\"button\" class=\"tc-btn {{ btnSubmitClass }}\" (click)=\"toSubmit()\" >{{ submitText }}</button>\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- <pre>{{ inputs | json }}</pre> -->\r\n<!-- <pre> {{ data | json }} </pre> -->\r\n\r\n<!-- <p>FILTERS</p><pre> {{ filters | json }}</pre> -->\r\n\r\n<!--\r\n <pre>start_stop: {{ start_stop }}</pre>\r\n <pre>start_stop_width: {{ start_stop_width }}</pre>\r\n <pre>start_stop_und: {{ start_stop_und }}</pre>\r\n-->", styles: [".box-filter-input{display:inline-grid;padding:10px 5px;position:relative}.area-filter{border:1px solid #eeeeee;border-radius:5px;margin-bottom:5px}.btn-clear-filter-text{position:absolute;right:8px;top:38px;background-color:#fff;border:none;cursor:pointer;color:#aaa}.to-hide{display:none}.icon-filter{color:#ccc}.to-active{color:var(--tc-primary)}.area-input-checkbox label{cursor:pointer;margin-bottom:0;color:#9f9f9f}.area-input-checkbox div.tc-form-control{height:40px}.m-description{margin-bottom:3px}input{color:#535353}input[type=text],input[type=number],select{height:40px!important}.type-hidden{display:none;width:0px!important}.box-type-global_vars{display:none!important;width:0px!important}.tc-title-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-border{border:none!important}\n"] }]
505
+ }], ctorParameters: () => [{ type: i1.DatePipe }], propDecorators: { _formulario: [{
506
+ type: ViewChild,
507
+ args: ['_formulario']
508
+ }], border: [{
509
+ type: Input
510
+ }], data: [{
511
+ type: Input
512
+ }], filters: [{
513
+ type: Input
514
+ }], submitText: [{
515
+ type: Input
516
+ }], btnSubmitClass: [{
517
+ type: Input
518
+ }], useOnChangeSubmit: [{
519
+ type: Input
520
+ }], useButtonSubmit: [{
521
+ type: Input
522
+ }], useNormalizeCaseSensitive: [{
523
+ type: Input
524
+ }], useRangeDate: [{
525
+ type: Input
526
+ }], useFilterAccept: [{
527
+ type: Input
528
+ }], result: [{
529
+ type: Output
530
+ }], onFilter: [{
531
+ type: Output
532
+ }], onChange: [{
533
+ type: Output
534
+ }], onSubmit: [{
535
+ type: Output
536
+ }] } });
537
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGNsb3VkLXVpLWZpbHRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGNsb3VkLXVpL3NyYy9saWIvX21vZHVsZXMvdGNsb3VkLXVpLWZpbHRlcnMvdGNsb3VkLXVpLWZpbHRlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGNsb3VkLXVpL3NyYy9saWIvX21vZHVsZXMvdGNsb3VkLXVpLWZpbHRlcnMvdGNsb3VkLXVpLWZpbHRlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVwSCxPQUFPLEVBQUUsV0FBVyxFQUFpQixhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQU9oRixNQUFNLE9BQU8sd0JBQXdCO0lBZW5DLElBQWEsSUFBSSxDQUFDLElBQVM7UUFDekIsaURBQWlEO0lBQ25ELENBQUM7SUFDRCxJQUFJLElBQUksS0FBUyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBR3JDLElBQWEsT0FBTyxDQUFDLE9BQVk7UUFDL0IsMEJBQTBCO0lBQzVCLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBUyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRzNDLElBQWEsVUFBVSxDQUFDLENBQVM7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksVUFBVSxLQUFXLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUF1Qm5ELFlBQ1UsUUFB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Q3JCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLEtBQUssRUFBRSxjQUFjLElBQUssT0FBTyxFQUFFLENBQUM7WUFDdEMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssRUFBRSxVQUFVLENBQUM7WUFDcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7WUFDbkMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssS0FBSyxFQUFFLElBQUksT0FBTyxFQUFFLENBQUM7WUFDMUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDN0MsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFFLElBQUksQ0FBQyxLQUFLLENBQUUsRUFBRSxDQUFDO1lBQzlELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLEtB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QUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7K0dBOWlCVSx3QkFBd0I7bUdBQXhCLHdCQUF3Qiw2bEJDVnJDLHVyVEF5Skc7OzRGRC9JVSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsbUJBQW1COzZFQVFGLFdBQVc7c0JBQXJDLFNBQVM7dUJBQUMsYUFBYTtnQkFRZixNQUFNO3NCQUFkLEtBQUs7Z0JBR08sSUFBSTtzQkFBaEIsS0FBSztnQkFNTyxPQUFPO3NCQUFuQixLQUFLO2dCQU1PLFVBQVU7c0JBQXRCLEtBQUs7Z0JBT0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUQ0NvbmRpdGlvbiwgVENEYXRhRmlsdGVycywgVENGaWx0ZXJzVHlwZSB9IGZyb20gJy4vdGNsb3VkLXVpLWZpbHRlcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0Y2xvdWQtdWktZmlsdGVycycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RjbG91ZC11aS1maWx0ZXJzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90Y2xvdWQtdWktZmlsdGVycy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUQ2xvdWRVaUZpbHRlcnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIGRhdGVwaWNrZXJzID0gW10gYXMgYW55O1xyXG5cclxuICBAVmlld0NoaWxkKCdfZm9ybXVsYXJpbycpICBfZm9ybXVsYXJpbzogTmdGb3JtIHwgdW5kZWZpbmVkO1xyXG5cclxuICBpbnB1dHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHNob3dfZmlsdGVyczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzZWFyY2hfZGF0YTogYW55IHwgdW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKSBib3JkZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIF9kYXRhOiBhbnkgfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgc2V0IGRhdGEoZGF0YTogYW55KXtcclxuICAgIC8vIHRoaXMuX2RhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICB9XHJcbiAgZ2V0IGRhdGEoKTogYW55eyByZXR1cm4gdGhpcy5fZGF0YTsgfVxyXG5cclxuICBwcml2YXRlIF9maWx0ZXJzOiBUQ0RhdGFGaWx0ZXJzIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIHNldCBmaWx0ZXJzKGZpbHRlcnM6IGFueSl7XHJcbiAgICAvL3RoaXMuX2ZpbHRlcnMgPSBmaWx0ZXJzO1xyXG4gIH1cclxuICBnZXQgZmlsdGVycygpOiBhbnl7IHJldHVybiB0aGlzLl9maWx0ZXJzOyB9XHJcblxyXG4gIHByaXZhdGUgX3N1Ym1pdFRleHQ6IHN0cmluZyA9ICdGaWx0cmFyJztcclxuICBASW5wdXQoKSBzZXQgc3VibWl0VGV4dCh2OiBzdHJpbmcpeyBcclxuICAgIGlmKCB2ICYmIHYgIT09IHRoaXMuX3N1Ym1pdFRleHQgKXtcclxuICAgICAgdGhpcy5fc3VibWl0VGV4dCA9IHY7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBzdWJtaXRUZXh0KCk6c3RyaW5neyByZXR1cm4gdGhpcy5fc3VibWl0VGV4dDsgfVxyXG5cclxuICBASW5wdXQoKSBidG5TdWJtaXRDbGFzczogc3RyaW5nID0gJ3RjLWJ0bi1wcmltYXJ5JztcclxuICBASW5wdXQoKSB1c2VPbkNoYW5nZVN1Ym1pdDogYm9vbGVhbiA9IHRydWU7IC8vIHVzZU9uQ2hhbmdlU3VibWl0IC0gU3VibWl0IGF1dG9tYXRpY28gcXVhbmRvIGZvciBhbHRlcmFkbyBxdWFucXVlciBpbnB1dFxyXG4gIEBJbnB1dCgpIHVzZUJ1dHRvblN1Ym1pdDogYm9vbGVhbiA9IGZhbHNlOyAvLyB1c2VCdXR0b25TdWJtaXQgLSBFeGliZSB1bSBib3TDo28gZGUgc3VibWl0IGUgbsOjbyBleGVjdXRhIGEgYnVzY2EgYXV0b21hdGljYW1lbnRlXHJcbiAgQElucHV0KCkgdXNlTm9ybWFsaXplQ2FzZVNlbnNpdGl2ZTogYm9vbGVhbiA9IHRydWU7IC8vIHVzZU5vcm1hbGl6ZUNhc2VTZW5zaXRpdmUgLSBOw6NvIHZhbGlkYSBjYWl4YSBhbHRhIG91IGJhaXhhIGUgY2FyYWN0ZXJlcyBlc3BlY2lhaXNcclxuICBASW5wdXQoKSB1c2VSYW5nZURhdGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHVzZUZpbHRlckFjY2VwdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgcmVzdWx0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uRmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGRlc2NyaXB0aW9uU3RhcnQ6IHN0cmluZyA9ICcnO1xyXG4gIGRlc2NyaXB0aW9uU3RvcDogc3RyaW5nID0gJyc7XHJcblxyXG4gIHByaXZhdGUgZmlyc3RfYWN0aXZlX2ZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzdGFydF9zdG9wOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc3RhcnRfc3RvcF93aWR0aDogbnVtYmVyID0gMDtcclxuICBzdGFydF9zdG9wX3VuZDogc3RyaW5nID0gJyc7IC8vIHB4IG91ICVcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGRhdGVwaXBlOiBEYXRlUGlwZVxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmKCB0aGlzLmZpbHRlcnMgJiYgKHRoaXMuZmlsdGVycykubGVuZ3RoID4gMCApe1xyXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCAodGhpcy5maWx0ZXJzKS5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICBpZiggdGhpcy5maWx0ZXJzW2ldLnZhbHVlICl7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLmZpbHRlcnNbaV0udHlwZSA9PT0gJ2RhdGV0aW1lLWxvY2FsJyApe1xyXG4gICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNbaV0uc2VhcmNoVGV4dCA9IG5ldyBEYXRlKCBgJHt0aGlzLmZpbHRlcnNbaV0udmFsdWV9YCApO1xyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNbaV0uc2VhcmNoVGV4dCA9IHRoaXMuZmlsdGVyc1tpXS52YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmZpcnN0X2FjdGl2ZV9maWx0ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gICAgICBcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnN0YXJ0X3N0b3AgPSAodGhpcy51c2VSYW5nZURhdGUpID8gdGhpcy5pc19zdGFydF9zdG9wX2RhdGV0aW1lKCkgOiBmYWxzZTtcclxuICAgICAgdGhpcy50b1N1Ym1pdCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc19zdGFydF9zdG9wX2RhdGV0aW1lKCl7XHJcbiAgICBsZXQgc3RhcnQgPSBmYWxzZTtcclxuICAgIGxldCBzdG9wID0gZmFsc2U7XHJcbiAgICBpZiggdGhpcy5maWx0ZXJzICYmICh0aGlzLmZpbHRlcnMpLmxlbmd0aCA+IDAgKXtcclxuICAgICAgdGhpcy5zdGFydF9zdG9wX3dpZHRoID0gMDtcclxuICAgICAgZm9yKGxldCBpID0gMDsgaSA8ICh0aGlzLmZpbHRlcnMpLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICBpZiggdGhpcy5maWx0ZXJzW2ldLmlkID09PSAnc3RhcnQnICl7XHJcbiAgICAgICAgICBzdGFydCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0X3N0b3Bfd2lkdGggKz0gdGhpcy5nZXRWYWx1ZVdpZHRoKHRoaXMuZmlsdGVyc1tpXS53aWR0aCk7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0X3N0b3BfdW5kID0gdGhpcy5nZXRVbmlkYWRlKHRoaXMuZmlsdGVyc1tpXS53aWR0aCk7XHJcbiAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uU3RhcnQgPSB0aGlzLmZpbHRlcnNbaV0uZGVzY3JpcHRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLmZpbHRlcnNbaV0uaWQgPT09ICdzdG9wJyApe1xyXG4gICAgICAgICAgc3RvcCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0X3N0b3Bfd2lkdGggKz0gdGhpcy5nZXRWYWx1ZVdpZHRoKHRoaXMuZmlsdGVyc1tpXS53aWR0aCk7XHJcbiAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uU3RvcCA9IHRoaXMuZmlsdGVyc1tpXS5kZXNjcmlwdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAoIHN0YXJ0ICYmIHN0b3AgKSA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldFZhbHVlV2lkdGgodjogc3RyaW5nKTpudW1iZXIge1xyXG4gICAgbGV0IHVuZCA9IHRoaXMuZ2V0VW5pZGFkZSh2KTtcclxuICAgIHYgPSAodikucmVwbGFjZSh1bmQsICcnKTtcclxuICAgIHJldHVybiArKHYpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VW5pZGFkZSh2OiBzdHJpbmcpOnN0cmluZyB7XHJcbiAgICBsZXQgdW5kID0gJyUnO1xyXG4gICAgaWYoIHYgJiYgKHYpLmluY2x1ZGVzKCdweCcpICl7XHJcbiAgICAgIHVuZCA9ICdweCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kO1xyXG4gIH1cclxuIFxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7ICBcclxuICAgIFxyXG4gICAgaWYoIGNoYW5nZXMgJiYgY2hhbmdlc1snZGF0YSddICl7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBjaGFuZ2VzWydkYXRhJ10uY3VycmVudFZhbHVlO1xyXG4gICAgICBpZiggdGhpcy5fZGF0YSAhPT0gZGF0YSApe1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICB0aGlzLnNlYXJjaF9kYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiggY2hhbmdlcyAmJiBjaGFuZ2VzWydmaWx0ZXJzJ10gKXtcclxuICAgICAgY29uc3QgZmlsdGVycyA9IGNoYW5nZXNbJ2ZpbHRlcnMnXS5jdXJyZW50VmFsdWU7XHJcbiAgICAgIGlmKCB0aGlzLl9maWx0ZXJzICE9PSBmaWx0ZXJzICl7XHJcbiAgICAgICAgdGhpcy5fZmlsdGVycyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZmlsdGVycykpO1xyXG4gICAgICAgIHRoaXMuaW5pdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQoKXtcclxuICAgIGlmKCB0aGlzLmRhdGEgJiYgdGhpcy5maWx0ZXJzICl7XHJcbiAgICAgIHRoaXMuc2hvd19maWx0ZXJzID0gdHJ1ZTtcclxuICAgICAgaWYoIHRoaXMuZmlsdGVycyAmJiAodGhpcy5maWx0ZXJzKS5sZW5ndGggPiAwICl7XHJcbiAgICAgICAgKHRoaXMuZmlsdGVycykuZm9yRWFjaCgoZmlsdGVyOiBUQ0RhdGFGaWx0ZXJzKSA9PiB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICB0aGlzLnNlYXJjaEluKGZpbHRlciwgJ3N5bmMnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBcclxuICAgICAgaWYoICF0aGlzLnVzZU9uQ2hhbmdlU3VibWl0ICl7XHJcbiAgICAgICAgdGhpcy5yZXN1bHRfYWNjZXB0KHRoaXMuZGF0YSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmKCB0aGlzLnVzZU9uQ2hhbmdlU3VibWl0IHx8IHRoaXMudXNlQnV0dG9uU3VibWl0ICl7XHJcbiAgICAgICAgdGhpcy5zdGFydF9maWx0ZXIoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBub3JtYWxpemUodGV4dDogYW55KTogc3RyaW5ne1xyXG4gICAgaWYoIHRoaXMudXNlTm9ybWFsaXplQ2FzZVNlbnNpdGl2ZSApe1xyXG4gICAgICBjb25zdCB2ID0gKCAoIChgJHt0ZXh0fWApLm5vcm1hbGl6ZSgnTkZEJykucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgXCJcIikgKS50cmltKCkgKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICByZXR1cm4gdjtcclxuICAgIH1cclxuICAgIHJldHVybiB0ZXh0O1xyXG4gIH1cclxuXHJcbiAgdG9TdWJtaXQoKXtcclxuICAgIGlmKCB0aGlzLmZpbHRlcnMgJiYgKHRoaXMuZmlsdGVycykubGVuZ3RoID4gMCApe1xyXG4gICAgICB0aGlzLmluaXQoKTtcclxuICAgIH1cclxuICAgIHRoaXMuZW1pdFN1Ym1pdEZpbHRlcnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdFN1Ym1pdEZpbHRlcnMoKXtcclxuICAgIGxldCBmaWx0ZXJzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlcnMpKTtcclxuICAgIGlmKCBmaWx0ZXJzICYmIChmaWx0ZXJzKS5sZW5ndGggPiAwICl7XHJcbiAgICAgIChmaWx0ZXJzKS5mb3JFYWNoKChmaWx0ZXI6IFRDRGF0YUZpbHRlcnMsIGk6IG51bWJlcikgPT4ge1xyXG5cclxuICAgICAgICBpZiggZmlsdGVyLndpZHRoICl7IGRlbGV0ZShmaWx0ZXJzW2ldLndpZHRoKTsgfVxyXG4gICAgICAgIGlmKCBmaWx0ZXIucGxhY2Vob2xkZXIgKXsgZGVsZXRlKGZpbHRlcnNbaV0ucGxhY2Vob2xkZXIpOyB9XHJcbiAgICAgICAgaWYoIGZpbHRlci5kZXNjcmlwdGlvbiApeyBkZWxldGUoZmlsdGVyc1tpXS5kZXNjcmlwdGlvbik7IH1cclxuXHJcbiAgICAgICAgaWYoICghZmlsdGVyLnNlYXJjaFRleHQgfHwgZmlsdGVyLnNlYXJjaFRleHQgJiYgZmlsdGVyLnNlYXJjaFRleHQgPT09ICcnKSAmJiBmaWx0ZXIudHlwZSAhPT0gXCJib29sZWFuXCIgKXtcclxuICAgICAgICAgIGRlbGV0ZShmaWx0ZXJzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIGZpbHRlci50eXBlID09PSBcImJvb2xlYW5cIiApe1xyXG4gICAgICAgICAgaWYoICFmaWx0ZXIuc2VhcmNoVGV4dCApe1xyXG4gICAgICAgICAgICBmaWx0ZXIuc2VhcmNoVGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgfSk7XHJcbiAgICB9ICAgXHJcbiAgICBcclxuICAgIHRoaXMub25TdWJtaXQuZW1pdCh0aGlzLmZpbHRlcnMpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgY29sbGVjdGlvbkZpbmQob2JqOiBhbnksIHBhdGg6IGFueSk6IGFueSB7XHJcbiAgICBjb25zdCBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KFwiLlwiKTtcclxuICAgIGxldCBjdXJyZW50ID0gb2JqO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3Qga2V5ID0gcGF0aEFycmF5W2ldO1xyXG5cclxuICAgICAgaWYgKGtleS5pbmNsdWRlcygnWycpICYmIGtleS5pbmNsdWRlcygnXScpKSB7XHJcbiAgICAgICAgY29uc3QgbmV4dEtleXMgPSBwYXRoQXJyYXkuc2xpY2UoaSArIDEpO1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0ga2V5LnN1YnN0cmluZyhrZXkuaW5kZXhPZignWycpICsgMSwga2V5LmluZGV4T2YoJ10nKSk7XHJcbiAgICAgICAgY29uc3QgYXJyYXlLZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGtleS5pbmRleE9mKCdbJykpO1xyXG4gICAgICAgIGlmKCBjdXJyZW50ICYmIGN1cnJlbnRbYXJyYXlLZXldICYmIGN1cnJlbnRbYXJyYXlLZXldW2luZGV4XSApe1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkZpbmQoY3VycmVudFthcnJheUtleV1baW5kZXhdLCBuZXh0S2V5cy5qb2luKFwiLlwiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgaWYgKGtleS5pbmNsdWRlcyhcIltdXCIpKSB7XHJcbiAgICAgICAgY29uc3QgYXJyYXlLZXkgPSBrZXkucmVwbGFjZShcIltdXCIsIFwiXCIpO1xyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2FycmF5S2V5XSB8fCBbXTtcclxuICAgICAgICBjb25zdCBuZXh0S2V5cyA9IHBhdGhBcnJheS5zbGljZShpICsgMSk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY3VycmVudC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuY29sbGVjdGlvbkZpbmQoY3VycmVudFtqXSwgbmV4dEtleXMuam9pbihcIi5cIikpO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpOyBcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiggIWN1cnJlbnQgfHwgKGN1cnJlbnQgJiYgIWN1cnJlbnRba2V5XSkgKXtcclxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XHJcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50O1xyXG4gIH1cclxuICAgIFxyXG4gIGZpcnN0OiBib29sZWFuID0gdHJ1ZTtcclxuICBzdGFydF9maWx0ZXJfZmM6IGFueSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgc3RhcnRfdmFsdWU6IGFueSB8IHVuZGVmaW5lZDtcclxuICBzdG9wX3ZhbHVlOiBhbnkgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHNlYXJjaEluUmFuZ2UoIHJhbmdlX2RhdGU6IGFueSl7XHJcbiAgICBcclxuICAgIGlmKCB0aGlzLmZpbHRlcnMgJiYgKHRoaXMuZmlsdGVycykubGVuZ3RoID4gMCApe1xyXG5cclxuICAgICAgbGV0IGV2ZW50ID0ge30gYXMgYW55OyBcclxuICAgICAgZXZlbnQuZGF0ZXBpY2tlcnRpbWUgPSB0cnVlO1xyXG5cclxuICAgICAgZm9yKCBsZXQgaSA9IDA7IGkgPCAodGhpcy5maWx0ZXJzKS5sZW5ndGg7IGkrKyApe1xyXG5cclxuICAgICAgICBpZiggdGhpcy5maWx0ZXJzW2ldICYmIHRoaXMuZmlsdGVyc1tpXS5pZCAmJiB0aGlzLmZpbHRlcnNbaV0uaWQgPT09ICdzdGFydCcgKXtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyc1tpXS52YWx1ZSA9IHJhbmdlX2RhdGU/LnJlc3VsdD8uc3RhcnQhO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJzW2ldLnNlYXJjaFRleHQgPSByYW5nZV9kYXRlPy5yZXN1bHQ/LnN0YXJ0ITtcclxuICAgICAgICAgIGV2ZW50LmlubmVyVmFsdWUgPSB0aGlzLnN0YXJ0X3ZhbHVlID0gcmFuZ2VfZGF0ZT8ucmVzdWx0Py5zdGFydCE7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaEluKHRoaXMuZmlsdGVyc1tpXSwgZXZlbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoIHRoaXMuZmlsdGVyc1tpXSAmJiB0aGlzLmZpbHRlcnNbaV0uaWQgJiYgdGhpcy5maWx0ZXJzW2ldLmlkID09PSAnc3RvcCcgKXtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyc1tpXS52YWx1ZSA9IHJhbmdlX2RhdGU/LnJlc3VsdD8uc3RvcCE7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcnNbaV0uc2VhcmNoVGV4dCA9IHJhbmdlX2RhdGU/LnJlc3VsdD8uc3RvcCE7XHJcbiAgICAgICAgICBldmVudC5pbm5lclZhbHVlID0gdGhpcy5zdG9wX3ZhbHVlID0gcmFuZ2VfZGF0ZT8ucmVzdWx0Py5zdG9wITtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoSW4odGhpcy5maWx0ZXJzW2ldLCBldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmKCB0aGlzLmZpcnN0IHx8IHRoaXMudXNlT25DaGFuZ2VTdWJtaXQgKXtcclxuICAgICAgICB0aGlzLnRvU3VibWl0KCk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICB9XHJcbiAgICB0aGlzLmZpcnN0ID0gZmFsc2U7XHJcblxyXG4gIH1cclxuXHJcbiAgY29udmVydERhdGFUb051bWJlcihkYXRhU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgW2RpYSwgbWVzLCBhbm9dID0gZGF0YVN0cmluZy5zcGxpdCgnLycpO1xyXG4gICAgICByZXR1cm4gKyhgJHthbm99JHttZXN9JHtkaWF9YCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge31cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoSW4oaXRlbTogVENEYXRhRmlsdGVycywgZXZlbnQ/OiBhbnkpe1xyXG5cclxuICAgIFxyXG5cclxuICAgIHRoaXMuc3RhcnRfZmlsdGVyX2ZjID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIGxldCBpc1ZhbGlkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiggZXZlbnQgPT09ICdzeW5jJyAmJiBpc1ZhbGlkICl7XHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCB0eXBlb2YgZXZlbnQgPT09ICdib29sZWFuJyAmJiBpc1ZhbGlkICl7XHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgaXRlbS5zZWFyY2hUZXh0ID0gZXZlbnQ7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiggKGV2ZW50ID09PSB1bmRlZmluZWQgfHwgZXZlbnQgPT09IG51bGwgfHwgZXZlbnQgPT09ICcnKSAmJiBpc1ZhbGlkICl7XHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgaXRlbS5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiggZXZlbnQ/LmRhdGVwaWNrZXJ0aW1lICAmJiBpc1ZhbGlkICl7XHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgaXRlbS5zZWFyY2hUZXh0ID0gZXZlbnQ/LmlubmVyVmFsdWU7ICAgICAgXHJcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZihldmVudD8udGFyZ2V0Py52YWx1ZSAmJiBpc1ZhbGlkICl7XHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgaXRlbS5zZWFyY2hUZXh0ID0gdGhpcy5ub3JtYWxpemUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKGV2ZW50Py50YXJnZXQ/LnZhbHVlID09PSAnJyAmJiBpc1ZhbGlkICl7XHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgaXRlbS5zZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiggaXRlbS50eXBlID09PSAnZGF0ZS1sb2NhbCcgJiYgaXRlbS52YWx1ZSApe1xyXG4gICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICAgIGl0ZW0uc2VhcmNoVGV4dCA9IGAke3RoaXMuY29udmVydERhdGFUb051bWJlciggaXRlbS52YWx1ZSApfWA7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiggZXZlbnQgJiYgZXZlbnQucmVzdWx0ICYmICggZXZlbnQucmVzdWx0LnN0YXJ0IHx8IGV2ZW50LnJlc3VsdC5zdG9wICkgKXtcclxuICAgICAgaXNWYWxpZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbiAgICBcclxuICAgIGlmKCB0aGlzLnVzZU9uQ2hhbmdlU3VibWl0IHx8IHRoaXMuZmlyc3RfYWN0aXZlX2ZpbHRlciApeyAgICAgIFxyXG4gICAgICB0aGlzLnN0YXJ0X2ZpbHRlcl9mYyA9IHRoaXMuc3RhcnRfZmlsdGVyKCk7XHJcbiAgICAgIHRoaXMuZmlyc3RfYWN0aXZlX2ZpbHRlciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCAhdGhpcy51c2VCdXR0b25TdWJtaXQgKXtcclxuICAgICAgdGhpcy5lbWl0U3VibWl0RmlsdGVycygpO1xyXG4gICAgfSBcclxuICB9XHJcblxyXG4gIGdldERhdGVVVEMoZHQ6IGFueSl7XHJcbiAgICBjb25zdCBhbm8gPSBkdC5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3QgbWVzID0gZHQuZ2V0TW9udGgoKTtcclxuICAgIGNvbnN0IGRpYSA9IGR0LmdldERhdGUoKTtcclxuICAgIGNvbnN0IGhvcmFzID0gZHQuZ2V0SG91cnMoKTtcclxuICAgIGNvbnN0IG1pbnV0b3MgPSBkdC5nZXRNaW51dGVzKCk7XHJcbiAgICBjb25zdCBzZWd1bmRvcyA9IGR0LmdldFNlY29uZHMoKTtcclxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhhbm8sIG1lcywgZGlhLCBob3JhcywgbWludXRvcywgc2VndW5kb3MpKTtcclxuICB9XHJcblxyXG4gIFxyXG4gIHN0YXJ0X2ZpbHRlcigpe1xyXG4gICAgZm9yKCBsZXQgaSA9IDA7IGkgPCAodGhpcy5kYXRhKS5sZW5ndGg7IGkrKyApe1xyXG5cclxuICAgICAgdGhpcy5zZXREYXRhSW5kZXgoaSwgdHJ1ZSk7XHJcblxyXG4gICAgICBmb3IoIGxldCBqID0gMDsgaiA8ICh0aGlzLmZpbHRlcnMpLmxlbmd0aDsgaisrICl7ICAgICAgICBcclxuICAgICAgICBjb25zdCBmaWx0ZXJfaXRlbSA9IHRoaXMuZmlsdGVyc1tqXTsgICBcclxuXHJcbiAgICAgICAgaWYoIGZpbHRlcl9pdGVtLnNlYXJjaFRleHQgJiYgdHlwZW9mIChmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSA9PT0gJ3N0cmluZycgJiYgZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCAhPT0gJycgJiYgZmlsdGVyX2l0ZW0udHlwZSAhPT0gVENGaWx0ZXJzVHlwZS5udW1iZXIgJiYgZmlsdGVyX2l0ZW0udHlwZSAhPT0gVENGaWx0ZXJzVHlwZS5kYXRlICl7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGZpbHRlcl9pdGVtLnNlYXJjaFRleHQgPSB0aGlzLm5vcm1hbGl6ZShmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KTsgICAgICAgIFxyXG4gICAgICAgICAgbGV0IGl0ZW1fdmFsdWUgPSB0aGlzLmNvbGxlY3Rpb25GaW5kKHRoaXMuZGF0YVtpXSwgZmlsdGVyX2l0ZW0uc2VhcmNoSW4pO1xyXG4gICAgICAgICAgaWYoIGl0ZW1fdmFsdWUgKXtcclxuICAgICAgICAgICAgaXRlbV92YWx1ZSA9IHRoaXMubm9ybWFsaXplKGl0ZW1fdmFsdWUpOyAgIFxyXG5cclxuICAgICAgICAgICAgaWYoIHR5cGVvZiBmaWx0ZXJfaXRlbS5ub3RJbiA9PT0gJ2Jvb2xlYW4nICYmIGZpbHRlcl9pdGVtLm5vdEluICl7XHJcbiAgICAgICAgICAgICAgaWYoICggaXRlbV92YWx1ZSA9PT0gZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCApICl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGFJbmRleChpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuXHJcbiAgICAgICAgICAgICAgaWYoIGZpbHRlcl9pdGVtLnR5cGUgPT09IFRDRmlsdGVyc1R5cGUuc2VsZWN0ICl7XHJcbiAgICAgICAgICAgICAgICAvLyBFeGNsdXNpdm8gcGFyYSBzZWxlY3RcclxuICAgICAgICAgICAgICAgIGlmKCBmaWx0ZXJfaXRlbS5kYXRhICYmIChmaWx0ZXJfaXRlbS5kYXRhKS5sZW5ndGggPiAwICl7XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyB1c28gZG8gc2VsZWN0IGNvbSBvIG5vdFZhbHVlczogc3RyaW5nW11cclxuICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRfb3B0aW9uID0gW107XHJcbiAgICAgICAgICAgICAgICAgIGZvciggbGV0IGsgPSAwOyBrIDwgKGZpbHRlcl9pdGVtLmRhdGEpLmxlbmd0aDsgaysrICl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga19pdGVtID0gZmlsdGVyX2l0ZW0uZGF0YVtrXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggYCR7a19pdGVtPy52YWx1ZX1gID09PSBgJHtmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0fWAgICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X29wdGlvbiA9IGtfaXRlbT8ubm90VmFsdWVzITtcclxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBpZiggY3VycmVudF9vcHRpb24gJiYgKGN1cnJlbnRfb3B0aW9uKS5sZW5ndGggPiAwICl7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKCBsZXQgdiA9IDA7IHYgPCAoY3VycmVudF9vcHRpb24pLmxlbmd0aDsgdisrICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2X2l0ZW0gPSBjdXJyZW50X29wdGlvblt2XTsgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiggKCBpdGVtX3ZhbHVlID09PSB2X2l0ZW0gKSApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGFJbmRleChpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNvIG5vcm1hbCBkbyBzZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICBpZiggISggaXRlbV92YWx1ZSA9PT0gZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCApICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGFJbmRleChpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgXHJcblxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBpZiggISggaXRlbV92YWx1ZS5pbmNsdWRlcyhmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSB8fCBpdGVtX3ZhbHVlID09PSBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0ICkgKXtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhSW5kZXgoaSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB0aGlzLnNldERhdGFJbmRleChpLCBmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBcclxuICAgICAgICBcclxuXHJcbiAgICAgICAgaWYoIGZpbHRlcl9pdGVtLnNlYXJjaFRleHQgJiYgZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKCBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0LnZhbHVlT2YoKSkgJiYgZmlsdGVyX2l0ZW0udHlwZSA9PT0gVENGaWx0ZXJzVHlwZS5kYXRldGltZSApe1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBsZXQgaXRlbV92YWx1ZTogYW55ID0gdGhpcy5jb2xsZWN0aW9uRmluZCh0aGlzLmRhdGFbaV0sIGZpbHRlcl9pdGVtLnNlYXJjaEluKTtcclxuXHJcbiAgICAgICAgICB0cnkgeyBpdGVtX3ZhbHVlID0gbmV3IERhdGUoaXRlbV92YWx1ZSk7IH0gY2F0Y2ggKGVycm9yKSB7fVxyXG4gICAgICAgICAgaWYoIGl0ZW1fdmFsdWUgJiYgIGl0ZW1fdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTiggaXRlbV92YWx1ZS52YWx1ZU9mKCkpICl7XHJcbiAgICAgICAgICAgIGxldCBpc19hY2NlcHQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGR0X3RhcmdldCAgID0gKCAoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCkuZ2V0VGltZSgpICkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMCwgMTApOyAvKiArICgzICogNjAgKiA2MCAqIDEwMDApOyAqL1xyXG4gICAgICAgICAgICBjb25zdCBkdF9jdXJyZW50ICA9ICggKGl0ZW1fdmFsdWUpLmdldFRpbWUoKSApLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDEwKTtcclxuICAgICAgICAgICAgaWYoIGZpbHRlcl9pdGVtLmNvbmRpdGlvbiApe1xyXG4gICAgICAgICAgICAgIHN3aXRjaCAoZmlsdGVyX2l0ZW0uY29uZGl0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLmd0OiAgICBpc19hY2NlcHQgPSAoIE51bWJlcihkdF90YXJnZXQpID4gIE51bWJlcihkdF9jdXJyZW50KSApOyAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLmx0OiAgICBpc19hY2NlcHQgPSAoIE51bWJlcihkdF90YXJnZXQpIDwgIE51bWJlcihkdF9jdXJyZW50KSApOyAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLmd0ZTogICBpc19hY2NlcHQgPSAoIE51bWJlcihkdF90YXJnZXQpIDw9IE51bWJlcihkdF9jdXJyZW50KSApOyAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLmx0ZTogICBpc19hY2NlcHQgPSAoIE51bWJlcihkdF90YXJnZXQpID49IE51bWJlcihkdF9jdXJyZW50KSApOyAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLmVxdWFsOiBpc19hY2NlcHQgPSAoIE51bWJlcihkdF90YXJnZXQpID09PSBOdW1iZXIoZHRfY3VycmVudCkgKTsgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBUQ0NvbmRpdGlvbi5ub3RFcXVhbDogaXNfYWNjZXB0ID0gKCBOdW1iZXIoZHRfdGFyZ2V0KSAhPSBOdW1iZXIoZHRfY3VycmVudCkgKTsgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogaXNfYWNjZXB0ID0gKCBOdW1iZXIoZHRfdGFyZ2V0KSA9PSBOdW1iZXIoZHRfY3VycmVudCkgKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGlzX2FjY2VwdCA9ICggTnVtYmVyKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpID09PSBOdW1iZXIoaXRlbV92YWx1ZSkgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggIWlzX2FjY2VwdCApe1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0RGF0YUluZGV4KGksIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIGlmKCBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0ICYmIHR5cGVvZiBOdW1iZXIoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCkgPT09ICdudW1iZXInICYmICggZmlsdGVyX2l0ZW0udHlwZSA9PT0gVENGaWx0ZXJzVHlwZS5udW1iZXIgfHwgZmlsdGVyX2l0ZW0udHlwZSA9PT0gVENGaWx0ZXJzVHlwZS5kYXRlICkgKXtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCA9IE51bWJlcihmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KTtcclxuICAgICAgICAgIGxldCBpdGVtX3ZhbHVlID0gdGhpcy5jb2xsZWN0aW9uRmluZCh0aGlzLmRhdGFbaV0sIGZpbHRlcl9pdGVtLnNlYXJjaEluKTtcclxuXHJcbiAgICAgICAgICBpZiggdHlwZW9mIE51bWJlcihpdGVtX3ZhbHVlKSA9PT0gJ251bWJlcicgKXsgICBcclxuICAgICAgICAgICAgaXRlbV92YWx1ZSA9IE51bWJlcihpdGVtX3ZhbHVlKTsgICAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IGlzX2FjY2VwdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiggZmlsdGVyX2l0ZW0uY29uZGl0aW9uICl7XHJcblxyXG4gICAgICAgICAgICAgIHN3aXRjaCAoZmlsdGVyX2l0ZW0uY29uZGl0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLmd0OiAgICBpc19hY2NlcHQgPSAoIE51bWJlcihmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSA+ICBOdW1iZXIoaXRlbV92YWx1ZSkgKTsgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBUQ0NvbmRpdGlvbi5sdDogICAgaXNfYWNjZXB0ID0gKCBOdW1iZXIoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCkgPCAgTnVtYmVyKGl0ZW1fdmFsdWUpICk7ICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgVENDb25kaXRpb24uZ3RlOiAgIGlzX2FjY2VwdCA9ICggTnVtYmVyKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpIDw9IE51bWJlcihpdGVtX3ZhbHVlKSApOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgVENDb25kaXRpb24ubHRlOiAgIGlzX2FjY2VwdCA9ICggTnVtYmVyKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpID49IE51bWJlcihpdGVtX3ZhbHVlKSApOyAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFRDQ29uZGl0aW9uLmVxdWFsOiBpc19hY2NlcHQgPSAoIE51bWJlcihmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0KSA9PT0gTnVtYmVyKGl0ZW1fdmFsdWUpICk7IGJyZWFrOyBcclxuICAgICAgICAgICAgICAgIGNhc2UgVENDb25kaXRpb24ubm90RXF1YWw6IGlzX2FjY2VwdCA9ICggTnVtYmVyKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpICE9IE51bWJlcihpdGVtX3ZhbHVlKSApOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGlzX2FjY2VwdCA9ICggTnVtYmVyKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpID09IE51bWJlcihpdGVtX3ZhbHVlKSApO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgaXNfYWNjZXB0ID0gKCBOdW1iZXIoZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCkgPT09IE51bWJlcihpdGVtX3ZhbHVlKSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCAhaXNfYWNjZXB0ICl7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXREYXRhSW5kZXgoaSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKCB0eXBlb2YgKGZpbHRlcl9pdGVtLnNlYXJjaFRleHQpID09PSAnYm9vbGVhbicgJiYgZmlsdGVyX2l0ZW0uc2VhcmNoVGV4dCA9PT0gdHJ1ZSApe1xyXG5cclxuICAgICAgICAgIGxldCBpdGVtX3ZhbHVlOiBhbnkgPSB0aGlzLmNvbGxlY3Rpb25GaW5kKHRoaXMuZGF0YVtpXSwgZmlsdGVyX2l0ZW0uc2VhcmNoSW4pO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBpZiggaXRlbV92YWx1ZSAmJiAoaXRlbV92YWx1ZSkubGVuZ3RoID4gMCApeyAgXHJcbiAgICAgICAgICAgIGxldCBxdGRfaXNfdHJ1ZSA9IDA7ICAgICAgICAgIFxyXG4gICAgICAgICAgICBmb3IoIGxldCBpID0gMDsgaSA8ICgoaXRlbV92YWx1ZSkubGVuZ3RoKTsgaSsrICl7XHJcbiAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1fdmFsdWVbaV07XHJcbiAgICAgICAgICAgICAgaWYoIGl0ZW0gPT09IGZpbHRlcl9pdGVtLnNlYXJjaFRleHQgKXtcclxuICAgICAgICAgICAgICAgIHF0ZF9pc190cnVlKys7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCBxdGRfaXNfdHJ1ZSA9PT0gMCApe1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0RGF0YUluZGV4KGksIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGlmKCAhKCBpdGVtX3ZhbHVlID09PSBmaWx0ZXJfaXRlbS5zZWFyY2hUZXh0ICkgKXtcclxuICAgICAgICAgICAgICB0aGlzLnNldERhdGFJbmRleChpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICBcclxuICAgICAgfVxyXG5cclxuICAgIH0gLy8gZW5kIGZvclxyXG4gICAgXHJcbiAgICB0aGlzLnRvUmVzdWx0KCk7XHJcbiAgICAgIFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b1Jlc3VsdCgpe1xyXG5cclxuXHJcbiAgICBjb25zdCBzZWFyY2hfZGF0YSA9IFtdO1xyXG5cclxuICAgIGxldCBpc19maWx0ZXIgPSBmYWxzZTtcclxuICAgIGZvciggbGV0IGkgPSAwOyBpIDwgKHRoaXMuZmlsdGVycykubGVuZ3RoOyBpKysgKXtcclxuICAgICAgaWYoIHRoaXMuZmlsdGVyc1tpXS5zZWFyY2hUZXh0ICYmIHRoaXMuZmlsdGVyc1tpXS5zZWFyY2hUZXh0ICE9PSAnJyApe1xyXG4gICAgICAgIGlzX2ZpbHRlciA9IHRydWU7IGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYoIGlzX2ZpbHRlciApe1xyXG4gICAgICBmb3IoIGxldCBpID0gMDsgaSA8ICh0aGlzLmRhdGEpLmxlbmd0aDsgaSsrICl7XHJcbiAgICAgICAgaWYoIHRoaXMuZGF0YSAmJiB0aGlzLmRhdGFbaV0gJiYgdGhpcy5kYXRhW2ldWyd0Y19maWx0ZXJfYWNjZXB0J10gKXtcclxuICAgICAgICAgIChzZWFyY2hfZGF0YSkucHVzaCh0aGlzLmRhdGFbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yZXN1bHRfYWNjZXB0KHNlYXJjaF9kYXRhKTtcclxuICAgICAgdGhpcy5vbkZpbHRlci5lbWl0KHsuLi50aGlzLmZpbHRlcnN9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzdWx0X2FjY2VwdCh0aGlzLmRhdGEpO1xyXG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHsuLi50aGlzLmZpbHRlcnN9KTtcclxuICB9XHJcblxyXG4gIHNldERhdGFJbmRleChpbmRleDogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbiApe1xyXG4gICAgaWYoIHRoaXMuZGF0YSAmJiB0aGlzLmRhdGFbaW5kZXhdICl7XHJcbiAgICAgIHRoaXMuZGF0YVtpbmRleF1bJ3RjX2ZpbHRlcl9hY2NlcHQnXSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzdWx0X2FjY2VwdChkYXRhOiBhbnkpe1xyXG4gICAgaWYoICF0aGlzLnVzZUZpbHRlckFjY2VwdCAmJiBkYXRhICYmIChkYXRhKS5sZW5ndGggPiAwICl7XHJcbiAgICAgIGZvciggbGV0IGkgPSAwOyBpIDwgKGRhdGEpLmxlbmd0aDsgaSsrICl7XHJcbiAgICAgICAgZGVsZXRlIGRhdGFbaV1bJ3RjX2ZpbHRlcl9hY2NlcHQnXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN1bHQuZW1pdChkYXRhKTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXYgKm5nSWY9XCJzaG93X2ZpbHRlcnNcIiBjbGFzcz1cInRjbG91ZC11aS1maWx0ZXJzIGFyZWEtZmlsdGVyXCIgW2NsYXNzLm5vLWJvcmRlcl09XCIhYm9yZGVyXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcnM7IGxldCBpID0gaW5kZXhcIj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpdGVtLnR5cGUgfHwgKGl0ZW0udHlwZSAmJiBpdGVtLnR5cGUgIT09ICdib29sZWFuJylcIj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdkYXRlLWxvY2FsJ1wiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZmlsdGVyLWlucHV0IHR5cGUte3tpdGVtLnR5cGV9fSBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgW3N0eWxlXT1cIihpdGVtLndpZHRoICE9PSAnJykgPyAnd2lkdGg6JytpdGVtLndpZHRoIDogJydcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1kZXNjcmlwdGlvbiB0Yy10aXRsZS1lbGxpcHNpcyBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgdGl0bGU9XCJ7eyBpdGVtLmRlc2NyaXB0aW9uIH19XCI+PGkgW2NsYXNzLnRvLWFjdGl2ZV09XCIoaXRlbS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGl0ZW0udmFsdWUgIT09IG51bGwgJiYgaXRlbS52YWx1ZSAhPT0gJycpXCIgY2xhc3M9XCJmYXMgZmEtZmlsdGVyIGljb24tZmlsdGVyXCI+PC9pPiZuYnNwO3t7IGl0ZW0uZGVzY3JpcHRpb24gfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LXR5cGUte3tpdGVtLnR5cGV9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGNsb3VkLXVpLWRhdGVwaWNrZXIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjX2lucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiaW5wdXRfe3tpKzF9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9kZUlucHV0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNlYXJjaEluKGl0ZW0sIF9pbnB1dClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Y2xvdWQtdWktZGF0ZXBpY2tlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1jbGVhci1maWx0ZXItdGV4dFwiIFtjbGFzcy50by1oaWRlXT1cIiEoaXRlbS52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGl0ZW0udmFsdWUgIT09IG51bGwgJiYgaXRlbS52YWx1ZSAhPT0gJycpXCIgKGNsaWNrKT1cInNlYXJjaEluKGl0ZW0sIG51bGwpOyBpdGVtLnNlYXJjaFRleHQgPSB1bmRlZmluZWQ7IGl0ZW0udmFsdWUgPSAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udHlwZSAhPT0gJ2RhdGUtbG9jYWwnXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50eXBlID09PSAnZGF0ZXRpbWUtbG9jYWwnXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoaXRlbS5pZCA9PT0gJ3N0YXJ0JyB8fCBpdGVtLmlkID09PSAnc3RvcCcpICYmIHVzZVJhbmdlRGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFBFUklPRCBSQU5HRSBEQVRFIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5pZCA9PT0gJ3N0YXJ0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1maWx0ZXItaW5wdXQgdHlwZS17e2l0ZW0udHlwZX19IGJveC10eXBlLXt7aXRlbS50eXBlfX1cIiBbc3R5bGVdPVwiKGl0ZW0ud2lkdGggIT09ICcnKSA/ICd3aWR0aDonK3N0YXJ0X3N0b3Bfd2lkdGgrJycrc3RhcnRfc3RvcF91bmQgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWRlc2NyaXB0aW9uIHRjLXRpdGxlLWVsbGlwc2lzIGJveC10eXBlLXt7aXRlbS50eXBlfX1cIiB0aXRsZT1cInt7IGl0ZW0uZGVzY3JpcHRpb24gfX1cIj48aSBbY2xhc3MudG8tYWN0aXZlXT1cIihfcmFuZ2VfZGF0ZSAmJiBfcmFuZ2VfZGF0ZS5yZXN1bHQgJiYgX3JhbmdlX2RhdGUucmVzdWx0LnN0YXJ0ICYmIF9yYW5nZV9kYXRlLnJlc3VsdC5zdG9wIClcIiBjbGFzcz1cImZhcyBmYS1maWx0ZXIgaWNvbi1maWx0ZXJcIj48L2k+Jm5ic3A7PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJhbmdlLWRhdGUgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjX3JhbmdlX2RhdGUgbmdNb2RlbCBuYW1lPVwiaW5wdXRfe3tpKzF9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFZhbHVlUGVyaW9kU3RhcnRTdG9wXT1cIml0ZW0uZGVmYXVsdFZhbHVlUGVyaW9kU3RhcnRTdG9wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uU3RhcnRdPVwiZGVzY3JpcHRpb25TdGFydFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvblN0b3BdPVwiZGVzY3JpcHRpb25TdG9wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJzZWFyY2hJblJhbmdlKF9yYW5nZV9kYXRlKTsgc2VhcmNoSW4oaXRlbSwgX3JhbmdlX2RhdGUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yYW5nZS1kYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJpdGVtLmlkID09PSAnc3RhcnQnXCIgI19pbnB1dCBuYW1lPVwiaW5wdXRfe3tpKzF9fVwiIHR5cGU9XCJoaWRkZW5cIiBbKG5nTW9kZWwpXT1cInN0YXJ0X3ZhbHVlXCI+ICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwiaXRlbS5pZCA9PT0gJ3N0b3AnXCIgI19pbnB1dCBuYW1lPVwiaW5wdXRfe3tpKzF9fVwiIHR5cGU9XCJoaWRkZW5cIiBbKG5nTW9kZWwpXT1cInN0b3BfdmFsdWVcIj4gICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpdGVtLmlkIHx8ICF1c2VSYW5nZURhdGVcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtZmlsdGVyLWlucHV0IHR5cGUte3tpdGVtLnR5cGV9fSBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgW3N0eWxlXT1cIihpdGVtLndpZHRoICE9PSAnJykgPyAnd2lkdGg6JytpdGVtLndpZHRoIDogJydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWRlc2NyaXB0aW9uIHRjLXRpdGxlLWVsbGlwc2lzIGJveC10eXBlLXt7aXRlbS50eXBlfX1cIiB0aXRsZT1cInt7IGl0ZW0uZGVzY3JpcHRpb24gfX1cIj48aSBbY2xhc3MudG8tYWN0aXZlXT1cIihpdGVtLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgaXRlbS52YWx1ZSAhPT0gbnVsbCAmJiBpdGVtLnZhbHVlICE9PSAnJylcIiBjbGFzcz1cImZhcyBmYS1maWx0ZXIgaWNvbi1maWx0ZXJcIj48L2k+Jm5ic3A7e3sgaXRlbS5kZXNjcmlwdGlvbiB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC10eXBlLXt7aXRlbS50eXBlfX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGNsb3VkLXVpLWRhdGVwaWNrZXItdGltZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI19pbnB1dCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnZhbHVlXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpbnB1dF97e2krMX19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2VPcHRpb25zRGF0ZVRpbWVdPVwiKGl0ZW0gJiYgaXRlbS51c2VPcHRpb25zRGF0ZVRpbWUpID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50Q2hhbmdlKT1cInNlYXJjaEluKGl0ZW0sIF9pbnB1dClcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Y2xvdWQtdWktZGF0ZXBpY2tlci10aW1lPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tY2xlYXItZmlsdGVyLXRleHRcIiBbY2xhc3MudG8taGlkZV09XCIhKGl0ZW0udmFsdWUgIT09IHVuZGVmaW5lZCAmJiBpdGVtLnZhbHVlICE9PSBudWxsICYmIGl0ZW0udmFsdWUgIT09ICcnKVwiIChjbGljayk9XCJzZWFyY2hJbihpdGVtLCBudWxsKTsgaXRlbS5zZWFyY2hUZXh0ID0gdW5kZWZpbmVkOyBpdGVtLnZhbHVlID0gJydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnR5cGUgIT09ICdzZWxlY3QnICYmIGl0ZW0udHlwZSAhPT0gJ2RhdGV0aW1lLWxvY2FsJyAmJiBpdGVtLnR5cGUgIT09ICdkYXRlLWxvY2FsJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1maWx0ZXItaW5wdXQgdHlwZS17e2l0ZW0udHlwZX19IGJveC10eXBlLXt7aXRlbS50eXBlfX1cIiBbc3R5bGVdPVwiKGl0ZW0ud2lkdGggIT09ICcnKSA/ICd3aWR0aDonK2l0ZW0ud2lkdGggOiAnJ1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1kZXNjcmlwdGlvbiB0Yy10aXRsZS1lbGxpcHNpcyBib3gtdHlwZS17e2l0ZW0udHlwZX19XCIgdGl0bGU9XCJ7eyBpdGVtLmRlc2NyaXB0aW9uIH19XCI+PGkgW2NsYXNzLnRvLWFjdGl2ZV09XCJfaW5wdXQudmFsdWUgIT09ICcnXCIgY2xhc3M9XCJmYXMgZmEtZmlsdGVyIGljb24tZmlsdGVyXCI+PC9pPiZuYnNwO3t7IGl0ZW0uZGVzY3JpcHRpb24gfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LXR5cGUte3tpdGVtLnR5cGV9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjX2lucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAoaXRlbS5wbGFjZWhvbGRlciAhPT0gJycpID8gaXRlbS5wbGFjZWhvbGRlciA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpbnB1dF97e2krMX19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwie3sgKGl0ZW0udHlwZSA9PT0gJ251bWJlcicpID8gJ3RleHQnIDogaXRlbS50eXBlIH19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRjLWZvcm0tY29udHJvbFwiICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwic2VhcmNoSW4oaXRlbSwgJGV2ZW50KVwiPiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tY2xlYXItZmlsdGVyLXRleHRcIiBbY2xhc3MudG8taGlkZV09XCJfaW5wdXQudmFsdWUgPT09ICcnXCIgKGNsaWNrKT1cInNlYXJjaEluKGl0ZW0sIG51bGwpOyBfaW5wdXQudmFsdWUgPSAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ3NlbGVjdCcgJiYgaXRlbS5kYXRhICYmIChpdGVtLmRhdGEpLmxlbmd0aCA+IDBcIiA+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZpbHRlci1pbnB1dCB0eXBlLXt7aXRlbS50eXBlfX0gYm94LXR5cGUte3tpdGVtLnR5cGV9fVwiIFtzdHlsZV09XCIoaXRlbS53aWR0aCAhPT0gJycpID8gJ3dpZHRoOicraXRlbS53aWR0aCA6ICcnXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWRlc2NyaXB0aW9uIHRjLXRpdGxlLWVsbGlwc2lzIGJveC10eXBlLXt7aXRlbS50eXBlfX1cIiB0aXRsZT1cInt7IGl0ZW0uZGVzY3JpcHRpb24gfX1cIj48aSBbY2xhc3MudG8tYWN0aXZlXT1cIl9pbnB1dC52YWx1ZSAhPT0gJydcIiBjbGFzcz1cImZhcyBmYS1maWx0ZXIgaWNvbi1maWx0ZXJcIj48L2k+Jm5ic3A7e3sgaXRlbS5kZXNjcmlwdGlvbiB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtdHlwZS17e2l0ZW0udHlwZX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjX2lucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImlucHV0X3t7aSsxfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGMtZm9ybS1jb250cm9sXCIgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VhcmNoSW4oaXRlbSwgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJcIj48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHYgb2YgaXRlbS5kYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwidi52YWx1ZVwiPnt7IHYuZGVzY3JpcHRpb24gfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50eXBlICYmIGl0ZW0udHlwZSA9PT0gJ2Jvb2xlYW4nXCI+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWZpbHRlci1pbnB1dFwiIFtzdHlsZV09XCIoaXRlbS53aWR0aCAhPT0gJycpID8gJ3dpZHRoOicraXRlbS53aWR0aCA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1kZXNjcmlwdGlvbiB0Yy10aXRsZS1lbGxpcHNpc1wiIHRpdGxlPVwie3sgaXRlbS5kZXNjcmlwdGlvbiB9fVwiIHRpdGxlPVwie3sgaXRlbS5kZXNjcmlwdGlvbiB9fVwiPjxpIFtjbGFzcy50by1hY3RpdmVdPVwiX2lucHV0LmNoZWNrZWQgPT09IHRydWVcIiBjbGFzcz1cImZhcyBmYS1maWx0ZXIgaWNvbi1maWx0ZXJcIj48L2k+Jm5ic3A7e3sgaXRlbS5kZXNjcmlwdGlvbiB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZWEtaW5wdXQtY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGMtZm9ybS1jb250cm9sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ucGxhY2Vob2xkZXIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjX2lucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAoaXRlbS5wbGFjZWhvbGRlciAhPT0gJycpID8gaXRlbS5wbGFjZWhvbGRlciA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiaW5wdXRfe3tpKzF9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VhcmNoSW4oaXRlbSwgX2lucHV0LmNoZWNrZWQpXCI+ICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXJpZ2h0IG1iLTEgbXItMVwiICpuZ0lmPVwidXNlQnV0dG9uU3VibWl0XCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0Yy1idG4ge3sgYnRuU3VibWl0Q2xhc3MgfX1cIiAoY2xpY2spPVwidG9TdWJtaXQoKVwiID57eyBzdWJtaXRUZXh0IH19PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG5cclxuPCEtLSA8cHJlPnt7IGlucHV0cyB8IGpzb24gfX08L3ByZT4gLS0+XHJcbjwhLS0gPHByZT4ge3sgZGF0YSB8IGpzb24gfX0gPC9wcmU+IC0tPlxyXG5cclxuPCEtLSA8cD5GSUxURVJTPC9wPjxwcmU+IHt7IGZpbHRlcnMgfCBqc29uIH19PC9wcmU+IC0tPlxyXG5cclxuPCEtLVxyXG4gICAgPHByZT5zdGFydF9zdG9wOiB7eyBzdGFydF9zdG9wIH19PC9wcmU+XHJcbiAgICA8cHJlPnN0YXJ0X3N0b3Bfd2lkdGg6IHt7IHN0YXJ0X3N0b3Bfd2lkdGggfX08L3ByZT5cclxuICAgIDxwcmU+c3RhcnRfc3RvcF91bmQ6IHt7IHN0YXJ0X3N0b3BfdW5kIH19PC9wcmU+XHJcbi0tPiJdfQ==