@colijnit/transaction 12.1.9 → 12.1.12

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 (214) hide show
  1. package/bundles/colijnit-transaction.umd.js +2673 -242
  2. package/bundles/colijnit-transaction.umd.js.map +1 -1
  3. package/colijnit-transaction.d.ts +84 -35
  4. package/colijnit-transaction.metadata.json +1 -1
  5. package/esm2015/colijnit-transaction.js +85 -36
  6. package/esm2015/lib/assets/dictionary/text.properties.js +39 -1
  7. package/esm2015/lib/component/checkout/checkout.component.js +1 -1
  8. package/esm2015/lib/component/checkout/checkout.module.js +1 -1
  9. package/esm2015/lib/component/confirmation-dialog/confirmation-dialog.component.js +17 -3
  10. package/esm2015/lib/component/core/base/default-ok-cancel-buttons.component.js +41 -0
  11. package/esm2015/lib/component/core/base/transaction-base.component.js +7 -9
  12. package/esm2015/lib/component/core/core.module.js +6 -3
  13. package/esm2015/lib/component/core/enum/app-popup-type.enum.js +8 -0
  14. package/esm2015/lib/component/order-confirmation-grid/order-confirmation-grid.component.js +70 -0
  15. package/esm2015/lib/component/order-confirmation-grid/order-confirmation-grid.module.js +29 -0
  16. package/esm2015/lib/component/order-grid/order-grid.component.js +99 -0
  17. package/esm2015/lib/component/order-grid/order-grid.module.js +28 -0
  18. package/esm2015/lib/component/stepper/stepper.component.js +1 -1
  19. package/esm2015/lib/component/tile/tile.component.js +1 -1
  20. package/esm2015/lib/component/transaction/transaction.component.js +72 -14
  21. package/esm2015/lib/component/transaction/transaction.module.js +10 -2
  22. package/esm2015/lib/component/transaction-commit-bar/transaction-commit-bar.component.js +46 -0
  23. package/esm2015/lib/component/transaction-commit-bar/transaction-commit-bar.module.js +27 -0
  24. package/esm2015/lib/component/transaction-confirmation-history/transaction-confirmation-history.component.js +28 -0
  25. package/esm2015/lib/component/transaction-confirmation-history/transaction-confirmation-history.module.js +27 -0
  26. package/esm2015/lib/component/transaction-header/transaction-header.component.js +14 -4
  27. package/esm2015/lib/component/transaction-header-delivery/transaction-header-delivery.component.js +5 -2
  28. package/esm2015/lib/component/transaction-history-grid/transaction-history-grid.component.js +47 -0
  29. package/esm2015/lib/component/transaction-history-grid/transaction-history-grid.module.js +27 -0
  30. package/esm2015/lib/component/transaction-history-grid-status/transaction-history-grid-status.component.js +36 -0
  31. package/esm2015/lib/component/transaction-history-grid-status/transaction-history-grid-status.module.js +23 -0
  32. package/esm2015/lib/component/transaction-line/transaction-line.component.js +11 -7
  33. package/esm2015/lib/component/transaction-line/transaction-line.module.js +2 -4
  34. package/esm2015/lib/component/transaction-line-fields/transaction-line-commission-code.component.js +49 -0
  35. package/esm2015/lib/component/transaction-line-fields/transaction-line-commission-code.module.js +23 -0
  36. package/esm2015/lib/component/transaction-line-fields/transaction-line-delivery-date.component.js +40 -0
  37. package/esm2015/lib/component/transaction-line-fields/transaction-line-delivery-date.module.js +23 -0
  38. package/esm2015/lib/component/transaction-line-fields/transaction-line-delivery-method.component.js +48 -0
  39. package/esm2015/lib/component/transaction-line-fields/transaction-line-delivery-method.module.js +23 -0
  40. package/esm2015/lib/component/transaction-line-fields/transaction-line-discount-amount.component.js +50 -0
  41. package/esm2015/lib/component/transaction-line-fields/transaction-line-discount-amount.module.js +23 -0
  42. package/esm2015/lib/component/transaction-line-fields/transaction-line-fields-base.component.js +22 -0
  43. package/esm2015/lib/component/transaction-line-fields/transaction-line-line-discount.component.js +50 -0
  44. package/esm2015/lib/component/transaction-line-fields/transaction-line-line-discount.module.js +23 -0
  45. package/esm2015/lib/component/transaction-line-fields/transaction-line-price-list.component.js +49 -0
  46. package/esm2015/lib/component/transaction-line-fields/transaction-line-price-list.module.js +23 -0
  47. package/esm2015/lib/component/transaction-line-fields/transaction-line-price.component.js +49 -0
  48. package/esm2015/lib/component/transaction-line-fields/transaction-line-price.module.js +23 -0
  49. package/esm2015/lib/component/transaction-line-fields/transaction-line-quantity.component.js +36 -0
  50. package/esm2015/lib/component/transaction-line-fields/transaction-line-quantity.module.js +23 -0
  51. package/esm2015/lib/component/transaction-line-fields/transaction-line-quantum-discount.component.js +50 -0
  52. package/esm2015/lib/component/transaction-line-fields/transaction-line-quantum-discount.module.js +23 -0
  53. package/esm2015/lib/component/transaction-line-fields/transaction-line-reference.component.js +48 -0
  54. package/esm2015/lib/component/transaction-line-fields/transaction-line-reference.module.js +23 -0
  55. package/esm2015/lib/component/transaction-line-fields/transaction-line-special-discount.component.js +50 -0
  56. package/esm2015/lib/component/transaction-line-fields/transaction-line-special-discount.module.js +23 -0
  57. package/esm2015/lib/component/transaction-line-fields/transaction-line-vat.component.js +49 -0
  58. package/esm2015/lib/component/transaction-line-fields/transaction-line-vat.module.js +23 -0
  59. package/esm2015/lib/component/transaction-line-fields/transaction-line-warehouse.component.js +49 -0
  60. package/esm2015/lib/component/transaction-line-fields/transaction-line-warehouse.module.js +24 -0
  61. package/esm2015/lib/component/transaction-line-side-panel/transaction-line-side-panel.component.js +57 -129
  62. package/esm2015/lib/component/transaction-line-side-panel/transaction-line-side-panel.module.js +14 -8
  63. package/esm2015/lib/component/transaction-line-side-panel-default/transaction-line-side-panel-default.component.js +134 -0
  64. package/esm2015/lib/component/transaction-line-side-panel-default/transaction-line-side-panel-default.module.js +56 -0
  65. package/esm2015/lib/component/transaction-lines/transaction-lines.component.js +7 -1
  66. package/esm2015/lib/component/transaction-lines-grid/transaction-lines-grid.component.js +16 -11
  67. package/esm2015/lib/component/transaction-lines-grid/transaction-lines-grid.module.js +4 -3
  68. package/esm2015/lib/component/transaction-nav-bar/transaction-nav-bar-button/transaction-nav-bar-button.component.js +29 -0
  69. package/esm2015/lib/component/transaction-nav-bar/transaction-nav-bar.component.js +65 -0
  70. package/esm2015/lib/component/transaction-nav-bar/transaction-nav-bar.module.js +26 -0
  71. package/esm2015/lib/component/transaction-receiving-goods-details/transaction-receiving-goods-details.component.js +39 -0
  72. package/esm2015/lib/component/transaction-receiving-goods-details/transaction-receiving-goods-details.module.js +25 -0
  73. package/esm2015/lib/component/transaction-receiving-goods-history/transaction-receiving-goods-history.component.js +28 -0
  74. package/esm2015/lib/component/transaction-receiving-goods-history/transaction-receiving-goods-history.module.js +27 -0
  75. package/esm2015/lib/enum/icon.enum.js +5 -1
  76. package/esm2015/lib/enum/status-type.enum.js +5 -0
  77. package/esm2015/lib/enum/tab-category.enum.js +10 -0
  78. package/esm2015/lib/model/icon-svg.js +6 -2
  79. package/esm2015/lib/pipe/delivery-time.pipe.js +4 -1
  80. package/esm2015/lib/service/dialog.service.js +14 -3
  81. package/esm2015/lib/service/ione-connector-adapter.service.js +255 -10
  82. package/esm2015/lib/service/pending-reason.service.js +20 -9
  83. package/esm2015/lib/service/transaction.service.js +187 -29
  84. package/fesm2015/colijnit-transaction.js +2477 -290
  85. package/fesm2015/colijnit-transaction.js.map +1 -1
  86. package/lib/component/confirmation-dialog/confirmation-dialog.component.d.ts +4 -0
  87. package/lib/component/core/base/default-ok-cancel-buttons.component.d.ts +13 -0
  88. package/lib/component/core/enum/app-popup-type.enum.d.ts +6 -0
  89. package/lib/component/core/image-display/style/_layout.scss +2 -4
  90. package/lib/component/order-confirmation-create/style/_layout.scss +5 -0
  91. package/lib/component/order-confirmation-create/style/_material-definition.scss +1 -0
  92. package/lib/component/order-confirmation-create/style/_theme.scss +5 -0
  93. package/lib/component/order-confirmation-create/style/material.scss +4 -0
  94. package/lib/component/order-confirmation-grid/order-confirmation-grid.component.d.ts +15 -0
  95. package/lib/component/order-confirmation-grid/order-confirmation-grid.module.d.ts +2 -0
  96. package/lib/component/order-confirmation-grid/style/_layout.scss +5 -0
  97. package/lib/component/order-confirmation-grid/style/_material-definition.scss +1 -0
  98. package/lib/component/order-confirmation-grid/style/_theme.scss +5 -0
  99. package/lib/component/order-confirmation-grid/style/material.scss +4 -0
  100. package/lib/component/order-grid/order-grid.component.d.ts +23 -0
  101. package/lib/component/order-grid/order-grid.module.d.ts +2 -0
  102. package/lib/component/order-grid/style/_layout.scss +21 -0
  103. package/lib/component/order-grid/style/_material-definition.scss +2 -0
  104. package/lib/component/order-grid/style/_theme.scss +6 -0
  105. package/lib/component/order-grid/style/material.scss +4 -0
  106. package/lib/component/transaction/style/_layout.scss +6 -0
  107. package/lib/component/transaction/style/material.scss +3 -0
  108. package/lib/component/transaction/transaction.component.d.ts +16 -1
  109. package/lib/component/transaction-commit-bar/style/_layout.scss +16 -0
  110. package/lib/component/transaction-commit-bar/style/_material-definition.scss +1 -0
  111. package/lib/component/transaction-commit-bar/style/_theme.scss +7 -0
  112. package/lib/component/transaction-commit-bar/style/material.scss +4 -0
  113. package/lib/component/transaction-commit-bar/transaction-commit-bar.component.d.ts +11 -0
  114. package/lib/component/transaction-commit-bar/transaction-commit-bar.module.d.ts +2 -0
  115. package/lib/component/transaction-confirmation-history/style/_layout.scss +7 -0
  116. package/lib/component/transaction-confirmation-history/style/_material-definition.scss +1 -0
  117. package/lib/component/transaction-confirmation-history/style/_theme.scss +7 -0
  118. package/lib/component/transaction-confirmation-history/style/material.scss +4 -0
  119. package/lib/component/transaction-confirmation-history/transaction-confirmation-history.component.d.ts +5 -0
  120. package/lib/component/transaction-confirmation-history/transaction-confirmation-history.module.d.ts +2 -0
  121. package/lib/component/transaction-header/transaction-header.component.d.ts +4 -1
  122. package/lib/component/transaction-history-grid/style/_layout.scss +7 -0
  123. package/lib/component/{service-order/transaction-sidebar/transaction-line-accordion.component.scss → transaction-history-grid/style/_material-definition.scss} +0 -0
  124. package/lib/component/transaction-history-grid/style/_theme.scss +7 -0
  125. package/lib/component/transaction-history-grid/style/material.scss +4 -0
  126. package/lib/component/transaction-history-grid/transaction-history-grid.component.d.ts +14 -0
  127. package/lib/component/transaction-history-grid/transaction-history-grid.module.d.ts +2 -0
  128. package/lib/component/transaction-history-grid-status/style/_layout.scss +28 -0
  129. package/lib/component/{service-order/transaction-edit-article-text/transaction-edit-article-text.component.scss → transaction-history-grid-status/style/_material-definition.scss} +0 -0
  130. package/lib/component/transaction-history-grid-status/style/_theme.scss +7 -0
  131. package/lib/component/transaction-history-grid-status/style/material.scss +4 -0
  132. package/lib/component/transaction-history-grid-status/transaction-history-grid-status.component.d.ts +9 -0
  133. package/lib/component/transaction-history-grid-status/transaction-history-grid-status.module.d.ts +2 -0
  134. package/lib/component/transaction-line/transaction-line.component.d.ts +3 -2
  135. package/lib/component/transaction-line-fields/transaction-line-commission-code.component.d.ts +12 -0
  136. package/lib/component/transaction-line-fields/transaction-line-commission-code.module.d.ts +2 -0
  137. package/lib/component/transaction-line-fields/transaction-line-delivery-date.component.d.ts +7 -0
  138. package/lib/component/transaction-line-fields/transaction-line-delivery-date.module.d.ts +2 -0
  139. package/lib/component/transaction-line-fields/transaction-line-delivery-method.component.d.ts +12 -0
  140. package/lib/component/transaction-line-fields/transaction-line-delivery-method.module.d.ts +2 -0
  141. package/lib/component/transaction-line-fields/transaction-line-discount-amount.component.d.ts +10 -0
  142. package/lib/component/transaction-line-fields/transaction-line-discount-amount.module.d.ts +2 -0
  143. package/lib/component/transaction-line-fields/transaction-line-fields-base.component.d.ts +6 -0
  144. package/lib/component/transaction-line-fields/transaction-line-line-discount.component.d.ts +10 -0
  145. package/lib/component/transaction-line-fields/transaction-line-line-discount.module.d.ts +2 -0
  146. package/lib/component/transaction-line-fields/transaction-line-price-list.component.d.ts +12 -0
  147. package/lib/component/transaction-line-fields/transaction-line-price-list.module.d.ts +2 -0
  148. package/lib/component/transaction-line-fields/transaction-line-price.component.d.ts +10 -0
  149. package/lib/component/transaction-line-fields/transaction-line-price.module.d.ts +2 -0
  150. package/lib/component/transaction-line-fields/transaction-line-quantity.component.d.ts +7 -0
  151. package/lib/component/transaction-line-fields/transaction-line-quantity.module.d.ts +2 -0
  152. package/lib/component/transaction-line-fields/transaction-line-quantum-discount.component.d.ts +10 -0
  153. package/lib/component/transaction-line-fields/transaction-line-quantum-discount.module.d.ts +2 -0
  154. package/lib/component/transaction-line-fields/transaction-line-reference.component.d.ts +10 -0
  155. package/lib/component/transaction-line-fields/transaction-line-reference.module.d.ts +2 -0
  156. package/lib/component/transaction-line-fields/transaction-line-special-discount.component.d.ts +10 -0
  157. package/lib/component/transaction-line-fields/transaction-line-special-discount.module.d.ts +2 -0
  158. package/lib/component/transaction-line-fields/transaction-line-vat.component.d.ts +12 -0
  159. package/lib/component/transaction-line-fields/transaction-line-vat.module.d.ts +2 -0
  160. package/lib/component/transaction-line-fields/transaction-line-warehouse.component.d.ts +12 -0
  161. package/lib/component/transaction-line-fields/transaction-line-warehouse.module.d.ts +2 -0
  162. package/lib/component/transaction-line-side-panel/style/_layout.scss +38 -21
  163. package/lib/component/transaction-line-side-panel/style/_material-definition.scss +4 -6
  164. package/lib/component/transaction-line-side-panel/style/_theme.scss +3 -1
  165. package/lib/component/transaction-line-side-panel/style/material.scss +5 -0
  166. package/lib/component/transaction-line-side-panel/transaction-line-side-panel.component.d.ts +6 -8
  167. package/lib/component/transaction-line-side-panel-default/style/_layout.scss +29 -0
  168. package/lib/component/transaction-line-side-panel-default/style/_material-definition.scss +10 -0
  169. package/lib/component/transaction-line-side-panel-default/style/_theme.scss +7 -0
  170. package/lib/component/transaction-line-side-panel-default/style/material.scss +4 -0
  171. package/lib/component/transaction-line-side-panel-default/transaction-line-side-panel-default.component.d.ts +16 -0
  172. package/lib/component/transaction-line-side-panel-default/transaction-line-side-panel-default.module.d.ts +2 -0
  173. package/lib/component/transaction-lines/transaction-lines.component.d.ts +5 -0
  174. package/lib/component/transaction-lines-grid/transaction-lines-grid.component.d.ts +4 -1
  175. package/lib/component/transaction-nav-bar/style/_layout.scss +13 -0
  176. package/lib/component/transaction-nav-bar/style/_material-definition.scss +1 -0
  177. package/lib/component/transaction-nav-bar/style/_theme.scss +7 -0
  178. package/lib/component/transaction-nav-bar/style/material.scss +4 -0
  179. package/lib/component/transaction-nav-bar/transaction-nav-bar-button/transaction-nav-bar-button.component.d.ts +14 -0
  180. package/lib/component/transaction-nav-bar/transaction-nav-bar-button/transaction-nav-bar-button.component.scss +23 -0
  181. package/lib/component/transaction-nav-bar/transaction-nav-bar.component.d.ts +18 -0
  182. package/lib/component/transaction-nav-bar/transaction-nav-bar.module.d.ts +2 -0
  183. package/lib/component/transaction-receiving-goods-details/style/_layout.scss +38 -0
  184. package/lib/component/transaction-receiving-goods-details/style/_material-definition.scss +1 -0
  185. package/lib/component/transaction-receiving-goods-details/style/_theme.scss +7 -0
  186. package/lib/component/transaction-receiving-goods-details/style/material.scss +4 -0
  187. package/lib/component/transaction-receiving-goods-details/transaction-receiving-goods-details.component.d.ts +6 -0
  188. package/lib/component/transaction-receiving-goods-details/transaction-receiving-goods-details.module.d.ts +2 -0
  189. package/lib/component/transaction-receiving-goods-history/style/_layout.scss +7 -0
  190. package/lib/component/transaction-receiving-goods-history/style/_material-definition.scss +1 -0
  191. package/lib/component/transaction-receiving-goods-history/style/_theme.scss +7 -0
  192. package/lib/component/transaction-receiving-goods-history/style/material.scss +4 -0
  193. package/lib/component/transaction-receiving-goods-history/transaction-receiving-goods-history.component.d.ts +5 -0
  194. package/lib/component/transaction-receiving-goods-history/transaction-receiving-goods-history.module.d.ts +2 -0
  195. package/lib/enum/icon.enum.d.ts +5 -1
  196. package/lib/enum/status-type.enum.d.ts +3 -0
  197. package/lib/enum/tab-category.enum.d.ts +8 -0
  198. package/lib/service/dialog.service.d.ts +1 -0
  199. package/lib/service/ione-connector-adapter.service.d.ts +24 -7
  200. package/lib/service/pending-reason.service.d.ts +3 -2
  201. package/lib/service/transaction.service.d.ts +22 -9
  202. package/package.json +2 -2
  203. package/lib/component/sell-order/sell-order-side-panel/sell-order-side-panel.component.scss +0 -49
  204. package/lib/component/sell-order/sell-order.component.scss +0 -15
  205. package/lib/component/service-order/service-order.component.scss +0 -154
  206. package/lib/component/service-order/summary/transaction-delivery-summary.component.scss +0 -22
  207. package/lib/component/service-order/summary/transaction-summary-block.component.scss +0 -109
  208. package/lib/component/service-order/transaction-manager/transaction-manager.component.scss +0 -54
  209. package/lib/component/service-order/transaction-order-line-view/transaction-order-line-view.component.scss +0 -90
  210. package/lib/component/service-order/transaction-order-lines/transaction-order-lines.component.scss +0 -85
  211. package/lib/component/service-order/transaction-order-totals/transaction-order-totals.component.scss +0 -26
  212. package/lib/component/service-order/transaction-relation/transaction-relation-edit.component.scss +0 -24
  213. package/lib/component/service-order/transaction-sidebar/transaction-sidebar-right.component.scss +0 -17
  214. package/lib/component/service-order/warehouse/warehouse.component.scss +0 -54
@@ -13,6 +13,10 @@ import * as i1 from "./dialog.service";
13
13
  import * as i2 from "./options.service";
14
14
  import * as i3 from "./ione-connector-adapter.service";
15
15
  export class TransactionService extends PendingReasonService {
16
+ constructor() {
17
+ super(...arguments);
18
+ this._imageCache = new Map();
19
+ }
16
20
  // public get currentLines(): TransactionLineInfo[] {
17
21
  // return this._currentLines;
18
22
  // }
@@ -68,6 +72,156 @@ export class TransactionService extends PendingReasonService {
68
72
  && line.pendingReasonType !== PendingReasonType.NON_CRITICAL_DISCONTINUATION);
69
73
  return status;
70
74
  }
75
+ updatePriceTransactionLine(uuid, lineUuid, price) {
76
+ return __awaiter(this, void 0, void 0, function* () {
77
+ const response = yield this.connector.changeTransactionLinePrice(uuid, lineUuid, price)
78
+ .catch((error) => {
79
+ // todo: do something with the error
80
+ return false;
81
+ });
82
+ if (response) {
83
+ const success = yield this.handleLineOperationStatuses(response);
84
+ this._rememberCurrentTransaction(response);
85
+ return success;
86
+ }
87
+ return false;
88
+ });
89
+ }
90
+ updateReferenceTransactionLine(uuid, lineUuid, reference) {
91
+ return __awaiter(this, void 0, void 0, function* () {
92
+ const response = yield this.connector.changeTransactionLineReference(uuid, lineUuid, reference)
93
+ .catch((error) => {
94
+ // todo: do something with the error
95
+ return false;
96
+ });
97
+ if (response) {
98
+ const success = yield this.handleLineOperationStatuses(response);
99
+ this._rememberCurrentTransaction(response);
100
+ return success;
101
+ }
102
+ return false;
103
+ });
104
+ }
105
+ updateQuantityTransactionLine(uuid, lineUuid, quantity) {
106
+ return __awaiter(this, void 0, void 0, function* () {
107
+ const response = yield this.connector.changeTransactionLineQuantity(uuid, lineUuid, quantity)
108
+ .catch((error) => {
109
+ // todo: do something with the error
110
+ return false;
111
+ });
112
+ if (response) {
113
+ const success = yield this.handleLineOperationStatuses(response);
114
+ this._rememberCurrentTransaction(response);
115
+ return success;
116
+ }
117
+ return false;
118
+ });
119
+ }
120
+ updateDeliveryDateTransactionLine(uuid, lineUuid, date) {
121
+ return __awaiter(this, void 0, void 0, function* () {
122
+ const response = yield this.connector.changeTransactionLineDeliveryDate(uuid, lineUuid, date)
123
+ .catch((error) => {
124
+ // todo: do something with the error
125
+ return false;
126
+ });
127
+ if (response) {
128
+ const success = yield this.handleLineOperationStatuses(response);
129
+ this._rememberCurrentTransaction(response);
130
+ return success;
131
+ }
132
+ return false;
133
+ });
134
+ }
135
+ updatePriceListTransactionLine(uuid, lineUuid, priceList) {
136
+ return __awaiter(this, void 0, void 0, function* () {
137
+ const response = yield this.connector.changeTransactionLinePriceList(uuid, lineUuid, priceList)
138
+ .catch((error) => {
139
+ // todo: do something with the error
140
+ return false;
141
+ });
142
+ if (response) {
143
+ const success = yield this.handleLineOperationStatuses(response);
144
+ this._rememberCurrentTransaction(response);
145
+ return success;
146
+ }
147
+ return false;
148
+ });
149
+ }
150
+ updateVatTransactionLine(uuid, lineUuid, id) {
151
+ return __awaiter(this, void 0, void 0, function* () {
152
+ const response = yield this.connector.changeTransactionLineVat(uuid, lineUuid, id)
153
+ .catch((error) => {
154
+ // todo: do something with the error
155
+ return false;
156
+ });
157
+ if (response) {
158
+ const success = yield this.handleLineOperationStatuses(response);
159
+ this._rememberCurrentTransaction(response);
160
+ return success;
161
+ }
162
+ return false;
163
+ });
164
+ }
165
+ updateCommissionCodeTransactionLine(uuid, lineUuid, code) {
166
+ return __awaiter(this, void 0, void 0, function* () {
167
+ const response = yield this.connector.changeTransactionLineCommissionCode(uuid, lineUuid, code)
168
+ .catch((error) => {
169
+ // todo: do something with the error
170
+ return false;
171
+ });
172
+ if (response) {
173
+ const success = yield this.handleLineOperationStatuses(response);
174
+ this._rememberCurrentTransaction(response);
175
+ return success;
176
+ }
177
+ return false;
178
+ });
179
+ }
180
+ updateWarehouseTransactionLine(uuid, lineUuid, warehouseNumber) {
181
+ return __awaiter(this, void 0, void 0, function* () {
182
+ const response = yield this.connector.changeTransactionLineWarehouse(uuid, lineUuid, warehouseNumber)
183
+ .catch((error) => {
184
+ // todo: do something with the error
185
+ return false;
186
+ });
187
+ if (response) {
188
+ const success = yield this.handleLineOperationStatuses(response);
189
+ this._rememberCurrentTransaction(response);
190
+ return success;
191
+ }
192
+ return false;
193
+ });
194
+ }
195
+ updateDeliveryMethodTransactionLine(uuid, lineUuid, method) {
196
+ return __awaiter(this, void 0, void 0, function* () {
197
+ const response = yield this.connector.changeTransactionLineDeliveryMethod(uuid, lineUuid, method)
198
+ .catch((error) => {
199
+ // todo: do something with the error
200
+ return false;
201
+ });
202
+ if (response) {
203
+ const success = yield this.handleLineOperationStatuses(response);
204
+ this._rememberCurrentTransaction(response);
205
+ return success;
206
+ }
207
+ return false;
208
+ });
209
+ }
210
+ updateDiscountTransactionLine(uuid, lineUuid, type, discount, reason = "", code = "") {
211
+ return __awaiter(this, void 0, void 0, function* () {
212
+ const response = yield this.connector.changeTransactionLineLineDiscount(uuid, lineUuid, type, discount, reason, code)
213
+ .catch((error) => {
214
+ // todo: do something with the error
215
+ return false;
216
+ });
217
+ if (response) {
218
+ const success = yield this.handleLineOperationStatuses(response);
219
+ this._rememberCurrentTransaction(response);
220
+ return success;
221
+ }
222
+ return false;
223
+ });
224
+ }
71
225
  getArticleFullObject(goodId) {
72
226
  return __awaiter(this, void 0, void 0, function* () {
73
227
  return yield this.connector.getArticleFullObject(goodId);
@@ -96,6 +250,16 @@ export class TransactionService extends PendingReasonService {
96
250
  return this.connector.getRelationNumber(relationId);
97
251
  });
98
252
  }
253
+ getPriceLists() {
254
+ return __awaiter(this, void 0, void 0, function* () {
255
+ return this.connector.getPriceLists();
256
+ });
257
+ }
258
+ getVatLists() {
259
+ return __awaiter(this, void 0, void 0, function* () {
260
+ return this.connector.getVatList();
261
+ });
262
+ }
99
263
  saveRelation() {
100
264
  return __awaiter(this, void 0, void 0, function* () {
101
265
  // this._cleanRelationBeforeSave();
@@ -160,15 +324,16 @@ export class TransactionService extends PendingReasonService {
160
324
  getTransactionById(transactionId) {
161
325
  return new Promise((resolve, reject) => {
162
326
  this.connector.getTransactionById(transactionId)
163
- .then((response) => __awaiter(this, void 0, void 0, function* () {
327
+ .then((response) => {
164
328
  if (response.isSuccess) {
329
+ this._rememberCurrentTransaction(response);
165
330
  this.transactionUpdated.next(response);
166
331
  resolve(true);
167
332
  }
168
333
  else {
169
334
  reject(false);
170
335
  }
171
- }))
336
+ })
172
337
  .catch((reason) => {
173
338
  reject(false);
174
339
  });
@@ -294,14 +459,25 @@ export class TransactionService extends PendingReasonService {
294
459
  }
295
460
  getArticleImageByArticleNumber(articleNumber) {
296
461
  return __awaiter(this, void 0, void 0, function* () {
297
- const goodId = yield this.connector.getGoodIdFromArticleNr(articleNumber);
298
- return this.getArticleImageByGoodId(goodId);
462
+ if (this._imageCache.has(articleNumber)) {
463
+ return this._imageCache.get(articleNumber);
464
+ }
465
+ const goodId = yield this.connector.getGoodIdFromArticleNr(articleNumber).catch((error) => {
466
+ console.error(error);
467
+ return null;
468
+ });
469
+ const image = yield this.getArticleImageByGoodId(goodId);
470
+ this._imageCache.set(articleNumber, image);
471
+ return image;
299
472
  });
300
473
  }
301
474
  getArticleImageByGoodId(goodId) {
302
475
  return __awaiter(this, void 0, void 0, function* () {
303
476
  if (!isNaN(goodId)) {
304
- return this.connector.getSingleImage(goodId, 1, true, true);
477
+ return this.connector.getSingleImage(goodId, 1, true, true).catch((error) => {
478
+ console.error(error);
479
+ return "";
480
+ });
305
481
  }
306
482
  else {
307
483
  return "";
@@ -340,7 +516,7 @@ export class TransactionService extends PendingReasonService {
340
516
  return new Promise((resolve, reject) => {
341
517
  this.connector.addTransactionLine(this.currentTransaction.transactionInfo.uuid, lineType, articleNo, amount, warehouseNo, commissionCode, isReturn, aboveLineNr, belowLineNr)
342
518
  .then((response) => __awaiter(this, void 0, void 0, function* () {
343
- this._rememberResponse(remember, response);
519
+ this._rememberCurrentTransaction(response);
344
520
  resolve(response);
345
521
  }), (error) => {
346
522
  reject(error);
@@ -357,7 +533,7 @@ export class TransactionService extends PendingReasonService {
357
533
  return new Promise((resolve, reject) => {
358
534
  this.connector.addTextLineToTransaction(this.currentTransaction.transactionInfo.uuid, showOnDocuments, text, amount, articleBound, refArticleLineNr, aboveLineNr, belowLineNr)
359
535
  .then((response) => __awaiter(this, void 0, void 0, function* () {
360
- this._rememberResponse(remember, response);
536
+ this._rememberCurrentTransaction(response);
361
537
  resolve(response);
362
538
  }), (error) => {
363
539
  reject(error);
@@ -388,7 +564,7 @@ export class TransactionService extends PendingReasonService {
388
564
  return new Promise((resolve, reject) => {
389
565
  this.connector.changeLineSequence(this.currentTransaction.transactionInfo.uuid, lineUuid, aboveLineNr, belowLineNr)
390
566
  .then((response) => __awaiter(this, void 0, void 0, function* () {
391
- this._rememberResponse(remember, response);
567
+ this._rememberCurrentTransaction(response);
392
568
  resolve(response);
393
569
  }), (error) => {
394
570
  reject(error);
@@ -403,7 +579,7 @@ export class TransactionService extends PendingReasonService {
403
579
  return new Promise((resolve, reject) => {
404
580
  this.connector.deleteTransactionLine(transactionUuid, TransactionLineUuid)
405
581
  .then((response) => __awaiter(this, void 0, void 0, function* () {
406
- this._rememberResponse(remember, response);
582
+ this._rememberCurrentTransaction(response);
407
583
  if (response.isSuccess) {
408
584
  resolve(response);
409
585
  }
@@ -423,7 +599,7 @@ export class TransactionService extends PendingReasonService {
423
599
  this.connector.changeTransactionLineQuantity(this.currentTransaction.transactionInfo.uuid, lineUuid, newQuantity)
424
600
  .then((response) => __awaiter(this, void 0, void 0, function* () {
425
601
  if (response.isSuccess) {
426
- this._rememberResponse(remember, response);
602
+ this._rememberCurrentTransaction(response);
427
603
  }
428
604
  resolve(response);
429
605
  })).catch((reason) => {
@@ -493,24 +669,6 @@ export class TransactionService extends PendingReasonService {
493
669
  }
494
670
  });
495
671
  }
496
- _rememberCurrentTransactionLineStatus(value) {
497
- // this._currentLineOperationStatus.uuid = value.lineUuid;
498
- // this._currentLineOperationStatus.pendingReason = value.pendingReason;
499
- // this._currentLineOperationStatus.pendingReasonType = value.pendingReasonType;
500
- }
501
- // private async _updateRelation(): Promise<void> {
502
- // if (this.currentTransaction && this.currentTransaction.relation && this.currentTransaction.relation.relationId) {
503
- // if (!this._currentRelation || this._currentRelation.relationId !== this.currentTransaction.relation.relationId) {
504
- // this._currentRelation = await this.getCustomerFullObjectByRelationId(this.currentTransaction.relation.relationId);
505
- // }
506
- // }
507
- // }
508
- _rememberResponse(remember, response) {
509
- if (remember) {
510
- this._rememberCurrentTransaction(response);
511
- this._rememberCurrentTransactionLineStatus(response);
512
- }
513
- }
514
672
  }
515
673
  TransactionService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TransactionService_Factory() { return new TransactionService(i0.ɵɵinject(i1.DialogService), i0.ɵɵinject(i2.OptionsService), i0.ɵɵinject(i3.IOneConnectorAdapterService)); }, token: TransactionService, providedIn: "root" });
516
674
  TransactionService.decorators = [
@@ -518,4 +676,4 @@ TransactionService.decorators = [
518
676
  providedIn: "root"
519
677
  },] }
520
678
  ];
521
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RyYW5zYWN0aW9uL3NyYy9saWIvc2VydmljZS90cmFuc2FjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDBEQUEwRCxDQUFDO0FBRW5HLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyREFBMkQsQ0FBQztBQUcxRixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sd0RBQXdELENBQUM7QUFPcEYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sZ0VBQWdFLENBQUM7QUFRbkcsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sOERBQThELENBQUM7QUFHL0YsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVoQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdURBQXVELENBQUM7QUFFbEYsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7Ozs7O0FBTTlELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxvQkFBb0I7SUFFMUQscURBQXFEO0lBQ3JELCtCQUErQjtJQUMvQixJQUFJO0lBQ0osRUFBRTtJQUNGLDBEQUEwRDtJQUMxRCxnQ0FBZ0M7SUFDaEMsZ0dBQWdHO0lBQ2hHLElBQUk7SUFDSixFQUFFO0lBQ0Ysc0RBQXNEO0lBQ3RELGlDQUFpQztJQUNqQyxJQUFJO0lBQ0osRUFBRTtJQUNGLGlEQUFpRDtJQUNqRCxnQ0FBZ0M7SUFDaEMsSUFBSTtJQUNKLEVBQUU7SUFDRixrREFBa0Q7SUFDbEQsa0NBQWtDO0lBQ2xDLElBQUk7SUFDSixFQUFFO0lBQ0YscURBQXFEO0lBQ3JELHFDQUFxQztJQUNyQyxJQUFJO0lBQ0osRUFBRTtJQUNGLDJF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ZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7Q3VzdG9tZXJGdWxsT2JqZWN0fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2N1c3RvbWVyLWZ1bGwtb2JqZWN0LmJvXCI7XG5pbXBvcnQge05VTExfQ1VTVE9NRVJfRlVMTF9PQkpFQ1R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvbnVsLXJlbGF0aW9uLW9iamVjdFwiO1xuaW1wb3J0IHtUcmFuc2FjdGlvbkluZm9SZXNwb25zZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC90cmFuc2FjdGlvbi1pbmZvLXJlc3BvbnNlLmJvXCI7XG5pbXBvcnQge1RyYW5zYWN0aW9uS2luZH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL3RyYW5zYWN0aW9uLWtpbmQuZW51bVwiO1xuaW1wb3J0IHtNYXJrZXRpbmd9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvbWFya2V0aW5nLmJvXCI7XG5pbXBvcnQge1JlbGF0aW9uUHJpdmFjeVNldHRpbmd9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcmVsYXRpb24tcHJpdmFjeS1zZXR0aW5nLmJvXCI7XG5pbXBvcnQge1NlcXVlbmNlTmFtZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL3NlcXVlbmNlLW5hbWUuZW51bVwiO1xuaW1wb3J0IHtEZWxpdmVyeU1ldGhvZH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9kZWxpdmVyeS1tZXRob2QuYm9cIjtcbmltcG9ydCB7RGVsaXZlcnlPcHRpb259IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvZGVsaXZlcnktb3B0aW9uLmJvXCI7XG5pbXBvcnQge1JlbGF0aW9uTGlzdE9iamVjdH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9yZWxhdGlvbi1saXN0LW9iamVjdC5ib1wiO1xuaW1wb3J0IHtSZWxhdGlvblJlcXVlc3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcmVsYXRpb24tcmVxdWVzdFwiO1xuaW1wb3J0IHtDb3VudHJ5fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2NvdW50cnkuYm9cIjtcbmltcG9ydCB7VmFsaWRhdGlvblJlc3VsdH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC92YWxpZGF0aW9uLXJlc3VsdFwiO1xuaW1wb3J0IHtUcmFuc2FjdGlvbkxpbmVUeXBlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL2VudW0vdHJhbnNhY3Rpb24tbGluZS10eXBlLmVudW1cIjtcbmltcG9ydCB7Q29Eb21haW5WYWx1ZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9jby1kb21haW4tdmFsdWUuYm9cIjtcbmltcG9ydCB7VHJhbnNhY3Rpb25BcnRpY2xlV2FyZWhvdXNlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3RyYW5zYWN0aW9uLWFydGljbGUtd2FyZWhvdXNlLmJvXCI7XG5pbXBvcnQge0FydGljbGVGdWxsT2JqZWN0fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2FydGljbGUtZnVsbC1vYmplY3RcIjtcbmltcG9ydCB7TGluZU9wZXJhdGlvblN0YXR1c30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9saW5lLW9wZXJhdGlvbi1zdGF0dXMuYm9cIjtcbmltcG9ydCB7TGluZU9wZXJhdGlvblJlc3BvbnNlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2xpbmUtb3BlcmF0aW9uLXJlc3BvbnNlLmJvXCI7XG5pbXBvcnQge1RyYW5zYWN0aW9uTGluZUluZm99IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvdHJhbnNhY3Rpb24tbGluZS1pbmZvLmJvXCI7XG5pbXBvcnQge1RyYW5zYWN0aW9uUmVzcG9uc2VCYXNlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3RyYW5zYWN0aW9uLXJlc3BvbnNlLWJhc2UuYm9cIjtcbmltcG9ydCB7UGVuZGluZ1JlYXNvblR5cGV9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvZW51bS9wZW5kaW5nLXJlYXNvbi10eXBlLmVudW1cIjtcbmltcG9ydCB7U3RhbmRhcmRUZXh0fSBmcm9tIFwiLi4vbW9kZWwvc3RhbmRhcmQtdGV4dFwiO1xuaW1wb3J0IHtEYXRhU2VydmljZVJlc3BvbnNlRGF0YX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9kYXRhLXNlcnZpY2UtcmVzcG9uc2UtZGF0YVwiO1xuaW1wb3J0IHt0aHJvd0Vycm9yfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtBZGRyZXNzfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2FkZHJlc3MuYm9cIjtcbmltcG9ydCB7QWRkcmVzc1R5cGV9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvZW51bS9hZGRyZXNzLXR5cGUuZW51bVwiO1xuaW1wb3J0IHtSZWxhdGlvbkFueVR5cGV9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcmVsYXRpb24tYW55LXR5cGVcIjtcbmltcG9ydCB7UGVuZGluZ1JlYXNvblNlcnZpY2V9IGZyb20gXCIuL3BlbmRpbmctcmVhc29uLnNlcnZpY2VcIjtcbmltcG9ydCB7Q2FzaFJlZ2lzdGVyfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2Nhc2gtcmVnaXN0ZXJcIjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiBcInJvb3RcIlxufSlcbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvblNlcnZpY2UgZXh0ZW5kcyBQZW5kaW5nUmVhc29uU2VydmljZSB7XG5cbiAgLy8gcHVibGljIGdldCBjdXJyZW50TGluZXMoKTogVHJhbnNhY3Rpb25MaW5lSW5mb1tdIHtcbiAgLy8gICByZXR1cm4gdGhpcy5fY3VycmVudExpbmVzO1xuICAvLyB9XG4gIC8vXG4gIC8vIHB1YmxpYyBzZXQgY3VycmVudExpbmVzKHZhbHVlOiBUcmFuc2FjdGlvbkxpbmVJbmZvW10pIHtcbiAgLy8gICB0aGlzLl9jdXJyZW50TGluZXMgPSB2YWx1ZTtcbiAgLy8gICB0aGlzLmFydGljbGVBbW91bnQgPSBBcnJheVV0aWxzLkZpbmRBbGwodGhpcy5fY3VycmVudExpbmVzLCBsaW5lID0+IGxpbmUuaXNBcnRpY2xlKS5sZW5ndGg7XG4gIC8vIH1cbiAgLy9cbiAgLy8gcHVibGljIHNldCBjdXJyZW50VG90YWxzKHZhbHVlOiBUcmFuc2FjdGlvblRvdGFsKSB7XG4gIC8vICAgdGhpcy5fY3VycmVudFRvdGFscyA9IHZhbHVlO1xuICAvLyB9XG4gIC8vXG4gIC8vIHB1YmxpYyBnZXQgY3VycmVudFRvdGFscygpOiBUcmFuc2FjdGlvblRvdGFsIHtcbiAgLy8gICByZXR1cm4gdGhpcy5fY3VycmVudFRvdGFscztcbiAgLy8gfVxuICAvL1xuICAvLyBwdWJsaWMgZ2V0IGN1cnJlbnRSZWxhdGlvbigpOiBSZWxhdGlvbkFueVR5cGUge1xuICAvLyAgIHJldHVybiB0aGlzLl9jdXJyZW50UmVsYXRpb247XG4gIC8vIH1cbiAgLy9cbiAgLy8gcHVibGljIGdldCBjdXJyZW50VHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25JbmZvIHtcbiAgLy8gICByZXR1cm4gdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uO1xuICAvLyB9XG4gIC8vXG4gIC8vIHB1YmxpYyBzZXQgY3VycmVudExpbmVPcGVyYXRpb25TdGF0dXNlcyh2YWx1ZXM6IExpbmVPcGVyYXRpb25TdGF0dXNbXSkge1xuICAvLyAgIHRoaXMuX2N1cnJlbnRMaW5lT3BlcmF0aW9uU3RhdHVzZXMgPSB2YWx1ZXM7XG4gIC8vIH1cbiAgLy9cbiAgLy8gcHVibGljIGdldCBjdXJyZW50TGluZU9wZXJhdGlvblN0YXR1c2VzKCk6IExpbmVPcGVyYXRpb25TdGF0dXNbXSB7XG4gIC8vICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRMaW5lT3BlcmF0aW9uU3RhdHVzZXM7XG4gIC8vIH1cbiAgLy9cbiAgLy8gcHVibGljIHNldCBjdXJyZW50TGluZU9wZXJhdGlvblN0YXR1cyh2YWx1ZTogTGluZU9wZXJhdGlvblN0YXR1cykge1xuICAvLyAgIHRoaXMuX2N1cnJlbnRMaW5lT3BlcmF0aW9uU3RhdHVzID0gdmFsdWU7XG4gIC8vIH1cbiAgLy9cbiAgLy8gcHVibGljIGdldCBjdXJyZW50TGluZU9wZXJhdGlvblN0YXR1cygpOiBMaW5lT3BlcmF0aW9uU3RhdHVzIHwgdW5kZWZpbmVkIHtcbiAgLy8gICBjb25zdCBzdGF0dXM6IExpbmVPcGVyYXRpb25TdGF0dXMgPSB0aGlzLmN1cnJlbnRMaW5lT3BlcmF0aW9uU3RhdHVzZXMuZmluZChsaW5lID0+IGxpbmUucGVuZGluZ1JlYXNvblR5cGUgIT09IFBlbmRpbmdSZWFzb25UeXBlLk5PTkVcbiAgLy8gICAgICYmIGxpbmUucGVuZGluZ1JlYXNvblR5cGUgIT09IFBlbmRpbmdSZWFzb25UeXBlLk5PTl9DUklUSUNBTF9ESVNDT05USU5VQVRJT04pO1xuICAvLyAgIHJldHVybiBzdGF0dXM7XG4gIC8vIH1cbiAgLy9cbiAgLy8gcHVibGljIGFydGljbGVBbW91bnQ6IG51bWJlciA9IDA7XG5cbiAgLy8gcHJpdmF0ZSBfY3VycmVudExpbmVzOiBUcmFuc2FjdGlvbkxpbmVJbmZvW10gPSBbXTtcbiAgLy8gcHJpdmF0ZSBfY3VycmVudFRvdGFsczogVHJhbnNhY3Rpb25Ub3RhbCA9IG5ldyBUcmFuc2FjdGlvblRvdGFsKCk7XG4gIC8vIHByaXZhdGUgX2N1cnJlbnRSZWxhdGlvbjogUmVsYXRpb25BbnlUeXBlOyAvLyA9IE5VTExfUkVMQVRJT05fT0JKRUNUO1xuICAvLyBwcml2YXRlIF9jdXJyZW50VHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uSW5mbyA9IG5ldyBUcmFuc2FjdGlvbkluZm8oKTtcbiAgLy8gcHJpdmF0ZSBfY3VycmVudExpbmVPcGVyYXRpb25TdGF0dXM6IExpbmVPcGVyYXRpb25TdGF0dXMgPSBuZXcgTGluZU9wZXJhdGlvblN0YXR1cygpO1xuICAvLyBwcml2YXRlIF9jdXJyZW50TGluZU9wZXJhdGlvblN0YXR1c2VzOiBMaW5lT3BlcmF0aW9uU3RhdHVzW10gPSBbXTtcblxuICBwdWJsaWMgcGVuZGluZ0xpbmVPcGVyYXRpb25TdGF0dXMobGluZU9wZXJhdGlvblN0YXR1c2VzOiBMaW5lT3BlcmF0aW9uU3RhdHVzW10pOiBMaW5lT3BlcmF0aW9uU3RhdHVzIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzdGF0dXM6IExpbmVPcGVyYXRpb25TdGF0dXMgPSBsaW5lT3BlcmF0aW9uU3RhdHVzZXMuZmluZChsaW5lID0+IGxpbmUucGVuZGluZ1JlYXNvblR5cGUgIT09IFBlbmRpbmdSZWFzb25UeXBlLk5PTkVcbiAgICAgICYmIGxpbmUucGVuZGluZ1JlYXNvblR5cGUgIT09IFBlbmRpbmdSZWFzb25UeXBlLk5PTl9DUklUSUNBTF9ESVNDT05USU5VQVRJT04pO1xuICAgIHJldHVybiBzdGF0dXM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QXJ0aWNsZUZ1bGxPYmplY3QoZ29vZElkOiBudW1iZXIpOiBQcm9taXNlPEFydGljbGVGdWxsT2JqZWN0PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldEFydGljbGVGdWxsT2JqZWN0KGdvb2RJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9jdW1lbnRDb250ZW50KGlkOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXREb2N1bWVudENvbnRlbnQoaWQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEdvb2RJZEZyb21BcnRpY2xlTnIoc2t1OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRHb29kSWRGcm9tQXJ0aWNsZU5yKHNrdSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q291bnRyeShjb3VudHJ5Q29kZTogc3RyaW5nKTogUHJvbWlzZTxDb3VudHJ5PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldENvdW50cnkoY291bnRyeUNvZGUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENhc2hSZWdpc3RlcnMoKTogUHJvbWlzZTxDYXNoUmVnaXN0ZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRDYXNoUmVnaXN0ZXJzKHVuZGVmaW5lZCwgMSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0UmVsYXRpb25OdW1iZXIocmVsYXRpb25JZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0UmVsYXRpb25OdW1iZXIocmVsYXRpb25JZCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2F2ZVJlbGF0aW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIHRoaXMuX2NsZWFuUmVsYXRpb25CZWZvcmVTYXZlKCk7XG4gICAgaWYgKCF0aGlzLnJlbGF0aW9uLnJlbGF0aW9uSWQpIHtcbiAgICAgIHRoaXMucmVsYXRpb24gPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5pbnNlcnRDdXN0b21lcih0aGlzLnJlbGF0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWxhdGlvbiA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLnVwZGF0ZUN1c3RvbWVyKHRoaXMucmVsYXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hZGRSZWxhdGlvblRvVHJhbnNhY3Rpb24odGhpcy5yZWxhdGlvbi5yZWxhdGlvbklkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRTZXF1ZW5jZVZhbHVlKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldFNlcXVlbmNlVmFsdWUoU2VxdWVuY2VOYW1lLlJlbGF0aW9uSWQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFJlbGF0aW9uUHJpdmFjeVNldHRpbmdzKCk6IFByb21pc2U8UmVsYXRpb25Qcml2YWN5U2V0dGluZ1tdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldFJlbGF0aW9uUHJpdmFjeVNldHRpbmdzKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXJ0aWNsZUJvdW5kVGV4dExpbmVzT2ZBcnRpY2xlTGluZShhcnRpY2xlTGluZVV1aWQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25MaW5lSW5mb1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldEFydGljbGVCb3VuZFRleHRMaW5lc09mQXJ0aWNsZUxpbmUoYXJ0aWNsZUxpbmVVdWlkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVUcmFuc2FjdGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rvci5jcmVhdGVUcmFuc2FjdGlvbihUcmFuc2FjdGlvbktpbmQuU2FsZXNPcmRlciwgXCIxXCIpLnRoZW4oKHJlc3BvbnNlOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLl9yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSkuY2F0Y2goKHJlYXNvbjogVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgICByZWplY3QoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VHJhbnNhY3Rpb24odHJhbnNhY3Rpb25ObzogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMub3BlbkV4aXN0aW5nVHJhbnNhY3Rpb24oVHJhbnNhY3Rpb25LaW5kLlNhbGVzT3JkZXIsIHRyYW5zYWN0aW9uTm8pO1xuICB9XG5cbiAgcHVibGljIG9wZW5FeGlzdGluZ1RyYW5zYWN0aW9uKGtpbmQ6IFRyYW5zYWN0aW9uS2luZCwgdHJhbnNhY3Rpb25OcjogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0b3IuZ2V0VHJhbnNhY3Rpb25CeU5yQW5kS2luZChraW5kLCB0cmFuc2FjdGlvbk5yKVxuICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmlzU3VjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvblVwZGF0ZWQubmV4dChyZXNwb25zZSk7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChyZWFzb246IFZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICAgICByZWplY3QoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgcHVibGljIGdldFRyYW5zYWN0aW9uQnlJZCh0cmFuc2FjdGlvbklkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rvci5nZXRUcmFuc2FjdGlvbkJ5SWQodHJhbnNhY3Rpb25JZClcbiAgICAgICAgLnRoZW4oYXN5bmMgKHJlc3BvbnNlOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5pc1N1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25VcGRhdGVkLm5leHQocmVzcG9uc2UpO1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgocmVhc29uOiBWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY29tbWl0KCk6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuY29tbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2F2ZVRyYW5zYWN0aW9uKGNsb3NlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5jb25uZWN0b3Iuc2F2ZVRyYW5zYWN0aW9uKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby51dWlkKTtcbiAgICBpZiAocmVzcG9uc2UuaXNTdWNjZXNzKSB7XG4gICAgICB0aGlzLl9yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzYXZlVHJhbnNhY3Rpb25CeVV1aWQodHJhbnNhY3Rpb25VdWlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rvci5zYXZlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25VdWlkKVxuICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmlzU3VjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvblVwZGF0ZWQubmV4dChyZXNwb25zZSk7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChyZWFzb246IFZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAocmVhc29uKSB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd0Vycm9yKHJlYXNvbi5nZXRGdWxsRXJyb3JTdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlamVjdChmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZFJlbGF0aW9uVG9UcmFuc2FjdGlvbihyZWxhdGlvbklkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBhd2FpdCB0aGlzLl9jaGVja0FuZENyZWF0ZVRyYW5zYWN0aW9uKCk7XG4gICAgY29uc3QgcmVzdWx0OiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmFkZFJlbGF0aW9uVG9UcmFuc2FjdGlvbih0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udXVpZCwgcmVsYXRpb25JZCk7XG4gICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuX3JlbWVtYmVyQ3VycmVudFRyYW5zYWN0aW9uKHJlc3VsdCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRDb21taXNzaW9uQ29kZXMobGFuZ3VhZ2VDb2RlOiBzdHJpbmcpOiBQcm9taXNlPENvRG9tYWluVmFsdWVbXT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRDb21taXNzaW9uQ29kZXMobGFuZ3VhZ2VDb2RlKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRJbk91dENvbGxlY3Rpb24obGFuZ3VhZ2VDb2RlOiBzdHJpbmcpOiBQcm9taXNlPENvRG9tYWluVmFsdWVbXT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRJbk91dENvbGxlY3Rpb24obGFuZ3VhZ2VDb2RlKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRUcmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VzKGdvb2RJZDogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VbXT4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRUcmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VzKGdvb2RJZCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0TWFya2V0aW5nQ29kZXMoKTogUHJvbWlzZTxNYXJrZXRpbmdbXT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRNYXJrZXRpbmdDb2RlcygpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGluc2VydEN1c3RvbWVyKHJlbGF0aW9uOiBDdXN0b21lckZ1bGxPYmplY3QpOiBQcm9taXNlPEN1c3RvbWVyRnVsbE9iamVjdD4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5pbnNlcnRDdXN0b21lcihyZWxhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlQ3VzdG9tZXIocmVsYXRpb246IEN1c3RvbWVyRnVsbE9iamVjdCk6IFByb21pc2U8Q3VzdG9tZXJGdWxsT2JqZWN0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPEN1c3RvbWVyRnVsbE9iamVjdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0b3IudXBkYXRlQ3VzdG9tZXIocmVsYXRpb24pLnRoZW4oYXN5bmMoIHJlc3BvbnNlOiBDdXN0b21lckZ1bGxPYmplY3QpID0+IHtcbiAgICAgICAgLy8gdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnJlbGF0aW9uID0gcmVsYXRpb247XG4gICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgocmVzcG9uc2U6IEN1c3RvbWVyRnVsbE9iamVjdCkgPT4ge1xuICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERlbGl2ZXJ5TWV0aG9kcygpOiBQcm9taXNlPERlbGl2ZXJ5TWV0aG9kW10+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0RGVsaXZlcnlNZXRob2RzKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsaXZlcnlPcHRpb25zKCk6IFByb21pc2U8RGVsaXZlcnlPcHRpb25bXT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXREZWxpdmVyeU9wdGlvbnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXRUcmFuc2FjdGlvbkRlbGl2ZXJ5T3B0aW9ucygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBjb25zdCB0cmFuc2FjdGlvbkRlbGl2ZXJ5T3B0aW9uc1JlcXVlc3Q6IFNldFRyYW5zYWN0aW9uRGVsaXZlcnlPcHRpb25zUmVxdWVzdCA9IHRoaXMuX2dldFRyYW5zYWN0aW9uRGVsaXZlcnlPcHRpb25zKCk7XG4gICAgaWYgKCF0aGlzLmRlbGl2ZXJ5T3B0aW9ucy50cmFuc2FjdGlvblV1aWQpIHtcbiAgICAgIHRoaXMuZGVsaXZlcnlPcHRpb25zLnRyYW5zYWN0aW9uVXVpZCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby51dWlkO1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZTogVHJhbnNhY3Rpb25SZXNwb25zZUJhc2UgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5zZXRUcmFuc2FjdGlvbkRlbGl2ZXJ5T3B0aW9ucyh0aGlzLmRlbGl2ZXJ5T3B0aW9ucylcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UgJiYgcmVzcG9uc2UuaXNTdWNjZXNzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFJlbGF0aW9uTGlzdE9iamVjdHMocmVsYXRpb25SZXF1ZXN0OiBSZWxhdGlvblJlcXVlc3QpOiBQcm9taXNlPFJlbGF0aW9uTGlzdE9iamVjdFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldFJlbGF0aW9uTGlzdE9iamVjdHMocmVsYXRpb25SZXF1ZXN0KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZXRyaWV2ZUxpbmVJbWFnZShsaW5lOiBUcmFuc2FjdGlvbkxpbmVJbmZvKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRBcnRpY2xlSW1hZ2VCeUFydGljbGVOdW1iZXIobGluZS5hcnRpY2xlTnVtYmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBcnRpY2xlSW1hZ2VCeUFydGljbGVOdW1iZXIoYXJ0aWNsZU51bWJlcjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBnb29kSWQ6IG51bWJlciA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldEdvb2RJZEZyb21BcnRpY2xlTnIoYXJ0aWNsZU51bWJlcik7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXJ0aWNsZUltYWdlQnlHb29kSWQoZ29vZElkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBcnRpY2xlSW1hZ2VCeUdvb2RJZChnb29kSWQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc05hTihnb29kSWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0U2luZ2xlSW1hZ2UoZ29vZElkLCAxLCB0cnVlLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZEFydGljbGUoXG4gICAgYXJ0aWNsZU5vOiBzdHJpbmcsXG4gICAgYW1vdW50OiBudW1iZXIgPSAxLFxuICAgIHdhcmVob3VzZU5vOiBudW1iZXIgPSAxLFxuICAgIGNvbW1pc3Npb25Db2RlOiBzdHJpbmcgPSBcIjJcIixcbiAgICBpc1JldHVybjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGFib3ZlTGluZU5yOiBudW1iZXIgPSAwLFxuICAgIGJlbG93TGluZU5yOiBudW1iZXIgPSAwXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGF3YWl0IHRoaXMuX2NoZWNrQW5kQ3JlYXRlVHJhbnNhY3Rpb24oKTtcbiAgICBjb25zdCByZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5hZGRUcmFuc2FjdGlvbkxpbmUoXG4gICAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udXVpZCwgVHJhbnNhY3Rpb25MaW5lVHlwZS5BcnRpY2xlTGluZSwgYXJ0aWNsZU5vLCBhbW91bnQsIHdhcmVob3VzZU5vLCBjb21taXNzaW9uQ29kZSwgaXNSZXR1cm4sIGFib3ZlTGluZU5yLCBiZWxvd0xpbmVOcik7XG4gICAgaWYgKGF3YWl0IHRoaXMuaGFuZGxlTGluZU9wZXJhdGlvblN0YXR1c2VzKHJlc3BvbnNlKSkge1xuICAgICAgdGhpcy5fcmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHB1YmxpYyBhc3luYyBhZGRBcnRpY2xlVG9UcmFuc2FjdGlvbih0cmFuc2FjdGlvblV1aWQ6IHN0cmluZywgYXJ0aWNsZU5vOiBzdHJpbmcsIGFtb3VudDogbnVtYmVyID0gMSwgd2FyZWhvdXNlTm86IG51bWJlciA9IDEsIGNvbW1pc3Npb25Db2RlOiBzdHJpbmcgPSBcIjJcIiwgaXNSZXR1cm46IGJvb2xlYW4gPSBmYWxzZSwgYWJvdmVMaW5lTnI6IG51bWJlciA9IDAsIGJlbG93TGluZU5yOiBudW1iZXIgPSAwKTogUHJvbWlzZTxMaW5lT3BlcmF0aW9uUmVzcG9uc2U+IHtcbiAgLy8gICBhd2FpdCB0aGlzLl9jaGVja0FuZENyZWF0ZVRyYW5zYWN0aW9uKCk7XG4gIC8vICAgcmV0dXJuIG5ldyBQcm9taXNlPExpbmVPcGVyYXRpb25SZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAvLyAgICAgdGhpcy5jb25uZWN0b3IuYWRkVHJhbnNhY3Rpb25MaW5lKHRyYW5zYWN0aW9uVXVpZCwgVHJhbnNhY3Rpb25MaW5lVHlwZS5BcnRpY2xlTGluZSwgYXJ0aWNsZU5vLCBhbW91bnQsIHdhcmVob3VzZU5vLCBjb21taXNzaW9uQ29kZSwgaXNSZXR1cm4sIGFib3ZlTGluZU5yLCBiZWxvd0xpbmVOcilcbiAgLy8gICAgICAgLnRoZW4oYXN5bmMoIHJlc3BvbnNlOiBMaW5lT3BlcmF0aW9uUmVzcG9uc2UpID0+IHtcbiAgLy8gICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgLy8gICAgICAgfSwgKGVycm9yKSA9PiB7XG4gIC8vICAgICAgICAgdGhpcy5fcHJvbXB0LnNob3dFcnJvcihlcnJvcik7XG4gIC8vICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgLy8gICAgICAgfSlcbiAgLy8gICAgICAgLmNhdGNoKChyZWFzb246IFZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgLy8gICAgICAgICB0aGlzLl9wcm9tcHQuc2hvd0Vycm9yKHJlYXNvbi5nZXRGdWxsRXJyb3JTdHJpbmcoKSk7XG4gIC8vICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgLy8gICAgICAgfSk7XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkVHJhbnNhY3Rpb25MaW5lKGxpbmVUeXBlOiBUcmFuc2FjdGlvbkxpbmVUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGljbGVObzogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcmVob3VzZU5vPzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pc3Npb25Db2RlPzogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmV0dXJuPzogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZUxpbmVOcj86IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvd0xpbmVOcj86IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1lbWJlcjogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPExpbmVPcGVyYXRpb25SZXNwb25zZT4ge1xuICAgIGF3YWl0IHRoaXMuX2NoZWNrQW5kQ3JlYXRlVHJhbnNhY3Rpb24oKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8TGluZU9wZXJhdGlvblJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rvci5hZGRUcmFuc2FjdGlvbkxpbmUodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnV1aWQsIGxpbmVUeXBlLCBhcnRpY2xlTm8sIGFtb3VudCwgd2FyZWhvdXNlTm8sIGNvbW1pc3Npb25Db2RlLCBpc1JldHVybiwgYWJvdmVMaW5lTnIsIGJlbG93TGluZU5yKVxuICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2U6IExpbmVPcGVyYXRpb25SZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuX3JlbWVtYmVyUmVzcG9uc2UocmVtZW1iZXIsIHJlc3BvbnNlKTtcbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKHJlYXNvbjogVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGRUZXh0TGluZShcbiAgICAgICAgICAgICAgICBzaG93T25Eb2N1bWVudHM6IG51bWJlcixcbiAgICAgICAgICAgICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgYW1vdW50OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgYXJ0aWNsZUJvdW5kOiBib29sZWFuLFxuICAgICAgICAgICAgICAgIHJlZkFydGljbGVMaW5lTnI6IG51bWJlcixcbiAgICAgICAgICAgICAgICBhYm92ZUxpbmVOcj86IG51bWJlcixcbiAgICAgICAgICAgICAgICBiZWxvd0xpbmVOcj86IG51bWJlcixcbiAgICAgICAgICAgICAgICByZW1lbWJlcjogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPExpbmVPcGVyYXRpb25SZXNwb25zZT4ge1xuICAgIGF3YWl0IHRoaXMuX2NoZWNrQW5kQ3JlYXRlVHJhbnNhY3Rpb24oKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8TGluZU9wZXJhdGlvblJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rvci5hZGRUZXh0TGluZVRvVHJhbnNhY3Rpb24odGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnV1aWQsIHNob3dPbkRvY3VtZW50cywgdGV4dCwgYW1vdW50LCBhcnRpY2xlQm91bmQsIHJlZkFydGljbGVMaW5lTnIsIGFib3ZlTGluZU5yLCBiZWxvd0xpbmVOcilcbiAgICAgICAgLnRoZW4oYXN5bmMgKHJlc3BvbnNlOiBMaW5lT3BlcmF0aW9uUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZW1lbWJlclJlc3BvbnNlKHJlbWVtYmVyLCByZXNwb25zZSk7XG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgocmVhc29uOiBWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkVGV4dExpbmVUb1RyYW5zYWN0aW9uKFxuICAgIHRyYW5zYWN0aW9uVXVpZDogc3RyaW5nLFxuICAgIHNob3dPbkRvY3VtZW50czogbnVtYmVyLFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBhbW91bnQ6IG51bWJlcixcbiAgICBhcnRpY2xlQm91bmQ6IGJvb2xlYW4sXG4gICAgcmVmQXJ0aWNsZUxpbmVOcjogbnVtYmVyLFxuICAgIGFib3ZlTGluZU5yPzogbnVtYmVyLFxuICAgIGJlbG93TGluZU5yPzogbnVtYmVyKTogUHJvbWlzZTxMaW5lT3BlcmF0aW9uUmVzcG9uc2U+IHtcbiAgICBhd2FpdCB0aGlzLl9jaGVja0FuZENyZWF0ZVRyYW5zYWN0aW9uKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPExpbmVPcGVyYXRpb25SZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0b3IuYWRkVGV4dExpbmVUb1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uVXVpZCwgc2hvd09uRG9jdW1lbnRzLCB0ZXh0LCBhbW91bnQsIGFydGljbGVCb3VuZCwgcmVmQXJ0aWNsZUxpbmVOciwgYWJvdmVMaW5lTnIsIGJlbG93TGluZU5yKVxuICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2U6IExpbmVPcGVyYXRpb25SZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKHJlYXNvbjogVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZUxpbmVTZXF1ZW5jZShcbiAgICBsaW5lVXVpZDogc3RyaW5nLFxuICAgIGFib3ZlTGluZU5yPzogbnVtYmVyLFxuICAgIGJlbG93TGluZU5yPzogbnVtYmVyLFxuICAgIHJlbWVtYmVyOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8TGluZU9wZXJhdGlvblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPExpbmVPcGVyYXRpb25SZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0b3IuY2hhbmdlTGluZVNlcXVlbmNlKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby51dWlkLCBsaW5lVXVpZCwgYWJvdmVMaW5lTnIsIGJlbG93TGluZU5yKVxuICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2U6IExpbmVPcGVyYXRpb25SZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuX3JlbWVtYmVyUmVzcG9uc2UocmVtZW1iZXIsIHJlc3BvbnNlKTtcbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChyZWFzb246IFZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWxldGVUcmFuc2FjdGlvbkxpbmUodHJhbnNhY3Rpb25VdWlkOiBzdHJpbmcsIFRyYW5zYWN0aW9uTGluZVV1aWQ6IHN0cmluZywgcmVtZW1iZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxMaW5lT3BlcmF0aW9uUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8TGluZU9wZXJhdGlvblJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rvci5kZWxldGVUcmFuc2FjdGlvbkxpbmUodHJhbnNhY3Rpb25VdWlkLCBUcmFuc2FjdGlvbkxpbmVVdWlkKVxuICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2U6IExpbmVPcGVyYXRpb25SZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuX3JlbWVtYmVyUmVzcG9uc2UocmVtZW1iZXIsIHJlc3BvbnNlKTtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuaXNTdWNjZXNzKSB7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgocmVhc29uOiBWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2hhbmdlVHJhbnNhY3Rpb25MaW5lUXVhbnRpdHkobGluZVV1aWQ6IHN0cmluZywgbmV3UXVhbnRpdHk6IG51bWJlciwgcmVtZW1iZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxMaW5lT3BlcmF0aW9uUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8TGluZU9wZXJhdGlvblJlc3BvbnNlPigocmVzb2x2ZTogRnVuY3Rpb24pID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdG9yLmNoYW5nZVRyYW5zYWN0aW9uTGluZVF1YW50aXR5KHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby51dWlkLCBsaW5lVXVpZCwgbmV3UXVhbnRpdHkpXG4gICAgICAgIC50aGVuKGFzeW5jIChyZXNwb25zZTogTGluZU9wZXJhdGlvblJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmlzU3VjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy5fcmVtZW1iZXJSZXNwb25zZShyZW1lbWJlciwgcmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbjogVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXRSZWxhdGlvbkJ5VXNlcih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlOiBGdW5jdGlvbikgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0b3Iuc2V0UmVsYXRpb25CeVVzZXIodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnV1aWQsIHVzZXJuYW1lLCBwYXNzd29yZClcbiAgICAgICAgLnRoZW4oYXN5bmMgKGlzU3VjY2VzczogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHJlc29sdmUoaXNTdWNjZXNzKTtcbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbjogVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEN1c3RvbWVyRnVsbE9iamVjdEJ5UmVsYXRpb25JZChyZWxhdGlvbklkOiBudW1iZXIpOiBQcm9taXNlPEN1c3RvbWVyRnVsbE9iamVjdD4ge1xuICAgIGNvbnN0IHJlbGF0aW9uTnI6IHN0cmluZyA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldFJlbGF0aW9uTnVtYmVyKHJlbGF0aW9uSWQpO1xuICAgIGlmIChyZWxhdGlvbk5yKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0Q3VzdG9tZXJGdWxsT2JqZWN0KE51bWJlcihyZWxhdGlvbk5yKSk7XG4gICAgfVxuICAgIHJldHVybiBOVUxMX0NVU1RPTUVSX0ZVTExfT0JKRUNUO1xuICB9XG5cbiAgLy8gcHVibGljIGFzeW5jIHNldFJlbGF0aW9uQnlVc2VyKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gICBjb25zdCByZXNwb25zZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLnNldFJlbGF0aW9uQnlVc2VyKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnV1aWQsIHVzZXJuYW1lLCBwYXNzd29yZCk7XG4gIC8vICAgcmV0dXJuIHJlc3BvbnNlO1xuICAvLyB9XG5cbiAgcHVibGljIGFzeW5jIGdldFRleHRUeXBlcyhsYW5ndWFnZUNvZGU6IHN0cmluZyk6IFByb21pc2U8Q29Eb21haW5WYWx1ZVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldFRleHRUeXBlcyhsYW5ndWFnZUNvZGUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFN0YW5kYXJkVGV4dHMobGFuZ3VhZ2VDb2RlOiBzdHJpbmcpOiBQcm9taXNlPFN0YW5kYXJkVGV4dFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldFN0YW5kYXJkVGV4dHMobGFuZ3VhZ2VDb2RlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaXJzdEFkZHJlc3MocmVsYXRpb246IFJlbGF0aW9uQW55VHlwZSk6IEFkZHJlc3Mge1xuICAgIGlmICghcmVsYXRpb24gfHwgIXJlbGF0aW9uLmFkZHJlc3Nlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVsYXRpb24uZ2V0Rmlyc3RBdmFpbGFibGVBZGRyZXNzKFtcbiAgICAgIEFkZHJlc3NUeXBlLkRlbGl2ZXJ5QWRkcmVzcyxcbiAgICAgIEFkZHJlc3NUeXBlLkJpbGxpbmdBZGRyZXNzLFxuICAgICAgQWRkcmVzc1R5cGUuVmlzaXRpbmdBZGRyZXNzLFxuICAgICAgQWRkcmVzc1R5cGUuTWFpbGluZ0FkZHJlc3MsXG4gICAgICBBZGRyZXNzVHlwZS5OdXJzaW5nQWRkcmVzc1xuICAgIF0pO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBfY2xlYW5SZWxhdGlvbkJlZm9yZVNhdmUoKTogdm9pZCB7XG4gIC8vICAgQXJyYXlVdGlscy5SZW1vdmVFbGVtZW50c0J5RmlsdGVyKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5yZWxhdGlvbi5jb250YWN0T3B0aW9ucywgKChpdGVtOiBDb250YWN0T3B0aW9uKSA9PiB7XG4gIC8vICAgICByZXR1cm4gaXNOaWxsKGl0ZW0udmFsdWUpO1xuICAvLyAgIH0pKTtcbiAgLy8gfVxuXG4gIHByaXZhdGUgYXN5bmMgX2NoZWNrQW5kQ3JlYXRlVHJhbnNhY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiB8fCAhdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvIHx8ICF0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udHJhbnNhY3Rpb25Ocikge1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uKCkpIHtcbiAgICAgICAgdGhyb3dFcnJvcihcIkZhaWxlZCB0byBjcmVhdGUgdHJhbnNhY3Rpb25cIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb25MaW5lU3RhdHVzKHZhbHVlOiBMaW5lT3BlcmF0aW9uUmVzcG9uc2UpOiB2b2lkIHtcbiAgICAvLyB0aGlzLl9jdXJyZW50TGluZU9wZXJhdGlvblN0YXR1cy51dWlkID0gdmFsdWUubGluZVV1aWQ7XG4gICAgLy8gdGhpcy5fY3VycmVudExpbmVPcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvbiA9IHZhbHVlLnBlbmRpbmdSZWFzb247XG4gICAgLy8gdGhpcy5fY3VycmVudExpbmVPcGVyYXRpb25TdGF0dXMucGVuZGluZ1JlYXNvblR5cGUgPSB2YWx1ZS5wZW5kaW5nUmVhc29uVHlwZTtcbiAgfVxuXG4gIC8vIHByaXZhdGUgYXN5bmMgX3VwZGF0ZVJlbGF0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAvLyAgIGlmICh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiAmJiB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi5yZWxhdGlvbiAmJiB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi5yZWxhdGlvbi5yZWxhdGlvbklkKSB7XG4gIC8vICAgICBpZiAoIXRoaXMuX2N1cnJlbnRSZWxhdGlvbiB8fCB0aGlzLl9jdXJyZW50UmVsYXRpb24ucmVsYXRpb25JZCAhPT0gdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24ucmVsYXRpb24ucmVsYXRpb25JZCkge1xuICAvLyAgICAgICB0aGlzLl9jdXJyZW50UmVsYXRpb24gPSBhd2FpdCB0aGlzLmdldEN1c3RvbWVyRnVsbE9iamVjdEJ5UmVsYXRpb25JZCh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi5yZWxhdGlvbi5yZWxhdGlvbklkKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vIH1cblxuICBwcml2YXRlIF9yZW1lbWJlclJlc3BvbnNlKHJlbWVtYmVyOiBib29sZWFuLCByZXNwb25zZTogTGluZU9wZXJhdGlvblJlc3BvbnNlKTogdm9pZCB7XG4gICAgaWYgKHJlbWVtYmVyKSB7XG4gICAgICB0aGlzLl9yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XG4gICAgICB0aGlzLl9yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbkxpbmVTdGF0dXMocmVzcG9uc2UpO1xuICAgIH1cbiAgfVxuXG59XG4iXX0=
679
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RyYW5zYWN0aW9uL3NyYy9saWIvc2VydmljZS90cmFuc2FjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDBEQUEwRCxDQUFDO0FBRW5HLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyREFBMkQsQ0FBQztBQUcxRixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sd0RBQXdELENBQUM7QUFPcEYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sZ0VBQWdFLENBQUM7QUFPbkcsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sOERBQThELENBQUM7QUFHL0YsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVoQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdURBQXVELENBQUM7QUFFbEYsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7Ozs7O0FBUzlELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxvQkFBb0I7SUFINUQ7O1FBS1UsZ0JBQVcsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztLQTBvQnREO0lBeG9CQyxxREFBcUQ7SUFDckQsK0JBQStCO0lBQy9CLElBQUk7SUFDSixFQUFFO0lBQ0YsMERBQTBEO0lBQzFELGdDQUFnQztJQUNoQyxnR0FBZ0c7SUFDaEcsSUFBSTtJQUNKLEVBQUU7SUFDRixzREFBc0Q7SUFDdEQsaUNBQWlDO0lBQ2pDLElBQUk7SUFDSixFQUFFO0lBQ0YsaURBQWlEO0lBQ2pELGdDQUFnQztJQUNoQyxJQUFJO0lBQ0osRUFBRTtJQUNGLGtEQUFrRDtJQUNsRCxrQ0FBa0M7SUFDbEMsSUFBSTtJQUNKLEVBQUU7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QUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7Q3VzdG9tZXJGdWxsT2JqZWN0fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2N1c3RvbWVyLWZ1bGwtb2JqZWN0LmJvXCI7XG5pbXBvcnQge05VTExfQ1VTVE9NRVJfRlVMTF9PQkpFQ1R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvbnVsLXJlbGF0aW9uLW9iamVjdFwiO1xuaW1wb3J0IHtUcmFuc2FjdGlvbkluZm9SZXNwb25zZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC90cmFuc2FjdGlvbi1pbmZvLXJlc3BvbnNlLmJvXCI7XG5pbXBvcnQge1RyYW5zYWN0aW9uS2luZH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL3RyYW5zYWN0aW9uLWtpbmQuZW51bVwiO1xuaW1wb3J0IHtNYXJrZXRpbmd9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvbWFya2V0aW5nLmJvXCI7XG5pbXBvcnQge1JlbGF0aW9uUHJpdmFjeVNldHRpbmd9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcmVsYXRpb24tcHJpdmFjeS1zZXR0aW5nLmJvXCI7XG5pbXBvcnQge1NlcXVlbmNlTmFtZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL3NlcXVlbmNlLW5hbWUuZW51bVwiO1xuaW1wb3J0IHtEZWxpdmVyeU1ldGhvZH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9kZWxpdmVyeS1tZXRob2QuYm9cIjtcbmltcG9ydCB7RGVsaXZlcnlPcHRpb259IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvZGVsaXZlcnktb3B0aW9uLmJvXCI7XG5pbXBvcnQge1JlbGF0aW9uTGlzdE9iamVjdH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9yZWxhdGlvbi1saXN0LW9iamVjdC5ib1wiO1xuaW1wb3J0IHtSZWxhdGlvblJlcXVlc3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcmVsYXRpb24tcmVxdWVzdFwiO1xuaW1wb3J0IHtDb3VudHJ5fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2NvdW50cnkuYm9cIjtcbmltcG9ydCB7VmFsaWRhdGlvblJlc3VsdH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC92YWxpZGF0aW9uLXJlc3VsdFwiO1xuaW1wb3J0IHtUcmFuc2FjdGlvbkxpbmVUeXBlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL2VudW0vdHJhbnNhY3Rpb24tbGluZS10eXBlLmVudW1cIjtcbmltcG9ydCB7Q29Eb21haW5WYWx1ZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9jby1kb21haW4tdmFsdWUuYm9cIjtcbmltcG9ydCB7VHJhbnNhY3Rpb25BcnRpY2xlV2FyZWhvdXNlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3RyYW5zYWN0aW9uLWFydGljbGUtd2FyZWhvdXNlLmJvXCI7XG5pbXBvcnQge0FydGljbGVGdWxsT2JqZWN0fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2FydGljbGUtZnVsbC1vYmplY3RcIjtcbmltcG9ydCB7TGluZU9wZXJhdGlvblN0YXR1c30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9saW5lLW9wZXJhdGlvbi1zdGF0dXMuYm9cIjtcbmltcG9ydCB7VHJhbnNhY3Rpb25MaW5lSW5mb30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC90cmFuc2FjdGlvbi1saW5lLWluZm8uYm9cIjtcbmltcG9ydCB7VHJhbnNhY3Rpb25SZXNwb25zZUJhc2V9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvdHJhbnNhY3Rpb24tcmVzcG9uc2UtYmFzZS5ib1wiO1xuaW1wb3J0IHtQZW5kaW5nUmVhc29uVHlwZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL3BlbmRpbmctcmVhc29uLXR5cGUuZW51bVwiO1xuaW1wb3J0IHtTdGFuZGFyZFRleHR9IGZyb20gXCIuLi9tb2RlbC9zdGFuZGFyZC10ZXh0XCI7XG5pbXBvcnQge0RhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2RhdGEtc2VydmljZS1yZXNwb25zZS1kYXRhXCI7XG5pbXBvcnQge3Rocm93RXJyb3J9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge0FkZHJlc3N9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvYWRkcmVzcy5ib1wiO1xuaW1wb3J0IHtBZGRyZXNzVHlwZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL2FkZHJlc3MtdHlwZS5lbnVtXCI7XG5pbXBvcnQge1JlbGF0aW9uQW55VHlwZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9yZWxhdGlvbi1hbnktdHlwZVwiO1xuaW1wb3J0IHtQZW5kaW5nUmVhc29uU2VydmljZX0gZnJvbSBcIi4vcGVuZGluZy1yZWFzb24uc2VydmljZVwiO1xuaW1wb3J0IHtDYXNoUmVnaXN0ZXJ9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvY2FzaC1yZWdpc3RlclwiO1xuaW1wb3J0IHtQcmljZUxpc3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcHJpY2UtbGlzdFwiO1xuaW1wb3J0IHtWYXR9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvdmF0XCI7XG5pbXBvcnQge0Rpc2NvdW50VHlwZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL2Rpc2NvdW50LXR5cGUuZW51bVwiO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiXG59KVxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uU2VydmljZSBleHRlbmRzIFBlbmRpbmdSZWFzb25TZXJ2aWNlIHtcblxuICBwcml2YXRlIF9pbWFnZUNhY2hlOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuXG4gIC8vIHB1YmxpYyBnZXQgY3VycmVudExpbmVzKCk6IFRyYW5zYWN0aW9uTGluZUluZm9bXSB7XG4gIC8vICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRMaW5lcztcbiAgLy8gfVxuICAvL1xuICAvLyBwdWJsaWMgc2V0IGN1cnJlbnRMaW5lcyh2YWx1ZTogVHJhbnNhY3Rpb25MaW5lSW5mb1tdKSB7XG4gIC8vICAgdGhpcy5fY3VycmVudExpbmVzID0gdmFsdWU7XG4gIC8vICAgdGhpcy5hcnRpY2xlQW1vdW50ID0gQXJyYXlVdGlscy5GaW5kQWxsKHRoaXMuX2N1cnJlbnRMaW5lcywgbGluZSA9PiBsaW5lLmlzQXJ0aWNsZSkubGVuZ3RoO1xuICAvLyB9XG4gIC8vXG4gIC8vIHB1YmxpYyBzZXQgY3VycmVudFRvdGFscyh2YWx1ZTogVHJhbnNhY3Rpb25Ub3RhbCkge1xuICAvLyAgIHRoaXMuX2N1cnJlbnRUb3RhbHMgPSB2YWx1ZTtcbiAgLy8gfVxuICAvL1xuICAvLyBwdWJsaWMgZ2V0IGN1cnJlbnRUb3RhbHMoKTogVHJhbnNhY3Rpb25Ub3RhbCB7XG4gIC8vICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRUb3RhbHM7XG4gIC8vIH1cbiAgLy9cbiAgLy8gcHVibGljIGdldCBjdXJyZW50UmVsYXRpb24oKTogUmVsYXRpb25BbnlUeXBlIHtcbiAgLy8gICByZXR1cm4gdGhpcy5fY3VycmVudFJlbGF0aW9uO1xuICAvLyB9XG4gIC8vXG4gIC8vIHB1YmxpYyBnZXQgY3VycmVudFRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uSW5mbyB7XG4gIC8vICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbjtcbiAgLy8gfVxuICAvL1xuICAvLyBwdWJsaWMgc2V0IGN1cnJlbnRMaW5lT3BlcmF0aW9uU3RhdHVzZXModmFsdWVzOiBMaW5lT3BlcmF0aW9uU3RhdHVzW10pIHtcbiAgLy8gICB0aGlzLl9jdXJyZW50TGluZU9wZXJhdGlvblN0YXR1c2VzID0gdmFsdWVzO1xuICAvLyB9XG4gIC8vXG4gIC8vIHB1YmxpYyBnZXQgY3VycmVudExpbmVPcGVyYXRpb25TdGF0dXNlcygpOiBMaW5lT3BlcmF0aW9uU3RhdHVzW10ge1xuICAvLyAgIHJldHVybiB0aGlzLl9jdXJyZW50TGluZU9wZXJhdGlvblN0YXR1c2VzO1xuICAvLyB9XG4gIC8vXG4gIC8vIHB1YmxpYyBzZXQgY3VycmVudExpbmVPcGVyYXRpb25TdGF0dXModmFsdWU6IExpbmVPcGVyYXRpb25TdGF0dXMpIHtcbiAgLy8gICB0aGlzLl9jdXJyZW50TGluZU9wZXJhdGlvblN0YXR1cyA9IHZhbHVlO1xuICAvLyB9XG4gIC8vXG4gIC8vIHB1YmxpYyBnZXQgY3VycmVudExpbmVPcGVyYXRpb25TdGF0dXMoKTogTGluZU9wZXJhdGlvblN0YXR1cyB8IHVuZGVmaW5lZCB7XG4gIC8vICAgY29uc3Qgc3RhdHVzOiBMaW5lT3BlcmF0aW9uU3RhdHVzID0gdGhpcy5jdXJyZW50TGluZU9wZXJhdGlvblN0YXR1c2VzLmZpbmQobGluZSA9PiBsaW5lLnBlbmRpbmdSZWFzb25UeXBlICE9PSBQZW5kaW5nUmVhc29uVHlwZS5OT05FXG4gIC8vICAgICAmJiBsaW5lLnBlbmRpbmdSZWFzb25UeXBlICE9PSBQZW5kaW5nUmVhc29uVHlwZS5OT05fQ1JJVElDQUxfRElTQ09OVElOVUFUSU9OKTtcbiAgLy8gICByZXR1cm4gc3RhdHVzO1xuICAvLyB9XG4gIC8vXG4gIC8vIHB1YmxpYyBhcnRpY2xlQW1vdW50OiBudW1iZXIgPSAwO1xuXG4gIC8vIHByaXZhdGUgX2N1cnJlbnRMaW5lczogVHJhbnNhY3Rpb25MaW5lSW5mb1tdID0gW107XG4gIC8vIHByaXZhdGUgX2N1cnJlbnRUb3RhbHM6IFRyYW5zYWN0aW9uVG90YWwgPSBuZXcgVHJhbnNhY3Rpb25Ub3RhbCgpO1xuICAvLyBwcml2YXRlIF9jdXJyZW50UmVsYXRpb246IFJlbGF0aW9uQW55VHlwZTsgLy8gPSBOVUxMX1JFTEFUSU9OX09CSkVDVDtcbiAgLy8gcHJpdmF0ZSBfY3VycmVudFRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkluZm8gPSBuZXcgVHJhbnNhY3Rpb25JbmZvKCk7XG4gIC8vIHByaXZhdGUgX2N1cnJlbnRMaW5lT3BlcmF0aW9uU3RhdHVzOiBMaW5lT3BlcmF0aW9uU3RhdHVzID0gbmV3IExpbmVPcGVyYXRpb25TdGF0dXMoKTtcbiAgLy8gcHJpdmF0ZSBfY3VycmVudExpbmVPcGVyYXRpb25TdGF0dXNlczogTGluZU9wZXJhdGlvblN0YXR1c1tdID0gW107XG5cbiAgcHVibGljIHBlbmRpbmdMaW5lT3BlcmF0aW9uU3RhdHVzKGxpbmVPcGVyYXRpb25TdGF0dXNlczogTGluZU9wZXJhdGlvblN0YXR1c1tdKTogTGluZU9wZXJhdGlvblN0YXR1cyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3RhdHVzOiBMaW5lT3BlcmF0aW9uU3RhdHVzID0gbGluZU9wZXJhdGlvblN0YXR1c2VzLmZpbmQobGluZSA9PiBsaW5lLnBlbmRpbmdSZWFzb25UeXBlICE9PSBQZW5kaW5nUmVhc29uVHlwZS5OT05FXG4gICAgICAmJiBsaW5lLnBlbmRpbmdSZWFzb25UeXBlICE9PSBQZW5kaW5nUmVhc29uVHlwZS5OT05fQ1JJVElDQUxfRElTQ09OVElOVUFUSU9OKTtcbiAgICByZXR1cm4gc3RhdHVzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwZGF0ZVByaWNlVHJhbnNhY3Rpb25MaW5lKHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZywgcHJpY2U6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSB8IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5jaGFuZ2VUcmFuc2FjdGlvbkxpbmVQcmljZSh1dWlkLCBsaW5lVXVpZCwgcHJpY2UpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIC8vIHRvZG86IGRvIHNvbWV0aGluZyB3aXRoIHRoZSBlcnJvclxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3M6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmhhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXNlcyhyZXNwb25zZSk7XG4gICAgICB0aGlzLl9yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XG4gICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwZGF0ZVJlZmVyZW5jZVRyYW5zYWN0aW9uTGluZSh1dWlkOiBzdHJpbmcsIGxpbmVVdWlkOiBzdHJpbmcsIHJlZmVyZW5jZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlIHwgYm9vbGVhbiA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmNoYW5nZVRyYW5zYWN0aW9uTGluZVJlZmVyZW5jZSh1dWlkLCBsaW5lVXVpZCwgcmVmZXJlbmNlKVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAvLyB0b2RvOiBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZXJyb3JcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICBjb25zdCBzdWNjZXNzOiBib29sZWFuID0gYXdhaXQgdGhpcy5oYW5kbGVMaW5lT3BlcmF0aW9uU3RhdHVzZXMocmVzcG9uc2UpO1xuICAgICAgdGhpcy5fcmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVRdWFudGl0eVRyYW5zYWN0aW9uTGluZSh1dWlkOiBzdHJpbmcsIGxpbmVVdWlkOiBzdHJpbmcsIHF1YW50aXR5OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UgfCBib29sZWFuID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuY2hhbmdlVHJhbnNhY3Rpb25MaW5lUXVhbnRpdHkodXVpZCwgbGluZVV1aWQsIHF1YW50aXR5KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAvLyB0b2RvOiBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZXJyb3JcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICBjb25zdCBzdWNjZXNzOiBib29sZWFuID0gYXdhaXQgdGhpcy5oYW5kbGVMaW5lT3BlcmF0aW9uU3RhdHVzZXMocmVzcG9uc2UpO1xuICAgICAgdGhpcy5fcmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVEZWxpdmVyeURhdGVUcmFuc2FjdGlvbkxpbmUodXVpZDogc3RyaW5nLCBsaW5lVXVpZDogc3RyaW5nLCBkYXRlOiBEYXRlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlIHwgYm9vbGVhbiA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmNoYW5nZVRyYW5zYWN0aW9uTGluZURlbGl2ZXJ5RGF0ZSh1dWlkLCBsaW5lVXVpZCwgZGF0ZSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgLy8gdG9kbzogZG8gc29tZXRoaW5nIHdpdGggdGhlIGVycm9yXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgY29uc3Qgc3VjY2VzczogYm9vbGVhbiA9IGF3YWl0IHRoaXMuaGFuZGxlTGluZU9wZXJhdGlvblN0YXR1c2VzKHJlc3BvbnNlKTtcbiAgICAgIHRoaXMuX3JlbWVtYmVyQ3VycmVudFRyYW5zYWN0aW9uKHJlc3BvbnNlKTtcbiAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlUHJpY2VMaXN0VHJhbnNhY3Rpb25MaW5lKHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZywgcHJpY2VMaXN0OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UgfCBib29sZWFuID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuY2hhbmdlVHJhbnNhY3Rpb25MaW5lUHJpY2VMaXN0KHV1aWQsIGxpbmVVdWlkLCBwcmljZUxpc3QpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIC8vIHRvZG86IGRvIHNvbWV0aGluZyB3aXRoIHRoZSBlcnJvclxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3M6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmhhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXNlcyhyZXNwb25zZSk7XG4gICAgICB0aGlzLl9yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XG4gICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwZGF0ZVZhdFRyYW5zYWN0aW9uTGluZSh1dWlkOiBzdHJpbmcsIGxpbmVVdWlkOiBzdHJpbmcsIGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UgfCBib29sZWFuID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuY2hhbmdlVHJhbnNhY3Rpb25MaW5lVmF0KHV1aWQsIGxpbmVVdWlkLCBpZClcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgLy8gdG9kbzogZG8gc29tZXRoaW5nIHdpdGggdGhlIGVycm9yXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgY29uc3Qgc3VjY2VzczogYm9vbGVhbiA9IGF3YWl0IHRoaXMuaGFuZGxlTGluZU9wZXJhdGlvblN0YXR1c2VzKHJlc3BvbnNlKTtcbiAgICAgIHRoaXMuX3JlbWVtYmVyQ3VycmVudFRyYW5zYWN0aW9uKHJlc3BvbnNlKTtcbiAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlQ29tbWlzc2lvbkNvZGVUcmFuc2FjdGlvbkxpbmUodXVpZDogc3RyaW5nLCBsaW5lVXVpZDogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UgfCBib29sZWFuID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuY2hhbmdlVHJhbnNhY3Rpb25MaW5lQ29tbWlzc2lvbkNvZGUodXVpZCwgbGluZVV1aWQsIGNvZGUpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIC8vIHRvZG86IGRvIHNvbWV0aGluZyB3aXRoIHRoZSBlcnJvclxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3M6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmhhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXNlcyhyZXNwb25zZSk7XG4gICAgICB0aGlzLl9yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XG4gICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwZGF0ZVdhcmVob3VzZVRyYW5zYWN0aW9uTGluZSh1dWlkOiBzdHJpbmcsIGxpbmVVdWlkOiBzdHJpbmcsIHdhcmVob3VzZU51bWJlcjogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlIHwgYm9vbGVhbiA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmNoYW5nZVRyYW5zYWN0aW9uTGluZVdhcmVob3VzZSh1dWlkLCBsaW5lVXVpZCwgd2FyZWhvdXNlTnVtYmVyKVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAvLyB0b2RvOiBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZXJyb3JcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICBjb25zdCBzdWNjZXNzOiBib29sZWFuID0gYXdhaXQgdGhpcy5oYW5kbGVMaW5lT3BlcmF0aW9uU3RhdHVzZXMocmVzcG9uc2UpO1xuICAgICAgdGhpcy5fcmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVEZWxpdmVyeU1ldGhvZFRyYW5zYWN0aW9uTGluZSh1dWlkOiBzdHJpbmcsIGxpbmVVdWlkOiBzdHJpbmcsIG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlIHwgYm9vbGVhbiA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmNoYW5nZVRyYW5zYWN0aW9uTGluZURlbGl2ZXJ5TWV0aG9kKHV1aWQsIGxpbmVVdWlkLCBtZXRob2QpXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIC8vIHRvZG86IGRvIHNvbWV0aGluZyB3aXRoIHRoZSBlcnJvclxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3M6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmhhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXNlcyhyZXNwb25zZSk7XG4gICAgICB0aGlzLl9yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XG4gICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwZGF0ZURpc2NvdW50VHJhbnNhY3Rpb25MaW5lKHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZywgdHlwZTogRGlzY291bnRUeXBlLCBkaXNjb3VudDogbnVtYmVyLCByZWFzb246IHN0cmluZyA9IFwiXCIsIGNvZGU6IHN0cmluZyA9IFwiXCIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UgfCBib29sZWFuID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuY2hhbmdlVHJhbnNhY3Rpb25MaW5lTGluZURpc2NvdW50KHV1aWQsIGxpbmVVdWlkLCB0eXBlLCBkaXNjb3VudCwgcmVhc29uLCBjb2RlKVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAvLyB0b2RvOiBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZXJyb3JcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICBjb25zdCBzdWNjZXNzOiBib29sZWFuID0gYXdhaXQgdGhpcy5oYW5kbGVMaW5lT3BlcmF0aW9uU3RhdHVzZXMocmVzcG9uc2UpO1xuICAgICAgdGhpcy5fcmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xuICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBcnRpY2xlRnVsbE9iamVjdChnb29kSWQ6IG51bWJlcik6IFByb21pc2U8QXJ0aWNsZUZ1bGxPYmplY3Q+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0QXJ0aWNsZUZ1bGxPYmplY3QoZ29vZElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREb2N1bWVudENvbnRlbnQoaWQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldERvY3VtZW50Q29udGVudChpZCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0R29vZElkRnJvbUFydGljbGVOcihza3U6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldEdvb2RJZEZyb21BcnRpY2xlTnIoc2t1KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRDb3VudHJ5KGNvdW50cnlDb2RlOiBzdHJpbmcpOiBQcm9taXNlPENvdW50cnk+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0Q291bnRyeShjb3VudHJ5Q29kZSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q2FzaFJlZ2lzdGVycygpOiBQcm9taXNlPENhc2hSZWdpc3RlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldENhc2hSZWdpc3RlcnModW5kZWZpbmVkLCAxKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRSZWxhdGlvbk51bWJlcihyZWxhdGlvbklkOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRSZWxhdGlvbk51bWJlcihyZWxhdGlvbklkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRQcmljZUxpc3RzKCk6IFByb21pc2U8UHJpY2VMaXN0W10+IHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0UHJpY2VMaXN0cygpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFZhdExpc3RzKCk6IFByb21pc2U8VmF0W10+IHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0VmF0TGlzdCgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNhdmVSZWxhdGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyB0aGlzLl9jbGVhblJlbGF0aW9uQmVmb3JlU2F2ZSgpO1xuICAgIGlmICghdGhpcy5yZWxhdGlvbi5yZWxhdGlvbklkKSB7XG4gICAgICB0aGlzLnJlbGF0aW9uID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuaW5zZXJ0Q3VzdG9tZXIodGhpcy5yZWxhdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVsYXRpb24gPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci51cGRhdGVDdXN0b21lcih0aGlzLnJlbGF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYWRkUmVsYXRpb25Ub1RyYW5zYWN0aW9uKHRoaXMucmVsYXRpb24ucmVsYXRpb25JZCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0U2VxdWVuY2VWYWx1ZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRTZXF1ZW5jZVZhbHVlKFNlcXVlbmNlTmFtZS5SZWxhdGlvbklkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRSZWxhdGlvblByaXZhY3lTZXR0aW5ncygpOiBQcm9taXNlPFJlbGF0aW9uUHJpdmFjeVNldHRpbmdbXT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRSZWxhdGlvblByaXZhY3lTZXR0aW5ncygpO1xuICB9XG5cbiAgcHVibGljIGdldEFydGljbGVCb3VuZFRleHRMaW5lc09mQXJ0aWNsZUxpbmUoYXJ0aWNsZUxpbmVVdWlkOiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uTGluZUluZm9bXT4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRBcnRpY2xlQm91bmRUZXh0TGluZXNPZkFydGljbGVMaW5lKGFydGljbGVMaW5lVXVpZCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlVHJhbnNhY3Rpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0b3IuY3JlYXRlVHJhbnNhY3Rpb24oVHJhbnNhY3Rpb25LaW5kLlNhbGVzT3JkZXIsIFwiMVwiKS50aGVuKChyZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5fcmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pLmNhdGNoKChyZWFzb246IFZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICAgcmVqZWN0KGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uTm86IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLm9wZW5FeGlzdGluZ1RyYW5zYWN0aW9uKFRyYW5zYWN0aW9uS2luZC5TYWxlc09yZGVyLCB0cmFuc2FjdGlvbk5vKTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuRXhpc3RpbmdUcmFuc2FjdGlvbihraW5kOiBUcmFuc2FjdGlvbktpbmQsIHRyYW5zYWN0aW9uTnI6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdG9yLmdldFRyYW5zYWN0aW9uQnlOckFuZEtpbmQoa2luZCwgdHJhbnNhY3Rpb25OcilcbiAgICAgICAgLnRoZW4oYXN5bmMgKHJlc3BvbnNlOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5pc1N1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25VcGRhdGVkLm5leHQocmVzcG9uc2UpO1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgocmVhc29uOiBWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuXG4gIHB1YmxpYyBnZXRUcmFuc2FjdGlvbkJ5SWQodHJhbnNhY3Rpb25JZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0b3IuZ2V0VHJhbnNhY3Rpb25CeUlkKHRyYW5zYWN0aW9uSWQpXG4gICAgICAgIC50aGVuKChyZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuaXNTdWNjZXNzKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uVXBkYXRlZC5uZXh0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKHJlYXNvbjogVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJlamVjdChmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNvbW1pdCgpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmNvbW1pdCgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNhdmVUcmFuc2FjdGlvbihjbG9zZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLnNhdmVUcmFuc2FjdGlvbih0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udXVpZCk7XG4gICAgaWYgKHJlc3BvbnNlLmlzU3VjY2Vzcykge1xuICAgICAgdGhpcy5fcmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2F2ZVRyYW5zYWN0aW9uQnlVdWlkKHRyYW5zYWN0aW9uVXVpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0b3Iuc2F2ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uVXVpZClcbiAgICAgICAgLnRoZW4oYXN5bmMgKHJlc3BvbnNlOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5pc1N1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25VcGRhdGVkLm5leHQocmVzcG9uc2UpO1xuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgocmVhc29uOiBWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlYXNvbikge1xuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dFcnJvcihyZWFzb24uZ2V0RnVsbEVycm9yU3RyaW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWplY3QoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGRSZWxhdGlvblRvVHJhbnNhY3Rpb24ocmVsYXRpb25JZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgYXdhaXQgdGhpcy5fY2hlY2tBbmRDcmVhdGVUcmFuc2FjdGlvbigpO1xuICAgIGNvbnN0IHJlc3VsdDogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5hZGRSZWxhdGlvblRvVHJhbnNhY3Rpb24odGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnV1aWQsIHJlbGF0aW9uSWQpO1xuICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKSB7XG4gICAgICB0aGlzLl9yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXN1bHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q29tbWlzc2lvbkNvZGVzKGxhbmd1YWdlQ29kZTogc3RyaW5nKTogUHJvbWlzZTxDb0RvbWFpblZhbHVlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0Q29tbWlzc2lvbkNvZGVzKGxhbmd1YWdlQ29kZSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0SW5PdXRDb2xsZWN0aW9uKGxhbmd1YWdlQ29kZTogc3RyaW5nKTogUHJvbWlzZTxDb0RvbWFpblZhbHVlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0SW5PdXRDb2xsZWN0aW9uKGxhbmd1YWdlQ29kZSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VHJhbnNhY3Rpb25BcnRpY2xlV2FyZWhvdXNlcyhnb29kSWQ6IG51bWJlcik6IFByb21pc2U8VHJhbnNhY3Rpb25BcnRpY2xlV2FyZWhvdXNlW10+IHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0VHJhbnNhY3Rpb25BcnRpY2xlV2FyZWhvdXNlcyhnb29kSWQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldE1hcmtldGluZ0NvZGVzKCk6IFByb21pc2U8TWFya2V0aW5nW10+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0TWFya2V0aW5nQ29kZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbnNlcnRDdXN0b21lcihyZWxhdGlvbjogQ3VzdG9tZXJGdWxsT2JqZWN0KTogUHJvbWlzZTxDdXN0b21lckZ1bGxPYmplY3Q+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0b3IuaW5zZXJ0Q3VzdG9tZXIocmVsYXRpb24pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwZGF0ZUN1c3RvbWVyKHJlbGF0aW9uOiBDdXN0b21lckZ1bGxPYmplY3QpOiBQcm9taXNlPEN1c3RvbWVyRnVsbE9iamVjdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxDdXN0b21lckZ1bGxPYmplY3Q+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdG9yLnVwZGF0ZUN1c3RvbWVyKHJlbGF0aW9uKS50aGVuKGFzeW5jKCByZXNwb25zZTogQ3VzdG9tZXJGdWxsT2JqZWN0KSA9PiB7XG4gICAgICAgIC8vIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5yZWxhdGlvbiA9IHJlbGF0aW9uO1xuICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKHJlc3BvbnNlOiBDdXN0b21lckZ1bGxPYmplY3QpID0+IHtcbiAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREZWxpdmVyeU1ldGhvZHMoKTogUHJvbWlzZTxEZWxpdmVyeU1ldGhvZFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldERlbGl2ZXJ5TWV0aG9kcygpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERlbGl2ZXJ5T3B0aW9ucygpOiBQcm9taXNlPERlbGl2ZXJ5T3B0aW9uW10+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0RGVsaXZlcnlPcHRpb25zKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0VHJhbnNhY3Rpb25EZWxpdmVyeU9wdGlvbnMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gY29uc3QgdHJhbnNhY3Rpb25EZWxpdmVyeU9wdGlvbnNSZXF1ZXN0OiBTZXRUcmFuc2FjdGlvbkRlbGl2ZXJ5T3B0aW9uc1JlcXVlc3QgPSB0aGlzLl9nZXRUcmFuc2FjdGlvbkRlbGl2ZXJ5T3B0aW9ucygpO1xuICAgIGlmICghdGhpcy5kZWxpdmVyeU9wdGlvbnMudHJhbnNhY3Rpb25VdWlkKSB7XG4gICAgICB0aGlzLmRlbGl2ZXJ5T3B0aW9ucy50cmFuc2FjdGlvblV1aWQgPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udXVpZDtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2U6IFRyYW5zYWN0aW9uUmVzcG9uc2VCYXNlID0gYXdhaXQgdGhpcy5jb25uZWN0b3Iuc2V0VHJhbnNhY3Rpb25EZWxpdmVyeU9wdGlvbnModGhpcy5kZWxpdmVyeU9wdGlvbnMpXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlICYmIHJlc3BvbnNlLmlzU3VjY2VzcztcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRSZWxhdGlvbkxpc3RPYmplY3RzKHJlbGF0aW9uUmVxdWVzdDogUmVsYXRpb25SZXF1ZXN0KTogUHJvbWlzZTxSZWxhdGlvbkxpc3RPYmplY3RbXT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRSZWxhdGlvbkxpc3RPYmplY3RzKHJlbGF0aW9uUmVxdWVzdCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmV0cmlldmVMaW5lSW1hZ2UobGluZTogVHJhbnNhY3Rpb25MaW5lSW5mbyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0QXJ0aWNsZUltYWdlQnlBcnRpY2xlTnVtYmVyKGxpbmUuYXJ0aWNsZU51bWJlcik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QXJ0aWNsZUltYWdlQnlBcnRpY2xlTnVtYmVyKGFydGljbGVOdW1iZXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKGFydGljbGVOdW1iZXIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5faW1hZ2VDYWNoZS5nZXQoYXJ0aWNsZU51bWJlcik7XG4gICAgfVxuICAgIGNvbnN0IGdvb2RJZDogbnVtYmVyID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0R29vZElkRnJvbUFydGljbGVOcihhcnRpY2xlTnVtYmVyKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gICAgY29uc3QgaW1hZ2UgPSBhd2FpdCB0aGlzLmdldEFydGljbGVJbWFnZUJ5R29vZElkKGdvb2RJZCk7XG4gICAgdGhpcy5faW1hZ2VDYWNoZS5zZXQoYXJ0aWNsZU51bWJlciwgaW1hZ2UpO1xuICAgIHJldHVybiBpbWFnZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBcnRpY2xlSW1hZ2VCeUdvb2RJZChnb29kSWQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc05hTihnb29kSWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0U2luZ2xlSW1hZ2UoZ29vZElkLCAxLCB0cnVlLCB0cnVlKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGRBcnRpY2xlKFxuICAgIGFydGljbGVObzogc3RyaW5nLFxuICAgIGFtb3VudDogbnVtYmVyID0gMSxcbiAgICB3YXJlaG91c2VObzogbnVtYmVyID0gMSxcbiAgICBjb21taXNzaW9uQ29kZTogc3RyaW5nID0gXCIyXCIsXG4gICAgaXNSZXR1cm46IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBhYm92ZUxpbmVOcjogbnVtYmVyID0gMCxcbiAgICBiZWxvd0xpbmVOcjogbnVtYmVyID0gMFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBhd2FpdCB0aGlzLl9jaGVja0FuZENyZWF0ZVRyYW5zYWN0aW9uKCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuYWRkVHJhbnNhY3Rpb25MaW5lKFxuICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnV1aWQsIFRyYW5zYWN0aW9uTGluZVR5cGUuQXJ0aWNsZUxpbmUsIGFydGljbGVObywgYW1vdW50LCB3YXJlaG91c2VObywgY29tbWlzc2lvbkNvZGUsIGlzUmV0dXJuLCBhYm92ZUxpbmVOciwgYmVsb3dMaW5lTnIpO1xuICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZUxpbmVPcGVyYXRpb25TdGF0dXNlcyhyZXNwb25zZSkpIHtcbiAgICAgIHRoaXMuX3JlbWVtYmVyQ3VycmVudFRyYW5zYWN0aW9uKHJlc3BvbnNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBwdWJsaWMgYXN5bmMgYWRkQXJ0aWNsZVRvVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25VdWlkOiBzdHJpbmcsIGFydGljbGVObzogc3RyaW5nLCBhbW91bnQ6IG51bWJlciA9IDEsIHdhcmVob3VzZU5vOiBudW1iZXIgPSAxLCBjb21taXNzaW9uQ29kZTogc3RyaW5nID0gXCIyXCIsIGlzUmV0dXJuOiBib29sZWFuID0gZmFsc2UsIGFib3ZlTGluZU5yOiBudW1iZXIgPSAwLCBiZWxvd0xpbmVOcjogbnVtYmVyID0gMCk6IFByb21pc2U8TGluZU9wZXJhdGlvblJlc3BvbnNlPiB7XG4gIC8vICAgYXdhaXQgdGhpcy5fY2hlY2tBbmRDcmVhdGVUcmFuc2FjdGlvbigpO1xuICAvLyAgIHJldHVybiBuZXcgUHJvbWlzZTxMaW5lT3BlcmF0aW9uUmVzcG9uc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgLy8gICAgIHRoaXMuY29ubmVjdG9yLmFkZFRyYW5zYWN0aW9uTGluZSh0cmFuc2FjdGlvblV1aWQsIFRyYW5zYWN0aW9uTGluZVR5cGUuQXJ0aWNsZUxpbmUsIGFydGljbGVObywgYW1vdW50LCB3YXJlaG91c2VObywgY29tbWlzc2lvbkNvZGUsIGlzUmV0dXJuLCBhYm92ZUxpbmVOciwgYmVsb3dMaW5lTnIpXG4gIC8vICAgICAgIC50aGVuKGFzeW5jKCByZXNwb25zZTogTGluZU9wZXJhdGlvblJlc3BvbnNlKSA9PiB7XG4gIC8vICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gIC8vICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAvLyAgICAgICAgIHRoaXMuX3Byb21wdC5zaG93RXJyb3IoZXJyb3IpO1xuICAvLyAgICAgICAgIHJlamVjdChlcnJvcik7XG4gIC8vICAgICAgIH0pXG4gIC8vICAgICAgIC5jYXRjaCgocmVhc29uOiBWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gIC8vICAgICAgICAgdGhpcy5fcHJvbXB0LnNob3dFcnJvcihyZWFzb24uZ2V0RnVsbEVycm9yU3RyaW5nKCkpO1xuICAvLyAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gIC8vICAgICAgIH0pO1xuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgcHVibGljIGFzeW5jIGFkZFRyYW5zYWN0aW9uTGluZShsaW5lVHlwZTogVHJhbnNhY3Rpb25MaW5lVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpY2xlTm86IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJlaG91c2VObz86IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21taXNzaW9uQ29kZT86IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JldHVybj86IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmVMaW5lTnI/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVsb3dMaW5lTnI/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtZW1iZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIGF3YWl0IHRoaXMuX2NoZWNrQW5kQ3JlYXRlVHJhbnNhY3Rpb24oKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdG9yLmFkZFRyYW5zYWN0aW9uTGluZSh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udXVpZCwgbGluZVR5cGUsIGFydGljbGVObywgYW1vdW50LCB3YXJlaG91c2VObywgY29tbWlzc2lvbkNvZGUsIGlzUmV0dXJuLCBhYm92ZUxpbmVOciwgYmVsb3dMaW5lTnIpXG4gICAgICAgIC50aGVuKGFzeW5jIChyZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChyZWFzb246IFZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkVGV4dExpbmUoXG4gICAgICAgICAgICAgICAgc2hvd09uRG9jdW1lbnRzOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIGFtb3VudDogbnVtYmVyLFxuICAgICAgICAgICAgICAgIGFydGljbGVCb3VuZDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICByZWZBcnRpY2xlTGluZU5yOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgYWJvdmVMaW5lTnI/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgYmVsb3dMaW5lTnI/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcmVtZW1iZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIGF3YWl0IHRoaXMuX2NoZWNrQW5kQ3JlYXRlVHJhbnNhY3Rpb24oKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdG9yLmFkZFRleHRMaW5lVG9UcmFuc2FjdGlvbih0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udXVpZCwgc2hvd09uRG9jdW1lbnRzLCB0ZXh0LCBhbW91bnQsIGFydGljbGVCb3VuZCwgcmVmQXJ0aWNsZUxpbmVOciwgYWJvdmVMaW5lTnIsIGJlbG93TGluZU5yKVxuICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKHJlYXNvbjogVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZFRleHRMaW5lVG9UcmFuc2FjdGlvbihcbiAgICB0cmFuc2FjdGlvblV1aWQ6IHN0cmluZyxcbiAgICBzaG93T25Eb2N1bWVudHM6IG51bWJlcixcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgYW1vdW50OiBudW1iZXIsXG4gICAgYXJ0aWNsZUJvdW5kOiBib29sZWFuLFxuICAgIHJlZkFydGljbGVMaW5lTnI6IG51bWJlcixcbiAgICBhYm92ZUxpbmVOcj86IG51bWJlcixcbiAgICBiZWxvd0xpbmVOcj86IG51bWJlcik6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcbiAgICBhd2FpdCB0aGlzLl9jaGVja0FuZENyZWF0ZVRyYW5zYWN0aW9uKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rvci5hZGRUZXh0TGluZVRvVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25VdWlkLCBzaG93T25Eb2N1bWVudHMsIHRleHQsIGFtb3VudCwgYXJ0aWNsZUJvdW5kLCByZWZBcnRpY2xlTGluZU5yLCBhYm92ZUxpbmVOciwgYmVsb3dMaW5lTnIpXG4gICAgICAgIC50aGVuKGFzeW5jIChyZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChyZWFzb246IFZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VMaW5lU2VxdWVuY2UoXG4gICAgbGluZVV1aWQ6IHN0cmluZyxcbiAgICBhYm92ZUxpbmVOcj86IG51bWJlcixcbiAgICBiZWxvd0xpbmVOcj86IG51bWJlcixcbiAgICByZW1lbWJlcjogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rvci5jaGFuZ2VMaW5lU2VxdWVuY2UodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnV1aWQsIGxpbmVVdWlkLCBhYm92ZUxpbmVOciwgYmVsb3dMaW5lTnIpXG4gICAgICAgIC50aGVuKGFzeW5jIChyZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgocmVhc29uOiBWYWxpZGF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlVHJhbnNhY3Rpb25MaW5lKHRyYW5zYWN0aW9uVXVpZDogc3RyaW5nLCBUcmFuc2FjdGlvbkxpbmVVdWlkOiBzdHJpbmcsIHJlbWVtYmVyOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdG9yLmRlbGV0ZVRyYW5zYWN0aW9uTGluZSh0cmFuc2FjdGlvblV1aWQsIFRyYW5zYWN0aW9uTGluZVV1aWQpXG4gICAgICAgIC50aGVuKGFzeW5jIChyZXNwb25zZTogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihyZXNwb25zZSk7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmlzU3VjY2Vzcykge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKHJlYXNvbjogVmFsaWRhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNoYW5nZVRyYW5zYWN0aW9uTGluZVF1YW50aXR5KGxpbmVVdWlkOiBzdHJpbmcsIG5ld1F1YW50aXR5OiBudW1iZXIsIHJlbWVtYmVyOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+KChyZXNvbHZlOiBGdW5jdGlvbikgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0b3IuY2hhbmdlVHJhbnNhY3Rpb25MaW5lUXVhbnRpdHkodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnV1aWQsIGxpbmVVdWlkLCBuZXdRdWFudGl0eSlcbiAgICAgICAgLnRoZW4oYXN5bmMgKHJlc3BvbnNlOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5pc1N1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbWVtYmVyQ3VycmVudFRyYW5zYWN0aW9uKHJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgIH0pLmNhdGNoKChyZWFzb246IFZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0UmVsYXRpb25CeVVzZXIodXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZTogRnVuY3Rpb24pID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdG9yLnNldFJlbGF0aW9uQnlVc2VyKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby51dWlkLCB1c2VybmFtZSwgcGFzc3dvcmQpXG4gICAgICAgIC50aGVuKGFzeW5jIChpc1N1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICByZXNvbHZlKGlzU3VjY2Vzcyk7XG4gICAgICAgIH0pLmNhdGNoKChyZWFzb246IFZhbGlkYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRDdXN0b21lckZ1bGxPYmplY3RCeVJlbGF0aW9uSWQocmVsYXRpb25JZDogbnVtYmVyKTogUHJvbWlzZTxDdXN0b21lckZ1bGxPYmplY3Q+IHtcbiAgICBjb25zdCByZWxhdGlvbk5yOiBzdHJpbmcgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRSZWxhdGlvbk51bWJlcihyZWxhdGlvbklkKTtcbiAgICBpZiAocmVsYXRpb25Ocikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldEN1c3RvbWVyRnVsbE9iamVjdChOdW1iZXIocmVsYXRpb25OcikpO1xuICAgIH1cbiAgICByZXR1cm4gTlVMTF9DVVNUT01FUl9GVUxMX09CSkVDVDtcbiAgfVxuXG4gIC8vIHB1YmxpYyBhc3luYyBzZXRSZWxhdGlvbkJ5VXNlcih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vICAgY29uc3QgcmVzcG9uc2U6IGJvb2xlYW4gPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5zZXRSZWxhdGlvbkJ5VXNlcih0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi51dWlkLCB1c2VybmFtZSwgcGFzc3dvcmQpO1xuICAvLyAgIHJldHVybiByZXNwb25zZTtcbiAgLy8gfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRUZXh0VHlwZXMobGFuZ3VhZ2VDb2RlOiBzdHJpbmcpOiBQcm9taXNlPENvRG9tYWluVmFsdWVbXT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRUZXh0VHlwZXMobGFuZ3VhZ2VDb2RlKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRTdGFuZGFyZFRleHRzKGxhbmd1YWdlQ29kZTogc3RyaW5nKTogUHJvbWlzZTxTdGFuZGFyZFRleHRbXT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRTdGFuZGFyZFRleHRzKGxhbmd1YWdlQ29kZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Rmlyc3RBZGRyZXNzKHJlbGF0aW9uOiBSZWxhdGlvbkFueVR5cGUpOiBBZGRyZXNzIHtcbiAgICBpZiAoIXJlbGF0aW9uIHx8ICFyZWxhdGlvbi5hZGRyZXNzZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGF0aW9uLmdldEZpcnN0QXZhaWxhYmxlQWRkcmVzcyhbXG4gICAgICBBZGRyZXNzVHlwZS5EZWxpdmVyeUFkZHJlc3MsXG4gICAgICBBZGRyZXNzVHlwZS5CaWxsaW5nQWRkcmVzcyxcbiAgICAgIEFkZHJlc3NUeXBlLlZpc2l0aW5nQWRkcmVzcyxcbiAgICAgIEFkZHJlc3NUeXBlLk1haWxpbmdBZGRyZXNzLFxuICAgICAgQWRkcmVzc1R5cGUuTnVyc2luZ0FkZHJlc3NcbiAgICBdKTtcbiAgfVxuXG4gIC8vIHByaXZhdGUgX2NsZWFuUmVsYXRpb25CZWZvcmVTYXZlKCk6IHZvaWQge1xuICAvLyAgIEFycmF5VXRpbHMuUmVtb3ZlRWxlbWVudHNCeUZpbHRlcih0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8ucmVsYXRpb24uY29udGFjdE9wdGlvbnMsICgoaXRlbTogQ29udGFjdE9wdGlvbikgPT4ge1xuICAvLyAgICAgcmV0dXJuIGlzTmlsbChpdGVtLnZhbHVlKTtcbiAgLy8gICB9KSk7XG4gIC8vIH1cblxuICBwcml2YXRlIGFzeW5jIF9jaGVja0FuZENyZWF0ZVRyYW5zYWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gfHwgIXRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mbyB8fCAhdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnRyYW5zYWN0aW9uTnIpIHtcbiAgICAgIGlmICghYXdhaXQgdGhpcy5jcmVhdGVUcmFuc2FjdGlvbigpKSB7XG4gICAgICAgIHRocm93RXJyb3IoXCJGYWlsZWQgdG8gY3JlYXRlIHRyYW5zYWN0aW9uXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG4iXX0=