@sabstravtech/obtservices 0.0.19020100 → 0.0.22041208

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 (241) hide show
  1. package/angular/components/with-component.d.ts +2 -1
  2. package/angular/fetchers.d.ts +17 -12
  3. package/angular/lib/vendor/classes/helpers.d.ts +8 -0
  4. package/angular/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.d.ts +7 -0
  5. package/angular/lib/vendor/fetchers/apply-jit-flight-rules.d.ts +7 -0
  6. package/angular/lib/vendor/fetchers/basket-fetcher.d.ts +2 -1
  7. package/angular/lib/vendor/fetchers/conferma-office.fetcher.d.ts +2 -1
  8. package/angular/lib/vendor/fetchers/flight-fare-rules.fetcher.d.ts +7 -0
  9. package/angular/lib/vendor/fetchers/flight-quote.fetcher.d.ts +2 -1
  10. package/angular/lib/vendor/fetchers/get-conferma-room-images.fetcher.d.ts +7 -0
  11. package/angular/lib/vendor/fetchers/get-covid-microsite-token.fetcher.d.ts +7 -0
  12. package/angular/lib/vendor/fetchers/get-flight-seat-map-fetcher.d.ts +7 -0
  13. package/angular/lib/vendor/fetchers/get-rail-live-departures.fetcher.d.ts +7 -0
  14. package/angular/lib/vendor/fetchers/get-user-favourite-searches.fetcher.d.ts +7 -0
  15. package/angular/lib/vendor/fetchers/irl-discount-card-fetcher.d.ts +7 -0
  16. package/angular/lib/vendor/fetchers/search-airlines-fetcher.d.ts +2 -1
  17. package/angular/lib/vendor/fetchers/search-airports-fetcher.d.ts +2 -1
  18. package/angular/lib/vendor/fetchers/search-conferma-cities.fetcher.d.ts +2 -1
  19. package/angular/lib/vendor/fetchers/user-fetcher.d.ts +2 -1
  20. package/angular/lib/vendor/services/my-bookings.service.d.ts +4 -3
  21. package/angular/lib/vendor/services/search.service.d.ts +15 -3
  22. package/angular/lib/vendor/services/user.service.d.ts +4 -3
  23. package/angular/lib/vendor/types/graphql.angular.types.d.ts +1062 -1062
  24. package/angular/lib/vendor/updaters/cancel-booking-updater.d.ts +6 -0
  25. package/angular/lib/vendor/updaters/confirm-messages-updater.d.ts +6 -0
  26. package/angular/lib/vendor/updaters/remove-favourite-search.updater.d.ts +6 -0
  27. package/angular/lib/vendor/updaters/save-favourite-search.updater.d.ts +6 -0
  28. package/angular/sabstravtech-obtservices-angular.d.ts +14 -9
  29. package/angular/sabstravtech-obtservices-angular.metadata.json +1 -1
  30. package/angular/updaters.d.ts +3 -0
  31. package/base/classes.d.ts +1 -0
  32. package/base/fetchers.d.ts +27 -3
  33. package/base/interfaces.d.ts +3 -3
  34. package/base/lib/vendor/classes/base-enterprise.d.ts +5 -2
  35. package/base/lib/vendor/classes/bookable-basket.d.ts +1 -1
  36. package/base/lib/vendor/classes/cabhire-enterprise-search.d.ts +8 -7
  37. package/base/lib/vendor/classes/carhire-enterprise-search.d.ts +11 -2
  38. package/base/lib/vendor/classes/enviroment.d.ts +2 -0
  39. package/base/lib/vendor/classes/eurostar-enterprise-search.d.ts +26 -69
  40. package/base/lib/vendor/classes/flight-enterprise-search.d.ts +39 -22
  41. package/base/lib/vendor/classes/helpers.d.ts +49 -6
  42. package/base/lib/vendor/classes/hotel-enterprise-search.d.ts +19 -8
  43. package/base/lib/vendor/classes/irl-direction.enum.d.ts +4 -0
  44. package/base/lib/vendor/classes/irl-enterprise-search.d.ts +285 -30
  45. package/base/lib/vendor/classes/lounges-enterprise-search.d.ts +7 -3
  46. package/base/lib/vendor/classes/management-info-and-valid.d.ts +1 -0
  47. package/base/lib/vendor/classes/modal-types.enum.d.ts +4 -0
  48. package/base/lib/vendor/classes/parking-enterprise-search.d.ts +7 -3
  49. package/base/lib/vendor/classes/rail-direction.enum.d.ts +2 -2
  50. package/base/lib/vendor/classes/rail-enterprise-search.d.ts +83 -54
  51. package/base/lib/vendor/classes/rail-index-to-ticket.d.ts +9 -0
  52. package/base/lib/vendor/classes/supplementary-booking-info-impl.d.ts +1 -0
  53. package/base/lib/vendor/classes/user-favourite.enum.d.ts +3 -0
  54. package/base/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.d.ts +23 -0
  55. package/base/lib/vendor/fetchers/apply-jit-flight-rules.d.ts +21 -0
  56. package/base/lib/vendor/fetchers/basket-fetcher.d.ts +2 -1
  57. package/base/lib/vendor/fetchers/conferma-office.fetcher.d.ts +2 -1
  58. package/base/lib/vendor/fetchers/flight-fare-rules.fetcher.d.ts +21 -0
  59. package/base/lib/vendor/fetchers/flight-quote.fetcher.d.ts +6 -2
  60. package/base/lib/vendor/fetchers/get-conferma-room-images.fetcher.d.ts +21 -0
  61. package/base/lib/vendor/fetchers/get-covid-microsite-token.fetcher.d.ts +21 -0
  62. package/base/lib/vendor/fetchers/get-flight-seat-map-fetcher.d.ts +21 -0
  63. package/base/lib/vendor/fetchers/get-rail-live-departures.fetcher.d.ts +21 -0
  64. package/base/lib/vendor/fetchers/get-user-favourite-searches.fetcher.d.ts +21 -0
  65. package/base/lib/vendor/fetchers/irl-discount-card-fetcher.d.ts +21 -0
  66. package/base/lib/vendor/fetchers/list-fetchable-enterprise.d.ts +1 -1
  67. package/base/lib/vendor/fetchers/object-fetchable-enterprise.d.ts +3 -1
  68. package/base/lib/vendor/fetchers/search-airlines.fetcher.d.ts +2 -1
  69. package/base/lib/vendor/fetchers/search-airports-fetcher.d.ts +2 -1
  70. package/base/lib/vendor/fetchers/search-conferma-cities.fetcher.d.ts +2 -1
  71. package/base/lib/vendor/fetchers/user-fetcher.d.ts +2 -1
  72. package/base/lib/vendor/interfaces/Icabhire-enterprise-search.d.ts +3 -2
  73. package/base/lib/vendor/interfaces/Icarhire-enterprise-search.d.ts +4 -1
  74. package/base/lib/vendor/interfaces/Ienterprise-basket.service.d.ts +4 -3
  75. package/base/lib/vendor/interfaces/Ieurostar-enterprise-search.d.ts +8 -4
  76. package/base/lib/vendor/interfaces/Iflight-enterprise-search.d.ts +15 -4
  77. package/base/lib/vendor/interfaces/Ihotel-enterprise-search.d.ts +8 -22
  78. package/base/lib/vendor/interfaces/Iirl-enterprise-search.d.ts +15 -10
  79. package/base/lib/vendor/interfaces/Ilounges-enterprise-search.d.ts +4 -2
  80. package/base/lib/vendor/interfaces/Imybookings.service.d.ts +2 -1
  81. package/base/lib/vendor/interfaces/Iparking-enterprise-search.d.ts +3 -2
  82. package/base/lib/vendor/interfaces/Irail-enterprise-search.d.ts +31 -31
  83. package/base/lib/vendor/interfaces/Isearch.service.d.ts +12 -3
  84. package/base/lib/vendor/interfaces/Iuser.service.d.ts +3 -1
  85. package/base/lib/vendor/interfaces/cab-hire-search-arg.interface.d.ts +10 -0
  86. package/base/lib/vendor/interfaces/car-hire-search-arg.interface.d.ts +42 -0
  87. package/base/lib/vendor/interfaces/enable-fresh-chat-interface.d.ts +7 -0
  88. package/base/lib/vendor/interfaces/eurostar-search-arg.interface.d.ts +6 -0
  89. package/base/lib/vendor/interfaces/flight-filters.interface.d.ts +1 -0
  90. package/base/lib/vendor/interfaces/flight-search-args.interface.d.ts +8 -0
  91. package/base/lib/vendor/interfaces/hotel-recent-search-args.interface.d.ts +4 -0
  92. package/base/lib/vendor/interfaces/irl-search-arg.interface.d.ts +5 -0
  93. package/base/lib/vendor/interfaces/rail-basket-item.interface.d.ts +11 -5
  94. package/base/lib/vendor/interfaces/rail-recent-search-args.interface.d.ts +16 -11
  95. package/base/lib/vendor/interfaces/rail-selected-ticket.interface.d.ts +4 -9
  96. package/base/lib/vendor/interfaces/summary-interface.d.ts +23 -0
  97. package/base/lib/vendor/interfaces/terms-and-conditions.interface.d.ts +4 -0
  98. package/base/lib/vendor/interfaces/user.data.d.ts +1 -0
  99. package/base/lib/vendor/services/enterprise-basket.service.d.ts +5 -3
  100. package/base/lib/vendor/services/hotel-avallibility.service.d.ts +5 -3
  101. package/base/lib/vendor/services/my-bookings.service.d.ts +6 -3
  102. package/base/lib/vendor/services/search.service.d.ts +46 -10
  103. package/base/lib/vendor/services/user.service.d.ts +9 -4
  104. package/base/lib/vendor/types/graphql.types.d.ts +982 -1051
  105. package/base/lib/vendor/types/types.d.ts +187 -14
  106. package/base/lib/vendor/updaters/cancel-booking-updater.d.ts +20 -0
  107. package/base/lib/vendor/updaters/confirm-messages-updater.d.ts +19 -0
  108. package/base/lib/vendor/updaters/remove-favourite-search-updater.d.ts +19 -0
  109. package/base/lib/vendor/updaters/save-favourite-search-updater.d.ts +20 -0
  110. package/base/sabstravtech-obtservices-base.metadata.json +1 -1
  111. package/base/updaters.d.ts +4 -0
  112. package/bundles/sabstravtech-obtservices-angular.umd.js +763 -158
  113. package/bundles/sabstravtech-obtservices-angular.umd.js.map +1 -1
  114. package/bundles/sabstravtech-obtservices-angular.umd.min.js +1 -1
  115. package/bundles/sabstravtech-obtservices-angular.umd.min.js.map +1 -1
  116. package/bundles/sabstravtech-obtservices-base.umd.js +8805 -7342
  117. package/bundles/sabstravtech-obtservices-base.umd.js.map +1 -1
  118. package/bundles/sabstravtech-obtservices-base.umd.min.js +2 -2
  119. package/bundles/sabstravtech-obtservices-base.umd.min.js.map +1 -1
  120. package/esm2015/angular/components/basket-panel.js +9 -5
  121. package/esm2015/angular/components/with-component.js +7 -4
  122. package/esm2015/angular/fetchers.js +18 -13
  123. package/esm2015/angular/lib/vendor/classes/helpers.js +21 -4
  124. package/esm2015/angular/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.js +25 -0
  125. package/esm2015/angular/lib/vendor/fetchers/apply-jit-flight-rules.js +25 -0
  126. package/esm2015/angular/lib/vendor/fetchers/basket-fetcher.js +8 -5
  127. package/esm2015/angular/lib/vendor/fetchers/conferma-office.fetcher.js +8 -5
  128. package/esm2015/angular/lib/vendor/fetchers/flight-fare-rules.fetcher.js +25 -0
  129. package/esm2015/angular/lib/vendor/fetchers/flight-quote.fetcher.js +8 -5
  130. package/esm2015/angular/lib/vendor/fetchers/get-conferma-room-images.fetcher.js +25 -0
  131. package/esm2015/angular/lib/vendor/fetchers/get-covid-microsite-token.fetcher.js +25 -0
  132. package/esm2015/angular/lib/vendor/fetchers/get-flight-seat-map-fetcher.js +25 -0
  133. package/esm2015/angular/lib/vendor/fetchers/get-rail-live-departures.fetcher.js +25 -0
  134. package/esm2015/angular/lib/vendor/fetchers/get-user-favourite-searches.fetcher.js +25 -0
  135. package/esm2015/angular/lib/vendor/fetchers/irl-discount-card-fetcher.js +25 -0
  136. package/esm2015/angular/lib/vendor/fetchers/search-airlines-fetcher.js +8 -5
  137. package/esm2015/angular/lib/vendor/fetchers/search-airports-fetcher.js +8 -5
  138. package/esm2015/angular/lib/vendor/fetchers/search-conferma-cities.fetcher.js +8 -5
  139. package/esm2015/angular/lib/vendor/fetchers/user-fetcher.js +8 -5
  140. package/esm2015/angular/lib/vendor/services/my-bookings.service.js +8 -5
  141. package/esm2015/angular/lib/vendor/services/search.service.js +69 -33
  142. package/esm2015/angular/lib/vendor/services/user.service.js +9 -6
  143. package/esm2015/angular/lib/vendor/types/graphql.angular.types.js +1467 -2520
  144. package/esm2015/angular/lib/vendor/updaters/cancel-booking-updater.js +22 -0
  145. package/esm2015/angular/lib/vendor/updaters/confirm-messages-updater.js +22 -0
  146. package/esm2015/angular/lib/vendor/updaters/remove-favourite-search.updater.js +22 -0
  147. package/esm2015/angular/lib/vendor/updaters/save-favourite-search.updater.js +22 -0
  148. package/esm2015/angular/obtservices.module.js +17 -1
  149. package/esm2015/angular/sabstravtech-obtservices-angular.js +15 -10
  150. package/esm2015/angular/updaters.js +4 -1
  151. package/esm2015/base/classes.js +2 -1
  152. package/esm2015/base/fetchers.js +28 -4
  153. package/esm2015/base/interfaces.js +4 -4
  154. package/esm2015/base/lib/vendor/classes/base-enterprise.js +14 -14
  155. package/esm2015/base/lib/vendor/classes/bookable-basket.js +11 -6
  156. package/esm2015/base/lib/vendor/classes/cabhire-enterprise-search.js +76 -103
  157. package/esm2015/base/lib/vendor/classes/carhire-enterprise-search.js +121 -18
  158. package/esm2015/base/lib/vendor/classes/enviroment.js +3 -1
  159. package/esm2015/base/lib/vendor/classes/eurostar-enterprise-search.js +540 -677
  160. package/esm2015/base/lib/vendor/classes/flight-enterprise-search.js +676 -298
  161. package/esm2015/base/lib/vendor/classes/helpers.js +260 -70
  162. package/esm2015/base/lib/vendor/classes/hotel-enterprise-search.js +289 -123
  163. package/esm2015/base/lib/vendor/classes/irl-direction.enum.js +6 -0
  164. package/esm2015/base/lib/vendor/classes/irl-enterprise-search.js +412 -694
  165. package/esm2015/base/lib/vendor/classes/lounges-enterprise-search.js +98 -5
  166. package/esm2015/base/lib/vendor/classes/management-info-and-valid.js +49 -30
  167. package/esm2015/base/lib/vendor/classes/modal-types.enum.js +5 -1
  168. package/esm2015/base/lib/vendor/classes/parking-enterprise-search.js +61 -5
  169. package/esm2015/base/lib/vendor/classes/rail-direction.enum.js +3 -3
  170. package/esm2015/base/lib/vendor/classes/rail-enterprise-search.js +1024 -682
  171. package/esm2015/base/lib/vendor/classes/rail-index-to-ticket.js +48 -0
  172. package/esm2015/base/lib/vendor/classes/supplementary-booking-info-impl.js +16 -4
  173. package/esm2015/base/lib/vendor/classes/user-favourite.enum.js +4 -1
  174. package/esm2015/base/lib/vendor/fetchers/apply-JIT-hotel-rules.fetcher.js +22 -0
  175. package/esm2015/base/lib/vendor/fetchers/apply-jit-flight-rules.js +10 -0
  176. package/esm2015/base/lib/vendor/fetchers/basket-fetcher.js +3 -3
  177. package/esm2015/base/lib/vendor/fetchers/conferma-office.fetcher.js +3 -3
  178. package/esm2015/base/lib/vendor/fetchers/flight-fare-rules.fetcher.js +11 -0
  179. package/esm2015/base/lib/vendor/fetchers/flight-quote.fetcher.js +12 -4
  180. package/esm2015/base/lib/vendor/fetchers/get-conferma-room-images.fetcher.js +11 -0
  181. package/esm2015/base/lib/vendor/fetchers/get-covid-microsite-token.fetcher.js +11 -0
  182. package/esm2015/base/lib/vendor/fetchers/get-flight-seat-map-fetcher.js +11 -0
  183. package/esm2015/base/lib/vendor/fetchers/get-rail-live-departures.fetcher.js +11 -0
  184. package/esm2015/base/lib/vendor/fetchers/get-user-favourite-searches.fetcher.js +10 -0
  185. package/esm2015/base/lib/vendor/fetchers/irl-discount-card-fetcher.js +11 -0
  186. package/esm2015/base/lib/vendor/fetchers/list-fetchable-enterprise.js +5 -3
  187. package/esm2015/base/lib/vendor/fetchers/object-fetchable-enterprise.js +4 -3
  188. package/esm2015/base/lib/vendor/fetchers/search-airlines.fetcher.js +3 -3
  189. package/esm2015/base/lib/vendor/fetchers/search-airports-fetcher.js +3 -3
  190. package/esm2015/base/lib/vendor/fetchers/search-conferma-cities.fetcher.js +3 -3
  191. package/esm2015/base/lib/vendor/fetchers/user-fetcher.js +3 -3
  192. package/esm2015/base/lib/vendor/interfaces/Icabhire-enterprise-search.js +1 -1
  193. package/esm2015/base/lib/vendor/interfaces/Icarhire-enterprise-search.js +1 -1
  194. package/esm2015/base/lib/vendor/interfaces/Ienterprise-basket.service.js +1 -1
  195. package/esm2015/base/lib/vendor/interfaces/Ieurostar-enterprise-search.js +1 -1
  196. package/esm2015/base/lib/vendor/interfaces/Iflight-enterprise-search.js +7 -1
  197. package/esm2015/base/lib/vendor/interfaces/Ihotel-enterprise-search.js +1 -1
  198. package/esm2015/base/lib/vendor/interfaces/Iirl-enterprise-search.js +1 -1
  199. package/esm2015/base/lib/vendor/interfaces/Ilounges-enterprise-search.js +1 -1
  200. package/esm2015/base/lib/vendor/interfaces/Imybookings.service.js +1 -1
  201. package/esm2015/base/lib/vendor/interfaces/Iparking-enterprise-search.js +1 -1
  202. package/esm2015/base/lib/vendor/interfaces/Irail-enterprise-search.js +1 -1
  203. package/esm2015/base/lib/vendor/interfaces/Isearch.service.js +1 -1
  204. package/esm2015/base/lib/vendor/interfaces/Iuser.service.js +1 -1
  205. package/esm2015/base/lib/vendor/interfaces/cab-hire-search-arg.interface.js +2 -0
  206. package/esm2015/base/lib/vendor/interfaces/car-hire-search-arg.interface.js +3 -0
  207. package/esm2015/base/lib/vendor/interfaces/enable-fresh-chat-interface.js +3 -0
  208. package/esm2015/base/lib/vendor/interfaces/eurostar-search-arg.interface.js +2 -0
  209. package/esm2015/base/lib/vendor/interfaces/flight-filters.interface.js +1 -1
  210. package/esm2015/base/lib/vendor/interfaces/flight-search-args.interface.js +2 -0
  211. package/esm2015/base/lib/vendor/interfaces/hotel-recent-search-args.interface.js +1 -1
  212. package/esm2015/base/lib/vendor/interfaces/irl-search-arg.interface.js +2 -0
  213. package/esm2015/base/lib/vendor/interfaces/rail-basket-item.interface.js +1 -1
  214. package/esm2015/base/lib/vendor/interfaces/rail-recent-search-args.interface.js +1 -1
  215. package/esm2015/base/lib/vendor/interfaces/rail-selected-ticket.interface.js +1 -1
  216. package/esm2015/base/lib/vendor/interfaces/summary-interface.js +2 -0
  217. package/esm2015/base/lib/vendor/interfaces/terms-and-conditions.interface.js +2 -0
  218. package/esm2015/base/lib/vendor/interfaces/user.data.js +1 -1
  219. package/esm2015/base/lib/vendor/services/enterprise-basket.service.js +107 -57
  220. package/esm2015/base/lib/vendor/services/hotel-avallibility.service.js +43 -5
  221. package/esm2015/base/lib/vendor/services/my-bookings.service.js +6 -2
  222. package/esm2015/base/lib/vendor/services/search.service.js +110 -46
  223. package/esm2015/base/lib/vendor/services/user.service.js +13 -2
  224. package/esm2015/base/lib/vendor/types/graphql.types.js +35 -28
  225. package/esm2015/base/lib/vendor/types/types.js +35 -2
  226. package/esm2015/base/lib/vendor/updaters/cancel-booking-updater.js +11 -0
  227. package/esm2015/base/lib/vendor/updaters/confirm-messages-updater.js +11 -0
  228. package/esm2015/base/lib/vendor/updaters/remove-favourite-search-updater.js +11 -0
  229. package/esm2015/base/lib/vendor/updaters/save-favourite-search-updater.js +11 -0
  230. package/esm2015/base/updaters.js +5 -1
  231. package/fesm2015/sabstravtech-obtservices-angular.js +1554 -2350
  232. package/fesm2015/sabstravtech-obtservices-angular.js.map +1 -1
  233. package/fesm2015/sabstravtech-obtservices-base.js +8088 -6752
  234. package/fesm2015/sabstravtech-obtservices-base.js.map +1 -1
  235. package/package.json +1 -1
  236. package/base/lib/vendor/interfaces/rail-journey-leg.interface.d.ts +0 -6
  237. package/base/lib/vendor/interfaces/rail-ticket-group.interface.d.ts +0 -26
  238. package/base/lib/vendor/interfaces/rail-ticket-groups.interface.d.ts +0 -4
  239. package/esm2015/base/lib/vendor/interfaces/rail-journey-leg.interface.js +0 -2
  240. package/esm2015/base/lib/vendor/interfaces/rail-ticket-group.interface.js +0 -2
  241. package/esm2015/base/lib/vendor/interfaces/rail-ticket-groups.interface.js +0 -2
@@ -1,7 +1,7 @@
1
1
  import { __awaiter } from "tslib";
2
2
  import moment from 'moment';
3
3
  import Ajv from 'ajv';
4
- import { BehaviorSubject, Subject } from 'rxjs';
4
+ import { BehaviorSubject, of, Subject } from 'rxjs';
5
5
  import { switchMap, take, tap, map } from 'rxjs/operators';
6
6
  import { BasketStatus, PassengerType, ServiceType } from '../types/graphql.types';
7
7
  import { MenuSlideEnum } from '../types/types';
@@ -38,7 +38,7 @@ export class InternalBasket {
38
38
  basket.basketItems[0].perItemPhoneNumber === undefined) {
39
39
  // We're in approved state so we need to make sure we have the supplement stuff
40
40
  this.basketService
41
- .getBasket({ id: basket.id, withSupplemental: true })
41
+ .getBasket({ convertCurrencyTo: 'GBP', id: basket.id, withSupplemental: true })
42
42
  .subscribe((newBasket) => {
43
43
  this.next(newBasket);
44
44
  });
@@ -134,10 +134,15 @@ export class BaseEnterpriseBasketService {
134
134
  price: 0
135
135
  },
136
136
  {
137
- type: ServiceType.InternationalRail,
137
+ type: ServiceType.Eurostar,
138
138
  text: 'EUROSTAR',
139
139
  price: 0
140
140
  },
141
+ {
142
+ type: ServiceType.InternationalRail,
143
+ text: 'INTERNATIONAL RAIL',
144
+ price: 0
145
+ },
141
146
  {
142
147
  type: ServiceType.Parking,
143
148
  text: 'PARKING',
@@ -187,7 +192,7 @@ export class BaseEnterpriseBasketService {
187
192
  })
188
193
  .pipe(take(1))
189
194
  .subscribe((baskets) => {
190
- this.currentBaskets = baskets.map((basket) => {
195
+ const currentBaskets = baskets.map((basket) => {
191
196
  if (basket) {
192
197
  let intBasket = this.findBasket(basket.id);
193
198
  if (!intBasket) {
@@ -197,9 +202,9 @@ export class BaseEnterpriseBasketService {
197
202
  return intBasket;
198
203
  }
199
204
  });
200
- this.baskets.next(this.currentBaskets);
201
- if (this.currentBaskets.length > 0) {
202
- this.currentBasketID = this.currentBaskets[0].id;
205
+ this.baskets.next(currentBaskets);
206
+ if (currentBaskets.length > 0) {
207
+ this.currentBasketID = currentBaskets[0].id;
203
208
  }
204
209
  else {
205
210
  this.currentBasketID = null;
@@ -219,7 +224,6 @@ export class BaseEnterpriseBasketService {
219
224
  }
220
225
  getAllOpenBaskets(user_id) {
221
226
  return __awaiter(this, void 0, void 0, function* () {
222
- // let intBasket = this.findBasket(user_id)
223
227
  return this.getUserBasketsFetcher
224
228
  .fetchList({ basketStatus: BasketStatus.Open, user: user_id })
225
229
  .pipe(take(1), map((results) => {
@@ -231,13 +235,6 @@ export class BaseEnterpriseBasketService {
231
235
  }
232
236
  });
233
237
  }
234
- else {
235
- const intBasket = new InternalBasket({
236
- id: user_id,
237
- basketItems: []
238
- }, this.helpers, this, this.getUserFetcher);
239
- this.currentBaskets.push(intBasket);
240
- }
241
238
  return results;
242
239
  }))
243
240
  .toPromise();
@@ -245,10 +242,17 @@ export class BaseEnterpriseBasketService {
245
242
  }
246
243
  addToBasket(item, intBasket, searchService, travellers = []) {
247
244
  return __awaiter(this, void 0, void 0, function* () {
245
+ item.convertCurrencyTo = 'GBP';
248
246
  if ((travellers === null || travellers === void 0 ? void 0 : travellers.length) > 0) {
249
247
  item.users = this.helpers.makeUsers(travellers);
250
248
  item.leadPassenger = item.users[0].id;
251
249
  }
250
+ item.outboundDate = item.outboundDate
251
+ ? new Date(this.helpers.formatIsoDateTime(item.outboundDate))
252
+ : item.outboundDate;
253
+ item.inboundDate = item.inboundDate
254
+ ? new Date(this.helpers.formatIsoDateTime(item.inboundDate))
255
+ : item.inboundDate;
252
256
  item = this.checkDetails(item);
253
257
  if (item && intBasket) {
254
258
  this.addItemToBasketUpdater
@@ -280,7 +284,7 @@ export class BaseEnterpriseBasketService {
280
284
  this.currentBaskets.push(intBasket);
281
285
  }
282
286
  this.basketFetcher
283
- .fetchOne({ id })
287
+ .fetchOne({ convertCurrencyTo: 'GBP', id })
284
288
  .subscribe((newBasket) => {
285
289
  intBasket.next(newBasket);
286
290
  });
@@ -302,12 +306,47 @@ export class BaseEnterpriseBasketService {
302
306
  });
303
307
  }
304
308
  removeBasketItem(basketId, item) {
305
- const intBasket = this.findBasket(basketId);
306
- this.removeItemFromBasketUpdater
307
- .updateOne({ basketItem: item.id })
308
- .subscribe((newBasket) => {
309
- intBasket.next(Object.assign(Object.assign({}, intBasket.subject.value), newBasket));
310
- this.basketChangeEmitter.next(basketId);
309
+ return __awaiter(this, void 0, void 0, function* () {
310
+ const intBasket = this.findBasket(basketId);
311
+ // if it's a hotel remove all linked items
312
+ if (item.service.type === ServiceType.Hotel) {
313
+ const hotelItems = intBasket.subject.value.basketItems.filter((basketItem) => {
314
+ return (item.detail.hotelId === basketItem.detail.hotelId &&
315
+ item.detail.rooms[0].id === basketItem.detail.rooms[0].id &&
316
+ item.detail.rooms[0].checkIn ===
317
+ basketItem.detail.rooms[0].checkIn &&
318
+ item.detail.rooms[0].checkOut ===
319
+ basketItem.detail.rooms[0].checkOut);
320
+ });
321
+ if (hotelItems.length > 1) {
322
+ // ENT-2447 new modal made in LU, needs to be made in all obts and app or will get error
323
+ yield this.modalService.open(ModalTypes.WarningRemoveModalComponent);
324
+ hotelItems.forEach((item) => {
325
+ this.removeItemFromBasketUpdater
326
+ .updateOne({ convertCurrencyTo: 'GBP', basketItem: item.id })
327
+ .subscribe((newBasket) => {
328
+ intBasket.next(Object.assign(Object.assign({}, intBasket.subject.value), newBasket));
329
+ this.basketChangeEmitter.next(basketId);
330
+ });
331
+ });
332
+ }
333
+ else {
334
+ this.removeItemFromBasketUpdater
335
+ .updateOne({ convertCurrencyTo: 'GBP', basketItem: item.id })
336
+ .subscribe((newBasket) => {
337
+ intBasket.next(Object.assign(Object.assign({}, intBasket.subject.value), newBasket));
338
+ this.basketChangeEmitter.next(basketId);
339
+ });
340
+ }
341
+ }
342
+ else {
343
+ this.removeItemFromBasketUpdater
344
+ .updateOne({ convertCurrencyTo: 'GBP', basketItem: item.id })
345
+ .subscribe((newBasket) => {
346
+ intBasket.next(Object.assign(Object.assign({}, intBasket.subject.value), newBasket));
347
+ this.basketChangeEmitter.next(basketId);
348
+ });
349
+ }
311
350
  });
312
351
  }
313
352
  getDefaultBasket(getBookedBasket = false) {
@@ -333,9 +372,8 @@ export class BaseEnterpriseBasketService {
333
372
  .userData.value.user_id.toString());
334
373
  // find the last updated basket
335
374
  if (!(allOpenBaskets === null || allOpenBaskets === void 0 ? void 0 : allOpenBaskets.length)) {
375
+ // ENT-2616 removed adding to current basket as this was a dupe
336
376
  basket = yield this.createBasket();
337
- this.currentBaskets.push(basket);
338
- this.baskets.next(this.currentBaskets);
339
377
  }
340
378
  else {
341
379
  // baskets are already sorted by last updated - return the last updated basket
@@ -371,6 +409,7 @@ export class BaseEnterpriseBasketService {
371
409
  };
372
410
  const intBasket = new InternalBasket(basket, this.helpers, this, this.getUserFetcher);
373
411
  // { subject: new BehaviorSubject<Basket>(basket), tempid: basket.id, id: basket.id, title: basket.id };
412
+ // ent-2616 only place we need to add a basket to current baskets
374
413
  const toReturn = yield this.createBasketOnDB(intBasket);
375
414
  this.currentBaskets.push(toReturn);
376
415
  this.baskets.next(this.currentBaskets);
@@ -418,6 +457,17 @@ export class BaseEnterpriseBasketService {
418
457
  }
419
458
  // check the item.detail object against the relevant service detailSchema using Ajv
420
459
  const ajv = new Ajv();
460
+ // Custom Javascript ISO Date Time format
461
+ ajv.addFormat('js-date-time', (dateTimeString) => {
462
+ if (typeof dateTimeString === 'object' &&
463
+ dateTimeString.hasOwnProperty('toISOString')) {
464
+ dateTimeString = dateTimeString.toISOString();
465
+ }
466
+ return !isNaN(Date.parse(dateTimeString)); // any test that returns true/false
467
+ });
468
+ ajv.addFormat('railSeating', (rilseating) => {
469
+ return true;
470
+ });
421
471
  const validateDetailSchema = ajv.compile(serviceToCheck.detailSchema);
422
472
  const validateSearchSchema = ajv.compile(serviceToCheck.searchQuerySchema);
423
473
  // if there are any moment date objects in the searchQuery object convert these to date-time strings
@@ -427,7 +477,7 @@ export class BaseEnterpriseBasketService {
427
477
  const error = `Item searchQuery is not valid for ${serviceToCheck.name} search schema.`;
428
478
  console.warn('searchSchema', serviceToCheck.searchQuerySchema);
429
479
  console.warn('item.searchQuery', item.searchQuery);
430
- console.log(validateSearchSchema.errors);
480
+ console.warn('Search Query Validation errors', validateSearchSchema.errors);
431
481
  this.modalService.open(ModalTypes.ModalErrorComponent, {}, { error });
432
482
  return null;
433
483
  }
@@ -435,7 +485,7 @@ export class BaseEnterpriseBasketService {
435
485
  const error = `Item detail is not valid for ${serviceToCheck.name} detail schema.`;
436
486
  console.warn('detailSchema', serviceToCheck.detailSchema);
437
487
  console.warn('item.detail', item.detail);
438
- console.log('Schema errors', validateDetailSchema.errors);
488
+ console.warn('Detail errors', validateDetailSchema.errors);
439
489
  this.modalService.open(ModalTypes.ModalErrorComponent, {}, { error });
440
490
  return null;
441
491
  }
@@ -446,26 +496,19 @@ export class BaseEnterpriseBasketService {
446
496
  return (basket === null || basket === void 0 ? void 0 : basket.subject.value.basketItems.length) || 0;
447
497
  }
448
498
  removeBasket(basketid) {
449
- return __awaiter(this, void 0, void 0, function* () {
450
- if (basketid) {
451
- yield this.deleteBasketUpdater
452
- .updateOne({ id: basketid })
453
- .pipe(take(1), switchMap((data) => {
454
- var _a, _b;
455
- (_a = this.findBasket(basketid)) === null || _a === void 0 ? void 0 : _a.destructor();
456
- this.currentBaskets = this.currentBaskets.filter((intBa) => {
457
- return intBa.id !== basketid;
458
- });
459
- this.baskets.next(this.currentBaskets);
460
- if (basketid === this.currentBasketID) {
461
- this.currentBasketID = ((_b = this.currentBaskets[0]) === null || _b === void 0 ? void 0 : _b.id) || null;
462
- this.basketChangeEmitter.next(this.currentBasketID);
463
- }
464
- return data;
465
- }))
466
- .toPromise();
467
- }
468
- });
499
+ if (basketid) {
500
+ return this.deleteBasketUpdater.updateOne({ id: basketid }).pipe(take(1), switchMap((data) => {
501
+ var _a, _b;
502
+ (_a = this.findBasket(basketid)) === null || _a === void 0 ? void 0 : _a.destructor();
503
+ this.currentBaskets = this.currentBaskets.filter((intBa) => intBa.id !== basketid);
504
+ this.baskets.next(this.currentBaskets);
505
+ if (basketid === this.currentBasketID) {
506
+ this.currentBasketID = ((_b = this.currentBaskets[0]) === null || _b === void 0 ? void 0 : _b.id) || null;
507
+ this.basketChangeEmitter.next(this.currentBasketID);
508
+ }
509
+ return of(data);
510
+ }));
511
+ }
469
512
  }
470
513
  continueSearchAndBook(basketItems, itiniaryUrl, searchService) {
471
514
  const latestBasketItems = this.getLatestBasketItemForTypes(basketItems);
@@ -489,6 +532,7 @@ export class BaseEnterpriseBasketService {
489
532
  : PassengerType.Adult;
490
533
  this.addUserToBasketItem
491
534
  .updateOne({
535
+ convertCurrencyTo: 'GBP',
492
536
  basketItem: basketItem.id,
493
537
  users: [
494
538
  {
@@ -503,7 +547,7 @@ export class BaseEnterpriseBasketService {
503
547
  });
504
548
  }
505
549
  else {
506
- this.basketFetcher.fetchOne({ id: basket.id }).subscribe((basket1) => {
550
+ this.basketFetcher.fetchOne({ convertCurrencyTo: 'GBP', id: basket.id }).subscribe((basket1) => {
507
551
  basket.subject.next(Object.assign(Object.assign({}, basket.subject.value), basket1));
508
552
  }, (_) => { }, () => {
509
553
  basket.next(basket.subject.value);
@@ -514,6 +558,7 @@ export class BaseEnterpriseBasketService {
514
558
  const basket = this.findBasket(basketid);
515
559
  if (index < 1) {
516
560
  this.SetBasketItemLeadPassenger.updateOne({
561
+ convertCurrencyTo: 'GBP',
517
562
  id: basketItem.id,
518
563
  user: travellers.id,
519
564
  withSupplemental: false
@@ -522,7 +567,7 @@ export class BaseEnterpriseBasketService {
522
567
  });
523
568
  }
524
569
  else {
525
- this.basketFetcher.fetchOne({ id: basket.id }).subscribe((basket1) => {
570
+ this.basketFetcher.fetchOne({ convertCurrencyTo: 'GBP', id: basket.id }).subscribe((basket1) => {
526
571
  basket.subject.next(Object.assign(Object.assign({}, basket.subject.value), basket1));
527
572
  }, (_) => { }, () => {
528
573
  basket.next(basket.subject.value);
@@ -544,16 +589,17 @@ export class BaseEnterpriseBasketService {
544
589
  });
545
590
  }
546
591
  revalidate(basketid) {
547
- this.updateBasket(basketid, this.revalidateBasketUpdater.updateOne({ id: basketid }));
592
+ this.updateBasket(basketid, this.revalidateBasketUpdater.updateOne({ convertCurrencyTo: 'GBP', id: basketid }));
548
593
  }
549
594
  setBasketItemMiGroup(basketid, basketItemid, group) {
550
595
  this.updateBasket(basketid, this.setBasketItemMiGroupUpdater.updateOne({
596
+ convertCurrencyTo: 'GBP',
551
597
  basketItem: basketItemid,
552
598
  group
553
599
  }));
554
600
  }
555
601
  acceptNewPrice(basketid, item) {
556
- this.updateBasket(basketid, this.acceptNewPriceUpdater.updateOne({ id: item.id }));
602
+ this.updateBasket(basketid, this.acceptNewPriceUpdater.updateOne({ convertCurrencyTo: 'GBP', id: item.id }));
557
603
  }
558
604
  validateFreeValeMi(miItem, freeValue) {
559
605
  return new Promise((resolve, reject) => {
@@ -565,6 +611,7 @@ export class BaseEnterpriseBasketService {
565
611
  setMiFreeValue(basketid, miItem, freeValue, userId = null) {
566
612
  const intBasket = this.findBasket(basketid);
567
613
  const args = {
614
+ convertCurrencyTo: 'GBP',
568
615
  mi: miItem.id,
569
616
  miFreeValue: freeValue
570
617
  };
@@ -582,6 +629,7 @@ export class BaseEnterpriseBasketService {
582
629
  }
583
630
  setMiSelectedValue(basketid, miItem, selectedValue, userId = null) {
584
631
  const args = {
632
+ convertCurrencyTo: 'GBP',
585
633
  mi: miItem.id,
586
634
  miValue: selectedValue
587
635
  };
@@ -612,21 +660,23 @@ export class BaseEnterpriseBasketService {
612
660
  }
613
661
  sendBasketForApproval(basketid) {
614
662
  return this.updateBasket(basketid, this.sendBasketForApprovalUpdater
615
- .updateOne({ basket: basketid })
663
+ .updateOne({ convertCurrencyTo: 'GBP', basket: basketid })
616
664
  .pipe(take(1)));
617
665
  }
618
666
  setBasketItemPaymentOption(basket, basketItem, paymentMethod) {
619
667
  return this.updateBasket(basket.id, this.setPaymentMethodUpdater.updateOne({
668
+ convertCurrencyTo: 'GBP',
620
669
  basketItem: basketItem.id,
621
670
  paymentMethod
622
671
  }));
623
672
  }
624
673
  bookBasket(basketid, supplementaryInfo) {
625
- this.updateBasket(basketid, this.bookBasketUpdater.updateOne({ id: basketid, supplementaryInfo }));
674
+ return this.updateBasket(basketid, this.bookBasketUpdater.updateOne({ convertCurrencyTo: 'GBP', id: basketid, supplementaryInfo }));
626
675
  }
627
676
  moveBasketItem(originalBasketId, basketItem, basketIdToMoveTo) {
628
677
  this.moveItemToADifferentBasket
629
678
  .updateOne({
679
+ convertCurrencyTo: 'GBP',
630
680
  basketItem: basketItem.id,
631
681
  newBasket: basketIdToMoveTo
632
682
  })
@@ -636,17 +686,17 @@ export class BaseEnterpriseBasketService {
636
686
  });
637
687
  }
638
688
  updateBasketNotes(basketId, notes) {
639
- this.updateBasket(basketId, this.updateBasketNotesUpdater.updateOne({ id: basketId, notes }));
689
+ this.updateBasket(basketId, this.updateBasketNotesUpdater.updateOne({ convertCurrencyTo: 'GBP', id: basketId, notes }));
640
690
  }
641
691
  updateBasketTitle(basketId, title) {
642
- this.updateBasket(basketId, this.updateBasketTitleUpdater.updateOne({ id: basketId, newTitle: title }));
692
+ this.updateBasket(basketId, this.updateBasketTitleUpdater.updateOne({ convertCurrencyTo: 'GBP', id: basketId, newTitle: title }));
643
693
  }
644
694
  getBasket(query) {
645
695
  return this.basketFetcher.fetchOne(query);
646
696
  }
647
697
  atLeastOneSearchChosen() {
648
- const intBasket = this.findBasket(this.currentBasketID);
649
- return (intBasket === null || intBasket === void 0 ? void 0 : intBasket.subject.value.basketItems.length) > 0;
698
+ // if we have any item on any basket we show baskets in search screen
699
+ return !!this.currentBaskets.filter((basket) => basket.subject.value.basketItems.length).length;
650
700
  }
651
701
  getBasketStats(index) {
652
702
  var _a, _b, _c;
@@ -667,4 +717,4 @@ export class BaseEnterpriseBasketService {
667
717
  return this.basketPrices;
668
718
  }
669
719
  }
670
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29idHNlcnZpY2VzL2Jhc2Uvc3JjL2xpYi92ZW5kb3Ivc2VydmljZXMvZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQztBQUN0QixPQUFPLEVBQUUsZUFBZSxFQUF3QixPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNELE9BQU8sRUFJTCxZQUFZLEVBRVosYUFBYSxFQUdiLFdBQVcsRUFHWixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFJTCxhQUFhLEVBRWQsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDMUYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFtR2pGLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQztBQStDekIsTUFBTSxPQUFPLGNBQWM7SUFjekIsWUFDRSxNQUF3QixFQUNoQixPQUEyQixFQUMzQixhQUErQyxFQUMvQyxjQUFxQztRQUZyQyxZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQUMzQixrQkFBYSxHQUFiLGFBQWEsQ0FBa0M7UUFDL0MsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBRTdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ2xCLE9BQU8sRUFBRSxJQUFJLGVBQWUsaUNBQ3ZCLE1BQU0sS0FDVCxN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WUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7O1lBQzVDLElBQUksQ0FBQyxLQUFLLHFCQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQywwQ0FBRSxPQUFPLDBDQUFFLEtBQUssMENBQUUsV0FBVyxDQUNoRSxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQ2hELE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IEFqdiBmcm9tICdhanYnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIE9ic2VydmVyLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFrZSwgdGFwLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIEFkZEl0ZW1Ub0Jhc2tldCxcclxuICBCYXNrZXQsXHJcbiAgQmFza2V0SXRlbSxcclxuICBCYXNrZXRTdGF0dXMsXHJcbiAgTWFuYWdlbWVudEluZm8sXHJcbiAgUGFzc2VuZ2VyVHlwZSxcclxuICBQYXltZW50TWV0aG9kLFxyXG4gIFNlcnZpY2UsXHJcbiAgU2VydmljZVR5cGUsXHJcbiAgU2V0QmFza2V0SXRlbU1pVmFsdWUsXHJcbiAgU3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvXHJcbn0gZnJvbSAnLi4vdHlwZXMvZ3JhcGhxbC50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgR2V0TWlBdXRvU3VnZXN0aW9uQXJyYXksXHJcbiAgR2V0VXNlckJhc2tldEl0ZW1SZXN1bHQsXHJcbiAgR2V0VXNlckJhc2tldFJlc3VsdCxcclxuICBNZW51U2xpZGVFbnVtLFxyXG4gIFVzZXJCYXNrZXRSZXN1bHRcclxufSBmcm9tICcuLi90eXBlcy90eXBlcyc7XHJcbmltcG9ydCB7IE1hbmFnZW1lbnRJbmZvQW5kSXNWYWxpZCB9IGZyb20gJy4uL2NsYXNzZXMvbWFuYWdlbWVudC1pbmZvLWFuZC12YWxpZCc7XHJcbmltcG9ydCB7IE1vZGFsVHlwZXMgfSBmcm9tICcuLi9jbGFzc2VzL21vZGFsLXR5cGVzLmVudW0nO1xyXG5pbXBvcnQgeyBTdXBwbGVtZW50YXJ5Qm9va2luZ0luZm9JbXBsIH0gZnJvbSAnLi4vY2xhc3Nlcy9zdXBwbGVtZW50YXJ5LWJvb2tpbmctaW5mby1pbXBsJztcclxuaW1wb3J0IHsgQmFza2V0SW5mb01pRGV0YWlsc0ltcGwgfSBmcm9tICcuLi9jbGFzc2VzL2Jhc2tldC1pbmZvLW1pLWRldGFpbHMuaW1wbCc7XHJcbmltcG9ydCB7IEJhc2VIZWxwZXJSb3V0aW5lcyB9IGZyb20gJy4uL2NsYXNzZXMvaGVscGVycyc7XHJcbmltcG9ydCB7IEJhc2VNb2RhbE9wZW5lclNlcnZpY2UgfSBmcm9tICcuL21vZGFsLW9wZW5lci5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBCYXNlR2V0VXNlckZldGNoZXIsXHJcbiAgU2VhcmNoR2V0VXNlckZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvdXNlci1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBBY2NlcHROZXdQcmljZUZldGNoZXJUeXBlLFxyXG4gIEJhc2VBY2NlcHROZXdQcmljZVVwZGF0ZXJcclxufSBmcm9tICcuLi91cGRhdGVycy9hY2NlcHQtbmV3LXByaWNlLnVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRCYXNrZXRGZXRjaGVyLFxyXG4gIEdldEJhc2tldEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvYmFza2V0LWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRVc2VyQmFza2V0c0ZldGNoZXIsXHJcbiAgR2V0VXNlckJhc2tldHNGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC11c2Vycy1iYXNrZXRzLWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRNaUF1dG9TdWdlc3Rpb25GZXRjaGVyLFxyXG4gIE1pQXV0b1N1Z2dlc3RGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldE1pQXV0b1N1Z2VzdGlvbnMuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQWRkSXRlbVRvQmFza2V0RmV0Y2hlclR5cGUsXHJcbiAgQmFzZUFkZEl0ZW1Ub0Jhc2tldFVwZGF0ZXJcclxufSBmcm9tICcuLi91cGRhdGVycy9hZGQtaXRlbS10by1iYXNrZXQudXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQWRkVXNlckJhc2tldEZldGNoZXJUeXBlLFxyXG4gIEJhc2VBZGRVc2VyVG9CYXNrZXRJdGVtVXBkYXRlclxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL2FkZFVzZXJUb0Jhc2tldEl0ZW0nO1xyXG5pbXBvcnQge1xyXG4gIFNldEJhc2tldEl0ZW1MZWFkUGFzc2VuZ2VyRmV0Y2hlclR5cGUsXHJcbiAgQmFzZVNldEJhc2tldEl0ZW1MZWFkUGFzc2VuZ2VyVXBkYXRlclxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3NldC1iYXNrZXQtaXRlbS1sZWFkLXBhc3Nlbmdlci51cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlQm9va0Jhc2tldFVwZGF0ZXIsXHJcbiAgQm9va0Jhc2tldEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvYm9vay1iYXNrZXQtdXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUNyZWF0ZUJhc2tldFVwZGF0ZXIsXHJcbiAgQ3JlYXRlQmFza2V0RmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9jcmVhdGUtYmFza2V0LXVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VEZWxldGVCYXNrZXRVcGRhdGVyLFxyXG4gIERlbGV0ZUJhc2tldEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvcmVtb3ZlLWJhc2tldC11cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlUmVtb3ZlSXRlbUZyb21CYXNrZXRVcGRhdGVyLFxyXG4gIERlbGV0ZUJhc2tldEl0ZW1GZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3JlbW92ZS1pdGVtLWZyb20tYmFza2V0LnVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VSZXZhbGlkYXRlQmFza2V0VXBkYXRlcixcclxuICBSZXZhbGlkYXRlQmFza2V0RmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9yZXZhbGlkYXRlLWJhc2tldC11cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlU2VuZEJhc2tldEZvckFwcHJvdmFsVXBkYXRlcixcclxuICBTZW5kQmFza2V0QXBwcm92YWxGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3NlbmQtYmFza2V0LWZvci1hcHByb3ZhbC51cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlU2V0QmFza2V0SXRlbU1pR3JvdXBVcGRhdGVyLFxyXG4gIFNldEJhc2tldEl0TWlHcm91cEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvc2V0LWJhc2tldC1pdGVtLW1pLWdyb3VwJztcclxuaW1wb3J0IHsgVHJhdmVsbGVyIH0gZnJvbSAnLi4vbW9kZWxzL3RyYXZlbGxlci5vYmplY3QnO1xyXG5pbXBvcnQgeyBTZWFyY2hPYmplY3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3NlYXJjaC1vYmplY3RzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNldEJhc2tldEl0ZW1NaVZhbHVlVXBkYXRlcixcclxuICBTZXRCYXNrZXRJdE1pRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9zZXQtYmFza2V0LWl0ZW0tbWktdmFsdWUtdXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVZhbGlkYXRlTWlGcmVlVmFsdWVUZXN0ZXIsXHJcbiAgVmFsaWRhdGVNaUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdGVzdGVycy92YWxpZGF0ZS1taS1mcmVlLXZhbHVlLnRlc3Rlcic7XHJcbmltcG9ydCB7IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc2VhcmNoLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEZ1bGxVc2VyRGV0YWlscyxcclxuICBVc2VyU2VydmljZUludGVyZmFjZVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSXVzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2VcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0llbnRlcnByaXNlLWJhc2tldC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc3VwcGxlbWVudGFyeS1ib29raW5nLWluZm8taW1wbCc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZW1vdmVCYXNrZXRJdGVtVG9CYXNrZXQsXHJcbiAgTW92ZUl0ZW1Ub0FEaWZmZXJlbnRCYXNrZXRUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvbW92ZS1iYXNrZXQtaXRlbS10by1iYXNrZXQnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VVcGRhdGVCYXNrZXROb3Rlc1R5cGUsXHJcbiAgQmFzZVVwZGF0ZUJhc2tldE5vdGVVcGRhdGVyXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvdXBkYXRlLWJhc2tldC1ub3Rlcy11cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlVXBkYXRlQmFza2V0VGl0bGVUeXBlLFxyXG4gIEJhc2VVcGRhdGVCYXNrZXRUaXRsZVVwZGF0ZXJcclxufSBmcm9tICcuLi91cGRhdGVycy91cGRhdGUtYmFza2V0LXRpdGxlLXVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VTZXRQYXltZW50T3B0aW9uVXBkYXRlcixcclxuICBTZXRCYXNrZXRJdGVtUGF5bWVudE1ldGhvZFR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9zZXQtYmFza2V0LWl0ZW0tcGF5bWVuci1vcHRpb24udXBkYXRlcic7XHJcbmNvbnN0IFRFTVBJRCA9ICdURU1QSURfJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQmFza2V0QW5kSXRlbSB7XHJcbiAgYmFza2V0SWQ6IHN0cmluZztcclxuICBpdGVtOiBCYXNrZXRJdGVtO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgTWlHcm91cERldGFpbCB7XHJcbiAgdHlwZTogU2VydmljZVR5cGU7XHJcbiAgb3B0aW9uczogc3RyaW5nW107XHJcbiAgYmFza2V0SXRlbTogQmFza2V0SXRlbTtcclxuICB2YWx1ZTogc3RyaW5nO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgQmFza2V0SXRlbU1hbmFnZW1lbnRJbmZvIHtcclxuICBtaVBlckl0ZW06IE1hbmFnZW1lbnRJbmZvQW5kSXNWYWxpZFtdO1xyXG4gIG1pUGVyVXNlcjoge1xyXG4gICAgW2tleTogc3RyaW5nXToge1xyXG4gICAgICBtYW5hZ2VtZW50SW5mbzogTWFuYWdlbWVudEluZm9BbmRJc1ZhbGlkW107XHJcbiAgICAgIHN1cHBsZW1lbnRhcnlCb29raW5nSW5mbz86IFN1cHBsZW1lbnRhcnlCb29raW5nSW5mb0ludGVyZmFjZTtcclxuICAgIH07XHJcbiAgfTtcclxuICB1c2Vyczogc3RyaW5nW107XHJcbiAgYmFza2V0SXRlbTogQmFza2V0SXRlbTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBCYXNrZXRJbmZvcm1hdGlvbiB7XHJcbiAgcHJpY2VzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9O1xyXG4gIG1peGVkQ3VycmVuY3k6IGJvb2xlYW47XHJcbiAgY291bnQ6IG51bWJlcjtcclxuICBtaUdyb3VwczogTWlHcm91cERldGFpbFtdO1xyXG4gIGJhc2tldEluZm9NaURldGFpbHM6IEJhc2tldEluZm9NaURldGFpbHNJbXBsW107XHJcbiAgc3VwcEluZm86IFN1cHBsZW1lbnRhcnlCb29raW5nSW5mb0ludGVyZmFjZVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEJhc2tldFByaWNlc0xpc3Qge1xyXG4gIHR5cGU6IFNlcnZpY2VUeXBlO1xyXG4gIHByaWNlOiBudW1iZXI7XHJcbiAgY3VycmVuY3k/OiBzdHJpbmc7XHJcbiAgdGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEJhc2tldFByaWNlcyB7XHJcbiAgdG90YWw6IG51bWJlcjtcclxuICBjdXJyZW5jeT86IHN0cmluZztcclxuICBsaXN0OiBCYXNrZXRQcmljZXNMaXN0W107XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEJhc2tldERldGFpbHMgPSBVc2VyQmFza2V0UmVzdWx0ICYgQmFza2V0SW5mb3JtYXRpb247XHJcbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEJhc2tldDxRIGV4dGVuZHMgU2VhcmNoR2V0VXNlckZldGNoZXJUeXBlPlxyXG4gIGltcGxlbWVudHMgQmFza2V0SW5mb3JtYXRpb24sIEludGVybmFsQmFza2V0SW50ZXJmYWNlXHJcbntcclxuICBzdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QmFza2V0RGV0YWlscz47XHJcbiAgaWQ/OiBzdHJpbmc7XHJcbiAgdGVtcGlkPzogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgcHJpY2VzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9O1xyXG4gIG1peGVkQ3VycmVuY3k6IGJvb2xlYW47XHJcbiAgY291bnQ6IG51bWJlcjtcclxuICBtaUdyb3VwczogTWlHcm91cERldGFpbFtdO1xyXG4gIGJhc2tldEluZm9NaURldGFpbHM6IEJhc2tldEluZm9NaURldGFpbHNJbXBsW107XHJcbiAgc3VwcEluZm86IFN1cHBsZW1lbnRhcnlCb29raW5nSW5mb0ludGVyZmFjZVtdO1xyXG4gIGdyYW5kVG90YWw6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH07XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBiYXNrZXQ6IFVzZXJCYXNrZXRSZXN1bHQsXHJcbiAgICBwcml2YXRlIGhlbHBlcnM6IEJhc2VIZWxwZXJSb3V0aW5lcyxcclxuICAgIHByaXZhdGUgYmFza2V0U2VydmljZTogRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBwcml2YXRlIGdldFVzZXJGZXRjaGVyOiBCYXNlR2V0VXNlckZldGNoZXI8UT5cclxuICApIHtcclxuICAgIE9iamVjdC5hc3NpZ24odGhpcywge1xyXG4gICAgICBzdWJqZWN0OiBuZXcgQmVoYXZpb3JTdWJqZWN0PEJhc2tldERldGFpbHM+KHtcclxuICAgICAgICAuLi5iYXNrZXQsXHJcbiAgICAgICAgcHJpY2VzOiB7fSxcclxuICAgICAgICBtaXhlZEN1cnJlbmN5OiBmYWxzZSxcclxuICAgICAgICBjb3VudDogMCxcclxuICAgICAgICBtaUdyb3VwczogW10sXHJcbiAgICAgICAgYmFza2V0SW5mb01pRGV0YWlsczogW10sXHJcbiAgICAgICAgc3VwcEluZm86IFtdXHJcbiAgICAgIH0pLFxyXG4gICAgICB0ZW1waWQ6IGJhc2tldC5pZCxcclxuICAgICAgaWQ6IGJhc2tldC5pZCxcclxuICAgICAgdGl0bGU6IGJhc2tldC50aXRsZSxcclxuICAgICAgcHJpY2VzOiB7fSxcclxuICAgICAgbWl4ZWRDdXJyZW5jeTogZmFsc2UsXHJcbiAgICAgIGNvdW50OiAwLFxyXG4gICAgICBtaUdyb3VwczogW10sXHJcbiAgICAgIGJhc2tldEluZm9NaURldGFpbHM6IFtdLFxyXG4gICAgICBzdXBwSW5mbzogW11cclxuICAgIH0pO1xyXG4gICAgdGhpcy5uZXh0KGJhc2tldCk7XHJcbiAgfVxyXG5cclxuICBkZXN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5zdWJqZWN0LmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBuZXh0KGJhc2tldDogVXNlckJhc2tldFJlc3VsdCkge1xyXG4gICAgYmFza2V0ID0gdGhpcy5oZWxwZXJzLmNsb25lKGJhc2tldCk7XHJcbiAgICBpZiAoXHJcbiAgICAgIGJhc2tldC5zdGF0dXMgPT09IEJhc2tldFN0YXR1cy5BcHByb3ZlZCAmJlxyXG4gICAgICBiYXNrZXQuYmFza2V0SXRlbXNbMF0ucGVySXRlbVBob25lTnVtYmVyID09PSB1bmRlZmluZWRcclxuICAgICkge1xyXG4gICAgICAvLyBXZSdyZSBpbiBhcHByb3ZlZCBzdGF0ZSBzbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBzdXBwbGVtZW50IHN0dWZmXHJcbiAgICAgIHRoaXMuYmFza2V0U2VydmljZVxyXG4gICAgICAgIC5nZXRCYXNrZXQoeyBpZDogYmFza2V0LmlkLCB3aXRoU3VwcGxlbWVudGFsOiB0cnVlIH0pXHJcbiAgICAgICAgLnN1YnNjcmliZSgobmV3QmFza2V0OiBVc2VyQmFza2V0UmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5leHQobmV3QmFza2V0KTtcclxuICAgICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pZCA9IGJhc2tldC5pZDtcclxuICAgIHRoaXMudGl0bGUgPSBiYXNrZXQudGl0bGU7XHJcbiAgICBjb25zdCB0b1NlbmQ6IEJhc2tldERldGFpbHMgPSB7XHJcbiAgICAgIC4uLmJhc2tldCxcclxuICAgICAgLi4uKGJhc2tldC5iYXNrZXRJdGVtcyB8fCBbXSkucmVkdWNlKFxyXG4gICAgICAgIChhY2N1bTogQmFza2V0SW5mb3JtYXRpb24sIGl0ZW06IEJhc2tldEl0ZW0sIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGlmICghYWNjdW0ucHJpY2VzW2l0ZW0uY3VycmVuY3ldKSB7XHJcbiAgICAgICAgICAgIGFjY3VtLnByaWNlc1tpdGVtLmN1cnJlbmN5XSA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhY2N1bS5wcmljZXNbaXRlbS5jdXJyZW5jeV0gKz0gaXRlbS5wcmljZTtcclxuXHJcbiAgICAgICAgICBhY2N1bS5zdXBwSW5mby5wdXNoKFxyXG4gICAgICAgICAgICBuZXcgU3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvSW1wbChcclxuICAgICAgICAgICAgICBpdGVtLFxyXG4gICAgICAgICAgICAgIHRoaXMuaGVscGVycyxcclxuICAgICAgICAgICAgICB0aGlzLmdldFVzZXJGZXRjaGVyXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoaXRlbS5taUdyb3Vwc0F2YWlsYWJsZSAmJiBpdGVtLm1pR3JvdXBzQXZhaWxhYmxlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYWNjdW0ubWlHcm91cHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgdHlwZTogaXRlbS5zZXJ2aWNlLnR5cGUsXHJcbiAgICAgICAgICAgICAgb3B0aW9uczogaXRlbS5taUdyb3Vwc0F2YWlsYWJsZSxcclxuICAgICAgICAgICAgICBiYXNrZXRJdGVtOiBpdGVtLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBpdGVtLm1pR3JvdXBTZWxlY3RlZCB8fCAnJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChpdGVtLm1hbmFnZW1lbnRJbmZvPy5sZW5ndGggPiAwICYmIGl0ZW0udXNlcnM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYWNjdW0uYmFza2V0SW5mb01pRGV0YWlscy5wdXNoKFxyXG4gICAgICAgICAgICAgIG5ldyBCYXNrZXRJbmZvTWlEZXRhaWxzSW1wbChcclxuICAgICAgICAgICAgICAgIGl0ZW0sXHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2tldFNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlbHBlcnNcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gYWNjdW07XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcmljZXM6IHt9LFxyXG4gICAgICAgICAgbWl4ZWRDdXJyZW5jeTogZmFsc2UsXHJcbiAgICAgICAgICBjb3VudDogYmFza2V0LmJhc2tldEl0ZW1zPy5sZW5ndGggfHwgMCxcclxuICAgICAgICAgIG1pR3JvdXBzOiBbXSxcclxuICAgICAgICAgIGJhc2tldEluZm9NaURldGFpbHM6IFtdLFxyXG4gICAgICAgICAgc3VwcEluZm86IFtdXHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICB9O1xyXG4gICAgdG9TZW5kLm1peGVkQ3VycmVuY3kgPSBPYmplY3Qua2V5cyh0b1NlbmQucHJpY2VzKS5sZW5ndGggPiAxO1xyXG4gICAgdGhpcy5zdWJqZWN0Lm5leHQodG9TZW5kKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRW50ZXJwcmlzZUJhc2tldFNlcnZpY2U8XHJcbiAgQU5QVV9RIGV4dGVuZHMgQWNjZXB0TmV3UHJpY2VGZXRjaGVyVHlwZSxcclxuICBBSVRCX1EgZXh0ZW5kcyBBZGRJdGVtVG9CYXNrZXRGZXRjaGVyVHlwZSxcclxuICBBVVRCX1EgZXh0ZW5kcyBBZGRVc2VyQmFza2V0RmV0Y2hlclR5cGUsXHJcbiAgQ0JfUSBleHRlbmRzIENyZWF0ZUJhc2tldEZldGNoZXJUeXBlLFxyXG4gIEdCX1EgZXh0ZW5kcyBHZXRCYXNrZXRGZXRjaGVyVHlwZSxcclxuICBCQl9RIGV4dGVuZHMgQm9va0Jhc2tldEZldGNoZXJUeXBlLFxyXG4gIERCX1EgZXh0ZW5kcyBEZWxldGVCYXNrZXRGZXRjaGVyVHlwZSxcclxuICBHQVNfUSBleHRlbmRzIE1pQXV0b1N1Z2dlc3RGZXRjaGVyVHlwZSxcclxuICBSSUJfUSBleHRlbmRzIERlbGV0ZUJhc2tldEl0ZW1GZXRjaGVyVHlwZSxcclxuICBSVkJfUSBleHRlbmRzIFJldmFsaWRhdGVCYXNrZXRGZXRjaGVyVHlwZSxcclxuICBTQk1JX1EgZXh0ZW5kcyBTZXRCYXNrZXRJdE1pR3JvdXBGZXRjaGVyVHlwZSxcclxuICBTVk1JX1EgZXh0ZW5kcyBTZXRCYXNrZXRJdE1pRmV0Y2hlclR5cGUsXHJcbiAgVk1JX1EgZXh0ZW5kcyBWYWxpZGF0ZU1pRmV0Y2hlclR5cGUsXHJcbiAgU0JBX1EgZXh0ZW5kcyBTZW5kQmFza2V0QXBwcm92YWxGZXRjaGVyVHlwZSxcclxuICBHVV9RIGV4dGVuZHMgU2VhcmNoR2V0VXNlckZldGNoZXJUeXBlLFxyXG4gIEdVQl9RIGV4dGVuZHMgR2V0VXNlckJhc2tldHNGZXRjaGVyVHlwZSxcclxuICBTQkxQX1EgZXh0ZW5kcyBTZXRCYXNrZXRJdGVtTGVhZFBhc3NlbmdlckZldGNoZXJUeXBlLFxyXG4gIE1JVERCX1EgZXh0ZW5kcyBNb3ZlSXRlbVRvQURpZmZlcmVudEJhc2tldFR5cGUsXHJcbiAgVUJOX1EgZXh0ZW5kcyBCYXNlVXBkYXRlQmFza2V0Tm90ZXNUeXBlLFxyXG4gIFVCVF9RIGV4dGVuZHMgQmFzZVVwZGF0ZUJhc2tldFRpdGxlVHlwZSxcclxuICBTQk1fUSBleHRlbmRzIFNldEJhc2tldEl0ZW1QYXltZW50TWV0aG9kVHlwZVxyXG4+IGltcGxlbWVudHMgRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2Vcclxue1xyXG4gIHByaXZhdGUgY3VycmVudEJhc2tldHM6IEludGVybmFsQmFza2V0PEdVX1E+W10gPSBbXTtcclxuXHJcbiAgaGlnaGxpZ2h0QmFza2V0SXRlbXNFbWl0dGVyOiBTdWJqZWN0PEdldFVzZXJCYXNrZXRJdGVtUmVzdWx0W10+ID0gbmV3IFN1YmplY3Q8XHJcbiAgICBHZXRVc2VyQmFza2V0SXRlbVJlc3VsdFtdXHJcbiAgPigpO1xyXG5cclxuICBiYXNrZXRDaGFuZ2VFbWl0dGVyOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihcclxuICAgICcnXHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSBnZXQgY3VycmVudEJhc2tldElEKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5iYXNrZXRDaGFuZ2VFbWl0dGVyLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXQgY3VycmVudEJhc2tldElEKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5jdXJyZW50QmFza2V0SUQpIHtcclxuICAgICAgLy8gdGhpcyBwcmV2ZW50cyB0aGUgZW1pdHRlciBnZXR0aW5nIHN0dWNrIGluIGEgbG9vcCAgLSBjYXN1aW5nIGJyb3dzZXIgb3ZlcmxvYWRzXHJcbiAgICAgIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci5uZXh0KHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJhc2tldHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEludGVybmFsQmFza2V0PEdVX1E+W10+KFtdKTtcclxuXHJcbiAgYmFza2V0TGlzdDogQmFza2V0UHJpY2VzTGlzdFtdID0gW1xyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5GbGlnaHQsXHJcbiAgICAgIHRleHQ6ICdGTElHSFRTJyxcclxuICAgICAgcHJpY2U6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6IFNlcnZpY2VUeXBlLlJhaWwsXHJcbiAgICAgIHRleHQ6ICdSQUlMJyxcclxuICAgICAgcHJpY2U6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6IFNlcnZpY2VUeXBlLkhvdGVsLFxyXG4gICAgICB0ZXh0OiAnSE9URUxTJyxcclxuICAgICAgcHJpY2U6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6IFNlcnZpY2VUeXBlLkNhYixcclxuICAgICAgdGV4dDogJ1RBWElTJyxcclxuICAgICAgcHJpY2U6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6IFNlcnZpY2VUeXBlLkNhcixcclxuICAgICAgdGV4dDogJ0NBUlMnLFxyXG4gICAgICBwcmljZTogMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogU2VydmljZVR5cGUuSW50ZXJuYXRpb25hbFJhaWwsXHJcbiAgICAgIHRleHQ6ICdFVVJPU1RBUicsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5QYXJraW5nLFxyXG4gICAgICB0ZXh0OiAnUEFSS0lORycsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5Mb3VuZ2UsXHJcbiAgICAgIHRleHQ6ICdMT1VOR0VTJyxcclxuICAgICAgcHJpY2U6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6IFNlcnZpY2VUeXBlLkNvYWNoLFxyXG4gICAgICB0ZXh0OiAnQ09BQ0gnLFxyXG4gICAgICBwcmljZTogMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogU2VydmljZVR5cGUuRmFzdFRyYWNrLFxyXG4gICAgICB0ZXh0OiAnRkFTVF9UUkFDSycsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9XHJcbiAgXTtcclxuXHJcbiAgYmFza2V0UHJpY2VzOiBCZWhhdmlvclN1YmplY3Q8QmFza2V0UHJpY2VzPiA9XHJcbiAgICBuZXcgQmVoYXZpb3JTdWJqZWN0PEJhc2tldFByaWNlcz4oeyB0b3RhbDogbnVsbCwgbGlzdDogdGhpcy5iYXNrZXRMaXN0IH0pO1xyXG5cclxuICBtZW51U3RhdGUgPSBNZW51U2xpZGVFbnVtLk9VVDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGFjY2VwdE5ld1ByaWNlVXBkYXRlcjogQmFzZUFjY2VwdE5ld1ByaWNlVXBkYXRlcjxBTlBVX1E+LFxyXG4gICAgcHJpdmF0ZSBhZGRJdGVtVG9CYXNrZXRVcGRhdGVyOiBCYXNlQWRkSXRlbVRvQmFza2V0VXBkYXRlcjxBSVRCX1E+LFxyXG4gICAgcHJpdmF0ZSBhZGRVc2VyVG9CYXNrZXRJdGVtOiBCYXNlQWRkVXNlclRvQmFza2V0SXRlbVVwZGF0ZXI8QVVUQl9RPixcclxuICAgIHByaXZhdGUgYmFza2V0Q3JlYXRvcjogQmFzZUNyZWF0ZUJhc2tldFVwZGF0ZXI8Q0JfUT4sXHJcbiAgICBwdWJsaWMgYmFza2V0RmV0Y2hlcjogQmFzZUdldEJhc2tldEZldGNoZXI8R0JfUT4sXHJcbiAgICBwcml2YXRlIGJvb2tCYXNrZXRVcGRhdGVyOiBCYXNlQm9va0Jhc2tldFVwZGF0ZXI8QkJfUT4sXHJcbiAgICBwcml2YXRlIGRlbGV0ZUJhc2tldFVwZGF0ZXI6IEJhc2VEZWxldGVCYXNrZXRVcGRhdGVyPERCX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRNaUF1dG9TdWdlc3Rpb25GZXRjaGVyOiBCYXNlR2V0TWlBdXRvU3VnZXN0aW9uRmV0Y2hlcjxHQVNfUT4sXHJcbiAgICBwcml2YXRlIGhlbHBlcnM6IEJhc2VIZWxwZXJSb3V0aW5lcyxcclxuICAgIHByaXZhdGUgcmVtb3ZlSXRlbUZyb21CYXNrZXRVcGRhdGVyOiBCYXNlUmVtb3ZlSXRlbUZyb21CYXNrZXRVcGRhdGVyPFJJQl9RPixcclxuICAgIHByaXZhdGUgcmV2YWxpZGF0ZUJhc2tldFVwZGF0ZXI6IEJhc2VSZXZhbGlkYXRlQmFza2V0VXBkYXRlcjxSVkJfUT4sXHJcbiAgICBwcml2YXRlIHNldEJhc2tldEl0ZW1NaUdyb3VwVXBkYXRlcjogQmFzZVNldEJhc2tldEl0ZW1NaUdyb3VwVXBkYXRlcjxTQk1JX1E+LFxyXG4gICAgcHJpdmF0ZSBzZXRCYXNrZXRJdGVtTWlWYWx1ZVVwZGF0ZXI6IEJhc2VTZXRCYXNrZXRJdGVtTWlWYWx1ZVVwZGF0ZXI8U1ZNSV9RPixcclxuICAgIHByaXZhdGUgdmFsaWRhdGVNaUZyZWVWYWx1ZTogQmFzZVZhbGlkYXRlTWlGcmVlVmFsdWVUZXN0ZXI8Vk1JX1E+LFxyXG4gICAgcHJpdmF0ZSBzZW5kQmFza2V0Rm9yQXBwcm92YWxVcGRhdGVyOiBCYXNlU2VuZEJhc2tldEZvckFwcHJvdmFsVXBkYXRlcjxTQkFfUT4sXHJcbiAgICBwcml2YXRlIGdldFVzZXJGZXRjaGVyOiBCYXNlR2V0VXNlckZldGNoZXI8R1VfUT4sXHJcbiAgICBwcml2YXRlIGdldFVzZXJCYXNrZXRzRmV0Y2hlcjogQmFzZUdldFVzZXJCYXNrZXRzRmV0Y2hlcjxHVUJfUT4sXHJcbiAgICBwcml2YXRlIFNldEJhc2tldEl0ZW1MZWFkUGFzc2VuZ2VyOiBCYXNlU2V0QmFza2V0SXRlbUxlYWRQYXNzZW5nZXJVcGRhdGVyPFNCTFBfUT4sXHJcbiAgICBwcml2YXRlIG1vdmVJdGVtVG9BRGlmZmVyZW50QmFza2V0OiBCYXNlbW92ZUJhc2tldEl0ZW1Ub0Jhc2tldDxNSVREQl9RPixcclxuICAgIHByaXZhdGUgdXBkYXRlQmFza2V0Tm90ZXNVcGRhdGVyOiBCYXNlVXBkYXRlQmFza2V0Tm90ZVVwZGF0ZXI8VUJOX1E+LFxyXG4gICAgcHJpdmF0ZSB1cGRhdGVCYXNrZXRUaXRsZVVwZGF0ZXI6IEJhc2VVcGRhdGVCYXNrZXRUaXRsZVVwZGF0ZXI8VUJUX1E+LFxyXG4gICAgcHJpdmF0ZSBzZXRQYXltZW50TWV0aG9kVXBkYXRlcjogQmFzZVNldFBheW1lbnRPcHRpb25VcGRhdGVyPFNCTV9RPixcclxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJhc2VNb2RhbE9wZW5lclNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMudXNlclNlcnZpY2UuY2hhbmdlVXNlci5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAodXNlckRldGFpbHM6IEZ1bGxVc2VyRGV0YWlscykgPT4ge1xyXG4gICAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXQoKSB7XHJcbiAgICBpZiAodGhpcy51c2VyU2VydmljZS5nZXRmdWxsVXNlckRldGFpbHMoZmFsc2UpLnVzZXJEYXRhLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZ2V0VXNlckJhc2tldHNGZXRjaGVyXHJcbiAgICAgICAgLmZldGNoTGlzdCh7XHJcbiAgICAgICAgICBiYXNrZXRTdGF0dXM6IEJhc2tldFN0YXR1cy5PcGVuLFxyXG4gICAgICAgICAgdXNlcjogdGhpcy51c2VyU2VydmljZVxyXG4gICAgICAgICAgICAuZ2V0ZnVsbFVzZXJEZXRhaWxzKHRydWUpXHJcbiAgICAgICAgICAgIC51c2VyRGF0YS52YWx1ZS51c2VyX2lkLnRvU3RyaW5nKClcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgIChiYXNrZXRzOiBVc2VyQmFza2V0UmVzdWx0W10pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFza2V0cyA9IGJhc2tldHMubWFwKChiYXNrZXQ6IFVzZXJCYXNrZXRSZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoYmFza2V0KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW50QmFza2V0ID0gdGhpcy5maW5kQmFza2V0KGJhc2tldC5pZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWludEJhc2tldCkge1xyXG4gICAgICAgICAgICAgICAgICBpbnRCYXNrZXQgPSBuZXcgSW50ZXJuYWxCYXNrZXQoXHJcbiAgICAgICAgICAgICAgICAgICAgYmFza2V0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVscGVycyxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0VXNlckZldGNoZXJcclxuICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhc2tldHMucHVzaChpbnRCYXNrZXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGludEJhc2tldDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5iYXNrZXRzLm5leHQodGhpcy5jdXJyZW50QmFza2V0cyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50QmFza2V0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFza2V0SUQgPSB0aGlzLmN1cnJlbnRCYXNrZXRzWzBdLmlkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhc2tldElEID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5iYXNrZXRDaGFuZ2VFbWl0dGVyLm5leHQodGhpcy5jdXJyZW50QmFza2V0SUQpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRCYXNrZXRzLmZvckVhY2goKGJhc2tldDogSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2UpID0+XHJcbiAgICAgICAgYmFza2V0LnN1YmplY3QudW5zdWJzY3JpYmUoKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmN1cnJlbnRCYXNrZXRzID0gW107XHJcbiAgICAgIHRoaXMuY3VycmVudEJhc2tldElEID0gbnVsbDtcclxuICAgICAgdGhpcy5iYXNrZXRzLm5leHQodGhpcy5jdXJyZW50QmFza2V0cyk7XHJcbiAgICAgIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci5uZXh0KHRoaXMuY3VycmVudEJhc2tldElEKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRBbGxPcGVuQmFza2V0cyh1c2VyX2lkOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJCYXNrZXRSZXN1bHRbXT4ge1xyXG4gICAgLy8gbGV0IGludEJhc2tldCA9IHRoaXMuZmluZEJhc2tldCh1c2VyX2lkKVxyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VXNlckJhc2tldHNGZXRjaGVyXHJcbiAgICAgIC5mZXRjaExpc3QoeyBiYXNrZXRTdGF0dXM6IEJhc2tldFN0YXR1cy5PcGVuLCB1c2VyOiB1c2VyX2lkIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgbWFwKChyZXN1bHRzOiBVc2VyQmFza2V0UmVzdWx0W10pID0+IHtcclxuICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdDogVXNlckJhc2tldFJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5maW5kQmFza2V0KHJlc3VsdC5pZCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGludEJhc2tldCA9IG5ldyBJbnRlcm5hbEJhc2tldChcclxuICAgICAgICAgICAgICAgICAgcmVzdWx0LFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmhlbHBlcnMsXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0VXNlckZldGNoZXJcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYXNrZXRzLnB1c2goaW50QmFza2V0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaW50QmFza2V0ID0gbmV3IEludGVybmFsQmFza2V0KFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlkOiB1c2VyX2lkLFxyXG4gICAgICAgICAgICAgICAgYmFza2V0SXRlbXM6IFtdXHJcbiAgICAgICAgICAgICAgfSBhcyBCYXNrZXREZXRhaWxzLFxyXG4gICAgICAgICAgICAgIHRoaXMuaGVscGVycyxcclxuICAgICAgICAgICAgICB0aGlzLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0VXNlckZldGNoZXJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFza2V0cy5wdXNoKGludEJhc2tldCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYWRkVG9CYXNrZXQoXHJcbiAgICBpdGVtOiBBZGRJdGVtVG9CYXNrZXQuVmFyaWFibGVzLFxyXG4gICAgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPixcclxuICAgIHNlYXJjaFNlcnZpY2U6IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgdHJhdmVsbGVyczogVHJhdmVsbGVyW10gPSBbXVxyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHRyYXZlbGxlcnM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgaXRlbS51c2VycyA9IHRoaXMuaGVscGVycy5tYWtlVXNlcnModHJhdmVsbGVycyk7XHJcbiAgICAgIGl0ZW0ubGVhZFBhc3NlbmdlciA9IGl0ZW0udXNlcnNbMF0uaWQ7XHJcbiAgICB9XHJcbiAgICBpdGVtID0gdGhpcy5jaGVja0RldGFpbHMoaXRlbSk7XHJcbiAgICBpZiAoaXRlbSAmJiBpbnRCYXNrZXQpIHtcclxuICAgICAgdGhpcy5hZGRJdGVtVG9CYXNrZXRVcGRhdGVyXHJcbiAgICAgICAgLnVwZGF0ZU9uZShpdGVtKVxyXG4gICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgIChuZXdCYXNrZXQ6IFBhcnRpYWw8VXNlckJhc2tldFJlc3VsdD4pID0+IHtcclxuICAgICAgICAgICAgaW50QmFza2V0Lm5leHQoe1xyXG4gICAgICAgICAgICAgIC4uLmludEJhc2tldC5zdWJqZWN0LnZhbHVlLFxyXG4gICAgICAgICAgICAgIC4uLm5ld0Jhc2tldFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMudXNlclNlcnZpY2UuZmluZFNlcnZpY2UoaXRlbS5zZXJ2aWNlKS50eXBlO1xyXG4gICAgICAgICAgICBzZWFyY2hTZXJ2aWNlLnNlYXJjaF9vYmplY3RzW3NlcnZpY2VdLmJvb2tpbmdfY2hvc2VuID0gdHJ1ZTtcclxuICAgICAgICAgICAgc2VhcmNoU2VydmljZS5zZWFyY2hfb2JqZWN0c1tzZXJ2aWNlXS5jaG9zZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgY29uc3QgYmk6IEdldFVzZXJCYXNrZXRJdGVtUmVzdWx0W10gPSBuZXdCYXNrZXQuYmFza2V0SXRlbXM7XHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0QmFza2V0SXRlbXNFbWl0dGVyLm5leHQoYmkpO1xyXG4gICAgICAgICAgICB0aGlzLmJhc2tldENoYW5nZUVtaXR0ZXIubmV4dCh0aGlzLmN1cnJlbnRCYXNrZXRJRCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIGludEJhc2tldC5zdWJqZWN0Lm5leHQoaW50QmFza2V0LnN1YmplY3QudmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBsb2FkQmFza2V0KGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBpbnRCYXNrZXQgPSB0aGlzLmZpbmRCYXNrZXQoaWQpO1xyXG4gICAgaWYgKCFpbnRCYXNrZXQpIHtcclxuICAgICAgaW50QmFza2V0ID0gbmV3IEludGVybmFsQmFza2V0KFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgYmFza2V0SXRlbXM6IFtdXHJcbiAgICAgICAgfSBhcyBCYXNrZXREZXRhaWxzLFxyXG4gICAgICAgIHRoaXMuaGVscGVycyxcclxuICAgICAgICB0aGlzLFxyXG4gICAgICAgIHRoaXMuZ2V0VXNlckZldGNoZXJcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jdXJyZW50QmFza2V0cy5wdXNoKGludEJhc2tldCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmJhc2tldEZldGNoZXJcclxuICAgICAgLmZldGNoT25lKHsgaWQgfSlcclxuICAgICAgLnN1YnNjcmliZSgobmV3QmFza2V0OiBVc2VyQmFza2V0UmVzdWx0KSA9PiB7XHJcbiAgICAgICAgaW50QmFza2V0Lm5leHQobmV3QmFza2V0KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdWJzcmliZVRvQmFza2V0KGlkOiBzdHJpbmcsIG9ic2VydmVyOiBPYnNlcnZlcjxCYXNrZXREZXRhaWxzPik6IHZvaWQge1xyXG4gICAgY29uc3QgaW50QmFza2V0ID0gdGhpcy5maW5kQmFza2V0KGlkKTtcclxuICAgIGlmIChpbnRCYXNrZXQpIHtcclxuICAgICAgaW50QmFza2V0LnN1YmplY3Quc3Vic2NyaWJlKG9ic2VydmVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZUV4cGlyZWRJdGVtcyhpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnRCYXNrZXQgPSB0aGlzLmZpbmRCYXNrZXQoaWQpO1xyXG4gICAgaW50QmFza2V0LnN1YmplY3QudmFsdWUuYmFza2V0SXRlbXNcclxuICAgICAgLmZpbHRlcigoYmFza2V0SXRlbTogQmFza2V0SXRlbSk6IGJvb2xlYW4gPT4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICBiYXNrZXRJdGVtLmxhdGVzdFZhbGlkYXRpb25QcmljZURpZmZlcmVuY2UgIT09IDAgfHwgYmFza2V0SXRlbS5leHBpcmVkXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICAgLmZvckVhY2goKGJhc2tldEl0ZW06IEJhc2tldEl0ZW0pID0+IHtcclxuICAgICAgICB0aGlzLnJlbW92ZUJhc2tldEl0ZW0oaWQsIGJhc2tldEl0ZW0pO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUJhc2tldEl0ZW0oYmFza2V0SWQ6IHN0cmluZywgaXRlbTogQmFza2V0SXRlbSk6IHZvaWQge1xyXG4gICAgY29uc3QgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPiA9IHRoaXMuZmluZEJhc2tldChiYXNrZXRJZCk7XHJcbiAgICB0aGlzLnJlbW92ZUl0ZW1Gcm9tQmFza2V0VXBkYXRlclxyXG4gICAgICAudXBkYXRlT25lKHsgYmFza2V0SXRlbTogaXRlbS5pZCB9KVxyXG4gICAgICAuc3Vic2NyaWJlKChuZXdCYXNrZXQ6IEJhc2tldCkgPT4ge1xyXG4gICAgICAgIGludEJhc2tldC5uZXh0KHtcclxuICAgICAgICAgIC4uLmludEJhc2tldC5zdWJqZWN0LnZhbHVlLFxyXG4gICAgICAgICAgLi4ubmV3QmFza2V0XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5iYXNrZXRDaGFuZ2VFbWl0dGVyLm5leHQoYmFza2V0SWQpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZWZhdWx0QmFza2V0KFxyXG4gICAgZ2V0Qm9va2VkQmFza2V0OiBib29sZWFuID0gZmFsc2VcclxuICApOiBQcm9taXNlPEludGVybmFsQmFza2V0PEdVX1E+PiB7XHJcbiAgICBjb25zdCBpbnRlcm5hbEJhc2tldDogSW50ZXJuYWxCYXNrZXQ8R1VfUT4gPSBudWxsO1xyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5jdXJyZW50QmFza2V0SUQpO1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE9yQ3JlYXRlQmFza2V0KFxyXG4gICAgICB0aGlzLmN1cnJlbnRCYXNrZXRJRCxcclxuICAgICAgZ2V0Qm9va2VkQmFza2V0XHJcbiAgICApLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZEJhc2tldChpZDogc3RyaW5nKTogSW50ZXJuYWxCYXNrZXQ8R1VfUT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEJhc2tldHMuZmluZCgoYmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPikgPT4ge1xyXG4gICAgICByZXR1cm4gYmFza2V0LmlkID09PSBpZCB8fCBiYXNrZXQudGVtcGlkID09PSBpZDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBmaW5kT3JDcmVhdGVCYXNrZXQoXHJcbiAgICBpZD86IHN0cmluZyxcclxuICAgIGdldEJvb2tlZEJhc2tldDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKTogUHJvbWlzZTxJbnRlcm5hbEJhc2tldDxHVV9RPj4ge1xyXG4gICAgbGV0IGJhc2tldDogSW50ZXJuYWxCYXNrZXQ8R1VfUT4gPSBudWxsO1xyXG4gICAgaWYgKCFpZCkge1xyXG4gICAgICBjb25zdCBhbGxPcGVuQmFza2V0cyA9IGF3YWl0IHRoaXMuZ2V0QWxsT3BlbkJhc2tldHMoXHJcbiAgICAgICAgdGhpcy51c2VyU2VydmljZVxyXG4gICAgICAgICAgLmdldGZ1bGxVc2VyRGV0YWlscyh0cnVlKVxyXG4gICAgICAgICAgLnVzZXJEYXRhLnZhbHVlLnVzZXJfaWQudG9TdHJpbmcoKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gZmluZCB0aGUgbGFzdCB1cGRhdGVkIGJhc2tldFxyXG4gICAgICBpZiAoIWFsbE9wZW5CYXNrZXRzPy5sZW5ndGgpIHtcclxuICAgICAgICBiYXNrZXQgPSBhd2FpdCB0aGlzLmNyZWF0ZUJhc2tldCgpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEJhc2tldHMucHVzaChiYXNrZXQpO1xyXG4gICAgICAgIHRoaXMuYmFza2V0cy5uZXh0KHRoaXMuY3VycmVudEJhc2tldHMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGJhc2tldHMgYXJlIGFscmVhZHkgc29ydGVkIGJ5IGxhc3QgdXBkYXRlZCAtIHJldHVybiB0aGUgbGFzdCB1cGRhdGVkIGJhc2tldFxyXG4gICAgICAgIGJhc2tldCA9IHRoaXMuZmluZEJhc2tldChhbGxPcGVuQmFza2V0c1swXS5pZCk7XHJcblxyXG4gICAgICAgIGlmIChiYXNrZXQuc3ViamVjdC52YWx1ZS5zdGF0dXMgPT09ICdCT09LRUQnICYmICFnZXRCb29rZWRCYXNrZXQpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgICAgJysrKyBSZXRyaWV2ZWQgYmFza2V0IGlzIGluIGJvb2tlZCBzdGF0dXMgLSBjcmVhdGluZyBhIG5ldyBvbmUgKysrJ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGJhc2tldCA9IGF3YWl0IHRoaXMuY3JlYXRlQmFza2V0KCk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRCYXNrZXRzLnB1c2goYmFza2V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5iYXNrZXRzLm5leHQodGhpcy5jdXJyZW50QmFza2V0cyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGJhc2tldCA9IHRoaXMuZmluZEJhc2tldChpZCk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCcrKysgRm91bmQgQmFza2V0OiAnLCBiYXNrZXQsICcgKysrJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJhc2tldDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVCYXNrZXQoKTogUHJvbWlzZTxJbnRlcm5hbEJhc2tldDxHVV9RPj4ge1xyXG4gICAgY29uc3QgYmFza2V0OiBVc2VyQmFza2V0UmVzdWx0ID0ge1xyXG4gICAgICBpZDogVEVNUElEICsgbW9tZW50KCkudW5peCgpLnRvU3RyaW5nKCksXHJcbiAgICAgIG93bmVyOiBudWxsLFxyXG4gICAgICByZWZlcmVuY2U6IG51bGwsXHJcbiAgICAgIHRpdGxlOiBudWxsLFxyXG4gICAgICBub3RlczogbnVsbCxcclxuICAgICAgY3JlYXRlZEF0OiBudWxsLFxyXG4gICAgICB1cGRhdGVkQXQ6IG51bGwsXHJcbiAgICAgIGJhc2tldEl0ZW1zOiBbXSxcclxuICAgICAgc3RhdHVzOiBudWxsLFxyXG4gICAgICB2YWxpZGF0ZWQ6IGZhbHNlXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGludEJhc2tldCA9IG5ldyBJbnRlcm5hbEJhc2tldDxHVV9RPihcclxuICAgICAgYmFza2V0LFxyXG4gICAgICB0aGlzLmhlbHBlcnMsXHJcbiAgICAgIHRoaXMsXHJcbiAgICAgIHRoaXMuZ2V0VXNlckZldGNoZXJcclxuICAgICk7XHJcbiAgICAvLyB7IHN1YmplY3Q6IG5ldyBCZWhhdmlvclN1YmplY3Q8QmFza2V0PihiYXNrZXQpLCB0ZW1waWQ6IGJhc2tldC5pZCwgaWQ6IGJhc2tldC5pZCwgdGl0bGU6IGJhc2tldC5pZCB9O1xyXG5cclxuICAgIGNvbnN0IHRvUmV0dXJuID0gYXdhaXQgdGhpcy5jcmVhdGVCYXNrZXRPbkRCKGludEJhc2tldCk7XHJcbiAgICB0aGlzLmN1cnJlbnRCYXNrZXRzLnB1c2godG9SZXR1cm4pO1xyXG4gICAgdGhpcy5iYXNrZXRzLm5leHQodGhpcy5jdXJyZW50QmFza2V0cyk7XHJcbiAgICB0aGlzLmJhc2tldENoYW5nZUVtaXR0ZXIubmV4dCh0b1JldHVybi5pZCk7XHJcbiAgICByZXR1cm4gdG9SZXR1cm47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUJhc2tldE9uREIoXHJcbiAgICBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0PEdVX1E+XHJcbiAgKTogUHJvbWlzZTxJbnRlcm5hbEJhc2tldDxHVV9RPj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5iYXNrZXRDcmVhdG9yXHJcbiAgICAgICAgLnVwZGF0ZU9uZSh7fSlcclxuICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAoYmFza2V0OiBVc2VyQmFza2V0UmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIGludEJhc2tldC5pZCA9IGJhc2tldC5pZDtcclxuICAgICAgICAgICAgaW50QmFza2V0Lm5leHQoYmFza2V0KTtcclxuICAgICAgICAgICAgcmVzb2x2ZShpbnRCYXNrZXQpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKCkgPT4ge31cclxuICAgICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVNZW51KCk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm1lbnVTdGF0ZSA9PT0gTWVudVNsaWRlRW51bS5JTiB8fFxyXG4gICAgICB0aGlzLm1lbnVTdGF0ZSA9PT0gTWVudVNsaWRlRW51bS5GTEFUXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5tZW51U3RhdGUgPSBNZW51U2xpZGVFbnVtLk9VVDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubWVudVN0YXRlID0gTWVudVNsaWRlRW51bS5JTjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlTWVudSgpOiB2b2lkIHtcclxuICAgIHRoaXMubWVudVN0YXRlID0gTWVudVNsaWRlRW51bS5JTjtcclxuICB9XHJcblxyXG4gIGdldExhdGVzdEJhc2tldEl0ZW1Gb3JUeXBlcyhcclxuICAgIGJhc2tldEl0ZW1zOiBCYXNrZXRJdGVtW11cclxuICApOiBSZWNvcmQ8U2VydmljZVR5cGUsIEJhc2tldEl0ZW0+IHtcclxuICAgIHJldHVybiAoYmFza2V0SXRlbXMgfHwgW10pLnJlZHVjZShcclxuICAgICAgKFxyXG4gICAgICAgIGxhdGVzdEl0ZW1zOiBSZWNvcmQ8U2VydmljZVR5cGUsIEJhc2tldEl0ZW0+LFxyXG4gICAgICAgIGJhc2tldEl0ZW06IEJhc2tldEl0ZW1cclxuICAgICAgKSA9PiB7XHJcbiAgICAgICAgbGF0ZXN0SXRlbXNbYmFza2V0SXRlbS5zZXJ2aWNlLnR5cGVdID0gYmFza2V0SXRlbTtcclxuICAgICAgICByZXR1cm4gbGF0ZXN0SXRlbXM7XHJcbiAgICAgIH0sXHJcbiAgICAgIHt9IGFzIFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT5cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrRGV0YWlscyhcclxuICAgIGl0ZW06IEFkZEl0ZW1Ub0Jhc2tldC5WYXJpYWJsZXNcclxuICApOiBBZGRJdGVtVG9CYXNrZXQuVmFyaWFibGVzIHtcclxuICAgIGNvbnN0IHNlcnZpY2VUb0NoZWNrOiBTZXJ2aWNlID0gdGhpcy51c2VyU2VydmljZS5maW5kU2VydmljZShpdGVtLnNlcnZpY2UpO1xyXG4gICAgaWYgKCFzZXJ2aWNlVG9DaGVjaykge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gZmluZCBzZXJ2aWNlIGZvciBiYXNrZXQgaXRlbSA6ICcgKyBpdGVtLnNlcnZpY2UpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVjayB0aGUgaXRlbS5kZXRhaWwgb2JqZWN0IGFnYWluc3QgdGhlIHJlbGV2YW50IHNlcnZpY2UgZGV0YWlsU2NoZW1hIHVzaW5nIEFqdlxyXG4gICAgY29uc3QgYWp2ID0gbmV3IEFqdigpO1xyXG4gICAgY29uc3QgdmFsaWRhdGVEZXRhaWxTY2hlbWEgPSBhanYuY29tcGlsZShzZXJ2aWNlVG9DaGVjay5kZXRhaWxTY2hlbWEpO1xyXG4gICAgY29uc3QgdmFsaWRhdGVTZWFyY2hTY2hlbWEgPSBhanYuY29tcGlsZShzZXJ2aWNlVG9DaGVjay5zZWFyY2hRdWVyeVNjaGVtYSk7XHJcblxyXG4gICAgLy8gaWYgdGhlcmUgYXJlIGFueSBtb21lbnQgZGF0ZSBvYmplY3RzIGluIHRoZSBzZWFyY2hRdWVyeSBvYmplY3QgY29udmVydCB0aGVzZSB0byBkYXRlLXRpbWUgc3RyaW5nc1xyXG4gICAgaXRlbS5zZWFyY2hRdWVyeSA9IHRoaXMuaGVscGVycy5zYW5pdGl6ZU1vbWVudERhdGVzKGl0ZW0uc2VhcmNoUXVlcnkpO1xyXG4gICAgaXRlbS5kZXRhaWwgPSB0aGlzLmhlbHBlcnMucmVtb3ZlTnVsbHMoaXRlbS5kZXRhaWwpO1xyXG5cclxuICAgIGlmICghdmFsaWRhdGVTZWFyY2hTY2hlbWEoaXRlbS5zZWFyY2hRdWVyeSkpIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSBgSXRlbSBzZWFyY2hRdWVyeSBpcyBub3QgdmFsaWQgZm9yICR7c2VydmljZVRvQ2hlY2submFtZX0gc2VhcmNoIHNjaGVtYS5gO1xyXG4gICAgICBjb25zb2xlLndhcm4oJ3NlYXJjaFNjaGVtYScsIHNlcnZpY2VUb0NoZWNrLnNlYXJjaFF1ZXJ5U2NoZW1hKTtcclxuICAgICAgY29uc29sZS53YXJuKCdpdGVtLnNlYXJjaFF1ZXJ5JywgaXRlbS5zZWFyY2hRdWVyeSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKHZhbGlkYXRlU2VhcmNoU2NoZW1hLmVycm9ycyk7XHJcbiAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oTW9kYWxUeXBlcy5Nb2RhbEVycm9yQ29tcG9uZW50LCB7fSwgeyBlcnJvciB9KTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF2YWxpZGF0ZURldGFpbFNjaGVtYShpdGVtLmRldGFpbCkpIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSBgSXRlbSBkZXRhaWwgaXMgbm90IHZhbGlkIGZvciAke3NlcnZpY2VUb0NoZWNrLm5hbWV9IGRldGFpbCBzY2hlbWEuYDtcclxuICAgICAgY29uc29sZS53YXJuKCdkZXRhaWxTY2hlbWEnLCBzZXJ2aWNlVG9DaGVjay5kZXRhaWxTY2hlbWEpO1xyXG4gICAgICBjb25zb2xlLndhcm4oJ2l0ZW0uZGV0YWlsJywgaXRlbS5kZXRhaWwpO1xyXG4gICAgICBjb25zb2xlLmxvZygnU2NoZW1hIGVycm9ycycsIHZhbGlkYXRlRGV0YWlsU2NoZW1hLmVycm9ycyk7XHJcbiAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oTW9kYWxUeXBlcy5Nb2RhbEVycm9yQ29tcG9uZW50LCB7fSwgeyBlcnJvciB9KTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXRlbTtcclxuICB9XHJcblxyXG4gIGdldE51bWJlckl0ZW1zRm9yQmFza2V0KGJhc2tldDogSW50ZXJuYWxCYXNrZXQ8R1VfUT4gPSBudWxsKTogbnVtYmVyIHtcclxuICAgIGJhc2tldCA9IGJhc2tldCB8fCB0aGlzLmZpbmRCYXNrZXQodGhpcy5jdXJyZW50QmFza2V0SUQpO1xyXG4gICAgcmV0dXJuIGJhc2tldD8uc3ViamVjdC52YWx1ZS5iYXNrZXRJdGVtcy5sZW5ndGggfHwgMDtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlbW92ZUJhc2tldChiYXNrZXRpZDogc3RyaW5nKSB7XHJcbiAgICBpZiAoYmFza2V0aWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCYXNrZXRVcGRhdGVyXHJcbiAgICAgICAgLnVwZGF0ZU9uZSh7IGlkOiBiYXNrZXRpZCB9KVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICAgIHN3aXRjaE1hcCgoZGF0YTogYW55KTogYW55ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5maW5kQmFza2V0KGJhc2tldGlkKT8uZGVzdHJ1Y3RvcigpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRCYXNrZXRzID0gdGhpcy5jdXJyZW50QmFza2V0cy5maWx0ZXIoKGludEJhKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGludEJhLmlkICE9PSBiYXNrZXRpZDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuYmFza2V0cy5uZXh0KHRoaXMuY3VycmVudEJhc2tldHMpO1xyXG4gICAgICAgICAgICBpZiAoYmFza2V0aWQgPT09IHRoaXMuY3VycmVudEJhc2tldElEKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFza2V0SUQgPSB0aGlzLmN1cnJlbnRCYXNrZXRzWzBdPy5pZCB8fCBudWxsO1xyXG4gICAgICAgICAgICAgIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci5uZXh0KHRoaXMuY3VycmVudEJhc2tldElEKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC50b1Byb21pc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnRpbnVlU2VhcmNoQW5kQm9vayhcclxuICAgIGJhc2tldEl0ZW1zOiBhbnlbXSxcclxuICAgIGl0aW5pYXJ5VXJsOiBzdHJpbmdbXSxcclxuICAgIHNlYXJjaFNlcnZpY2U6IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlXHJcbiAgKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgbGF0ZXN0QmFza2V0SXRlbXMgPSB0aGlzLmdldExhdGVzdEJhc2tldEl0ZW1Gb3JUeXBlcyhiYXNrZXRJdGVtcyk7XHJcbiAgICBjb25zdCBuZXh0U2VhcmNoOiBTZWFyY2hPYmplY3QgPVxyXG4gICAgICBzZWFyY2hTZXJ2aWNlLmdldEhpZ2hlc3RTZWFyY2hQcmlvcml0eU9iamVjdChsYXRlc3RCYXNrZXRJdGVtcyk7XHJcbiAgICBpZiAobmV4dFNlYXJjaCkge1xyXG4gICAgICAoc2VhcmNoU2VydmljZS5zZWFyY2hlcyBhcyBhbnkpW1xyXG4gICAgICAgIG5leHRTZWFyY2gudHlwZVxyXG4gICAgICBdLnVwZGF0ZUZyb21QcmV2aW91c1NlYXJjaGVzKGxhdGVzdEJhc2tldEl0ZW1zKTtcclxuICAgICAgcmV0dXJuIFtuZXh0U2VhcmNoLnNlYXJjaFVybF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gaXRpbmlhcnlVcmw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRUcmF2ZWxsZXJzKFxyXG4gICAgYmFza2V0aWQ6IHN0cmluZyxcclxuICAgIGJhc2tldEl0ZW06IEJhc2tldEl0ZW0sXHJcbiAgICB0cmF2ZWxsZXJzOiBUcmF2ZWxsZXJbXSxcclxuICAgIGluZGV4OiBudW1iZXIgPSAwXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBiYXNrZXQgPSB0aGlzLmZpbmRCYXNrZXQoYmFza2V0aWQpO1xyXG4gICAgaWYgKGluZGV4IDwgdHJhdmVsbGVycy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgdHJhdmVsbGVyID0gdHJhdmVsbGVyc1tpbmRleF07XHJcbiAgICAgIGNvbnN0IHBhc3NlbmdlclR5cGU6IFBhc3NlbmdlclR5cGUgPSB0cmF2ZWxsZXIuaXNDaGlsZFxyXG4gICAgICAgID8gUGFzc2VuZ2VyVHlwZS5DaGlsZFxyXG4gICAgICAgIDogdHJhdmVsbGVyLmlzSW5mYW50XHJcbiAgICAgICAgPyBQYXNzZW5nZXJUeXBlLkluZmFudFxyXG4gICAgICAgIDogUGFzc2VuZ2VyVHlwZS5BZHVsdDtcclxuXHJcbiAgICAgIHRoaXMuYWRkVXNlclRvQmFza2V0SXRlbVxyXG4gICAgICAgIC51cGRhdGVPbmUoe1xyXG4gICAgICAgICAgYmFza2V0SXRlbTogYmFza2V0SXRlbS5pZCxcclxuICAgICAgICAgIHVzZXJzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBpZDogdHJhdmVsbGVyLmlkLFxyXG4gICAgICAgICAgICAgIHBhc3NlbmdlclR5cGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIHdpdGhTdXBwbGVtZW50YWw6IGZhbHNlXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgKCkgPT4ge30sXHJcbiAgICAgICAgICAoKSA9PiB7fSxcclxuICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hZGRUcmF2ZWxsZXJzKGJhc2tldC5pZCwgYmFza2V0SXRlbSwgdHJhdmVsbGVycywgaW5kZXggKyAxKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5iYXNrZXRGZXRjaGVyLmZldGNoT25lKHsgaWQ6IGJhc2tldC5pZCB9KS5zdWJzY3JpYmUoXHJcbiAgICAgICAgKGJhc2tldDE6IEdldFVzZXJCYXNrZXRSZXN1bHQpID0+IHtcclxuICAgICAgICAgIGJhc2tldC5zdWJqZWN0Lm5leHQoeyAuLi5iYXNrZXQuc3ViamVjdC52YWx1ZSwgLi4uYmFza2V0MSB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChfKSA9PiB7fSxcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICBiYXNrZXQubmV4dChiYXNrZXQuc3ViamVjdC52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0TGVhZFBhc3NlbmdlcihcclxuICAgIGJhc2tldGlkOiBzdHJpbmcsXHJcbiAgICBiYXNrZXRJdGVtOiBCYXNrZXRJdGVtLFxyXG4gICAgdHJhdmVsbGVyczogVHJhdmVsbGVyLFxyXG4gICAgaW5kZXg6IG51bWJlciA9IDBcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IGJhc2tldCA9IHRoaXMuZmluZEJhc2tldChiYXNrZXRpZCk7XHJcbiAgICBpZiAoaW5kZXggPCAxKSB7XHJcbiAgICAgIHRoaXMuU2V0QmFza2V0SXRlbUxlYWRQYXNzZW5nZXIudXBkYXRlT25lKHtcclxuICAgICAgICBpZDogYmFza2V0SXRlbS5pZCxcclxuICAgICAgICB1c2VyOiB0cmF2ZWxsZXJzLmlkLFxyXG4gICAgICAgIHdpdGhTdXBwbGVtZW50YWw6IGZhbHNlXHJcbiAgICAgIH0pLnN1YnNjcmliZShcclxuICAgICAgICAoKSA9PiB7fSxcclxuICAgICAgICAoKSA9PiB7fSxcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNldExlYWRQYXNzZW5nZXIoYmFza2V0LmlkLCBiYXNrZXRJdGVtLCB0cmF2ZWxsZXJzLCBpbmRleCArIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYmFza2V0RmV0Y2hlci5mZXRjaE9uZSh7IGlkOiBiYXNrZXQuaWQgfSkuc3Vic2NyaWJlKFxyXG4gICAgICAgIChiYXNrZXQxOiBHZXRVc2VyQmFza2V0UmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICBiYXNrZXQuc3ViamVjdC5uZXh0KHsgLi4uYmFza2V0LnN1YmplY3QudmFsdWUsIC4uLmJhc2tldDEgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoXykgPT4ge30sXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgYmFza2V0Lm5leHQoYmFza2V0LnN1YmplY3QudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldChcclxuICAgIGJhc2tldGlkOiBzdHJpbmcsXHJcbiAgICBvYnM6IE9ic2VydmFibGU8QmFza2V0RGV0YWlscz5cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIG9icy5waXBlKHRha2UoMSkpLnN1YnNjcmliZShcclxuICAgICAgICAoYmFza2V0OiBCYXNrZXREZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbnRCYXNrZXQgPSB0aGlzLmZpbmRCYXNrZXQoYmFza2V0aWQpO1xyXG4gICAgICAgICAgaW50QmFza2V0Lm5leHQoYmFza2V0KTtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgIGNvbnN0IGludEJhc2tldCA9IHRoaXMuZmluZEJhc2tldChiYXNrZXRpZCk7XHJcbiAgICAgICAgICBpbnRCYXNrZXQubmV4dChpbnRCYXNrZXQuc3ViamVjdC52YWx1ZSk7XHJcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKCkgPT4ge31cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmV2YWxpZGF0ZShiYXNrZXRpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUJhc2tldChcclxuICAgICAgYmFza2V0aWQsXHJcbiAgICAgIHRoaXMucmV2YWxpZGF0ZUJhc2tldFVwZGF0ZXIudXBkYXRlT25lKHsgaWQ6IGJhc2tldGlkIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2V0QmFza2V0SXRlbU1pR3JvdXAoXHJcbiAgICBiYXNrZXRpZDogc3RyaW5nLFxyXG4gICAgYmFza2V0SXRlbWlkOiBzdHJpbmcsXHJcbiAgICBncm91cDogc3RyaW5nXHJcbiAgKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUJhc2tldChcclxuICAgICAgYmFza2V0aWQsXHJcbiAgICAgIHRoaXMuc2V0QmFza2V0SXRlbU1pR3JvdXBVcGRhdGVyLnVwZGF0ZU9uZSh7XHJcbiAgICAgICAgYmFza2V0SXRlbTogYmFza2V0SXRlbWlkLFxyXG4gICAgICAgIGdyb3VwXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYWNjZXB0TmV3UHJpY2UoYmFza2V0aWQ6IHN0cmluZywgaXRlbTogQmFza2V0SXRlbSk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVCYXNrZXQoXHJcbiAgICAgIGJhc2tldGlkLFxyXG4gICAgICB0aGlzLmFjY2VwdE5ld1ByaWNlVXBkYXRlci51cGRhdGVPbmUoeyBpZDogaXRlbS5pZCB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlRnJlZVZhbGVNaShcclxuICAgIG1pSXRlbTogTWFuYWdlbWVudEluZm8sXHJcbiAgICBmcmVlVmFsdWU6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy52YWxpZGF0ZU1pRnJlZVZhbHVlXHJcbiAgICAgICAgLnRlc3QoeyBtaTogbWlJdGVtLmlkLCBmcmVlVmFsdWUgfSlcclxuICAgICAgICAuc3Vic2NyaWJlKHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldE1pRnJlZVZhbHVlKFxyXG4gICAgYmFza2V0aWQ6IHN0cmluZyxcclxuICAgIG1pSXRlbTogTWFuYWdlbWVudEluZm8sXHJcbiAgICBmcmVlVmFsdWU6IHN0cmluZyxcclxuICAgIHVzZXJJZDogc3RyaW5nID0gbnVsbFxyXG4gICkge1xyXG4gICAgY29uc3QgaW50QmFza2V0ID0gdGhpcy5maW5kQmFza2V0KGJhc2tldGlkKTtcclxuICAgIGNvbnN0IGFyZ3M6IFNldEJhc2tldEl0ZW1NaVZhbHVlLlZhcmlhYmxlcyA9IHtcclxuICAgICAgbWk6IG1pSXRlbS5pZCxcclxuICAgICAgbWlGcmVlVmFsdWU6IGZyZWVWYWx1ZVxyXG4gICAgfTtcclxuICAgIGlmICghIXVzZXJJZCkge1xyXG4gICAgICBhcmdzLnVzZXIgPSB1c2VySWQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEJhc2tldEl0ZW1NaVZhbHVlVXBkYXRlclxyXG4gICAgICAudXBkYXRlT25lKGFyZ3MpXHJcbiAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKGJhc2tldDogQmFza2V0RGV0YWlscykgPT4ge1xyXG4gICAgICAgICAgaW50QmFza2V0Lm5leHQoYmFza2V0KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChfKSA9PiB7fSxcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICBpbnRCYXNrZXQubmV4dChpbnRCYXNrZXQuc3ViamVjdC52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgc2V0TWlTZWxlY3RlZFZhbHVlKFxyXG4gICAgYmFza2V0aWQ6IHN0cmluZyxcclxuICAgIG1pSXRlbTogTWFuYWdlbWVudEluZm8sXHJcbiAgICBzZWxlY3RlZFZhbHVlOiBzdHJpbmcsXHJcbiAgICB1c2VySWQ6IHN0cmluZyA9IG51bGxcclxuICApIHtcclxuICAgIGNvbnN0IGFyZ3M6IFNldEJhc2tldEl0ZW1NaVZhbHVlLlZhcmlhYmxlcyA9IHtcclxuICAgICAgbWk6IG1pSXRlbS5pZCxcclxuICAgICAgbWlWYWx1ZTogc2VsZWN0ZWRWYWx1ZVxyXG4gICAgfTtcclxuICAgIGlmICghIXVzZXJJZCkge1xyXG4gICAgICBhcmdzLnVzZXIgPSB1c2VySWQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUJhc2tldChcclxuICAgICAgYmFza2V0aWQsXHJcbiAgICAgIHRoaXMuc2V0QmFza2V0SXRlbU1pVmFsdWVVcGRhdGVyLnVwZGF0ZU9uZShhcmdzKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldE1pQXV0b1N1Z2VzdGlvbnMoXHJcbiAgICBtaUlkOiBzdHJpbmcsXHJcbiAgICBwYXJ0aWFsTGFiZWw6IHN0cmluZyxcclxuICAgIGlzTG9hZGluZzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxHZXRNaUF1dG9TdWdlc3Rpb25BcnJheT4ge1xyXG4gICAgaXNMb2FkaW5nPy5uZXh0KHRydWUpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmdldE1pQXV0b1N1Z2VzdGlvbkZldGNoZXJcclxuICAgICAgLmZldGNoTGlzdCh7IG1pOiBtaUlkLCBwYXJ0aWFsTGFiZWwgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFwKChfKSA9PiB7XHJcbiAgICAgICAgICBpc0xvYWRpbmc/Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBzYXZlTWlEYXRhKGJhc2tldElkOiBzdHJpbmcsIGJtaUFycmF5OiBCYXNrZXRJdGVtTWFuYWdlbWVudEluZm9bXSkge1xyXG4gICAgYm1pQXJyYXkuZm9yRWFjaCgoYm1pOiBCYXNrZXRJdGVtTWFuYWdlbWVudEluZm8pID0+IHtcclxuICAgICAgYm1pLm1pUGVySXRlbS5mb3JFYWNoKChpdGVtOiBNYW5hZ2VtZW50SW5mb0FuZElzVmFsaWQpID0+IHtcclxuICAgICAgICBpdGVtLnNhdmUoYmFza2V0SWQsIG51bGwpO1xyXG4gICAgICB9KTtcclxuICAgICAgYm1pLnVzZXJzLmZvckVhY2goKHVzZXI6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGJtaS5taVBlclVzZXJbdXNlcl0ubWFuYWdlbWVudEluZm8uZm9yRWFjaChcclxuICAgICAgICAgIChpdGVtOiBNYW5hZ2VtZW50SW5mb0FuZElzVmFsaWQpID0+IHtcclxuICAgICAgICAgICAgaXRlbS5zYXZlKGJhc2tldElkLCB1c2VyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VuZEJhc2tldEZvckFwcHJvdmFsKGJhc2tldGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJhc2tldChcclxuICAgICAgYmFza2V0aWQsXHJcbiAgICAgIHRoaXMuc2VuZEJhc2tldEZvckFwcHJvdmFsVXBkYXRlclxyXG4gICAgICAgIC51cGRhdGVPbmUoeyBiYXNrZXQ6IGJhc2tldGlkIH0pXHJcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzZXRCYXNrZXRJdGVtUGF5bWVudE9wdGlvbihcclxuICAgIGJhc2tldDogQmFza2V0RGV0YWlscyxcclxuICAgIGJhc2tldEl0ZW06IEJhc2tldEl0ZW0sXHJcbiAgICBwYXltZW50TWV0aG9kOiBzdHJpbmdcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJhc2tldChcclxuICAgICAgYmFza2V0LmlkLFxyXG4gICAgICB0aGlzLnNldFBheW1lbnRNZXRob2RVcGRhdGVyLnVwZGF0ZU9uZSh7XHJcbiAgICAgICAgYmFza2V0SXRlbTogYmFza2V0SXRlbS5pZCxcclxuICAgICAgICBwYXltZW50TWV0aG9kXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYm9va0Jhc2tldChiYXNrZXRpZDogc3RyaW5nLCBzdXBwbGVtZW50YXJ5SW5mbzogU3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvW10pIHtcclxuICAgIHRoaXMudXBkYXRlQmFza2V0KFxyXG4gICAgICBiYXNrZXRpZCxcclxuICAgICAgdGhpcy5ib29rQmFza2V0VXBkYXRlci51cGRhdGVPbmUoeyBpZDogYmFza2V0aWQsIHN1cHBsZW1lbnRhcnlJbmZvIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbW92ZUJhc2tldEl0ZW0oXHJcbiAgICBvcmlnaW5hbEJhc2tldElkOiBzdHJpbmcsXHJcbiAgICBiYXNrZXRJdGVtOiBCYXNrZXRJdGVtLFxyXG4gICAgYmFza2V0SWRUb01vdmVUbzogc3RyaW5nXHJcbiAgKTogdm9pZCB7XHJcbiAgICB0aGlzLm1vdmVJdGVtVG9BRGlmZmVyZW50QmFza2V0XHJcbiAgICAgIC51cGRhdGVPbmUoe1xyXG4gICAgICAgIGJhc2tldEl0ZW06IGJhc2tldEl0ZW0uaWQsXHJcbiAgICAgICAgbmV3QmFza2V0OiBiYXNrZXRJZFRvTW92ZVRvXHJcbiAgICAgIH0pXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZEJhc2tldChvcmlnaW5hbEJhc2tldElkKTtcclxuICAgICAgICB0aGlzLmxvYWRCYXNrZXQoYmFza2V0SWRUb01vdmVUbyk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQmFza2V0Tm90ZXMoYmFza2V0SWQ6IHN0cmluZywgbm90ZXM6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVCYXNrZXQoXHJcbiAgICAgIGJhc2tldElkLFxyXG4gICAgICB0aGlzLnVwZGF0ZUJhc2tldE5vdGVzVXBkYXRlci51cGRhdGVPbmUoeyBpZDogYmFza2V0SWQsIG5vdGVzIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQmFza2V0VGl0bGUoYmFza2V0SWQ6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVCYXNrZXQoXHJcbiAgICAgIGJhc2tldElkLFxyXG4gICAgICB0aGlzLnVwZGF0ZUJhc2tldFRpdGxlVXBkYXRlci51cGRhdGVPbmUoeyBpZDogYmFza2V0SWQsIG5ld1RpdGxlOiB0aXRsZSB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgZ2V0QmFza2V0KHF1ZXJ5OiB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgd2l0aFN1cHBsZW1lbnRhbDogdHJ1ZTtcclxuICB9KTogT2JzZXJ2YWJsZTxHZXRVc2VyQmFza2V0UmVzdWx0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5iYXNrZXRGZXRjaGVyLmZldGNoT25lKHF1ZXJ5KTtcclxuICB9XHJcblxyXG4gIGF0TGVhc3RPbmVTZWFyY2hDaG9zZW4oKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0SW50ZXJmYWNlID0gdGhpcy5maW5kQmFza2V0KFxyXG4gICAgICB0aGlzLmN1cnJlbnRCYXNrZXRJRFxyXG4gICAgKTtcclxuICAgIHJldHVybiBpbnRCYXNrZXQ/LnN1YmplY3QudmFsdWUuYmFza2V0SXRlbXMubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRCYXNrZXRTdGF0cyhpbmRleDogbnVtYmVyKTogQmVoYXZpb3JTdWJqZWN0PEJhc2tldFByaWNlcz4ge1xyXG4gICAgY29uc3QgYmFza2V0UHJpY2VzT2JqID1cclxuICAgICAgdGhpcy5iYXNrZXRzLnZhbHVlW2luZGV4XT8uc3ViamVjdD8udmFsdWU/LnByaWNlcyB8fCB7fTtcclxuICAgIGNvbnN0IGJhc2tldFByaWNlc0tleSA9IE9iamVjdC5rZXlzKGJhc2tldFByaWNlc09iailbMF07XHJcbiAgICBpZiAoYmFza2V0UHJpY2VzS2V5KSB7XHJcbiAgICAgIHRoaXMuYmFza2V0UHJpY2VzLnZhbHVlLmN1cnJlbmN5ID0gYmFza2V0UHJpY2VzS2V5O1xyXG4gICAgICB0aGlzLmJhc2tldFByaWNlcy52YWx1ZS50b3RhbCA9XHJcbiAgICAgICAgdGhpcy5iYXNrZXRzLnZhbHVlW2luZGV4XS5zdWJqZWN0LnZhbHVlLnByaWNlc1tiYXNrZXRQcmljZXNLZXldO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5iYXNrZXRQcmljZXMudmFsdWUudG90YWwgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYmFza2V0UHJpY2VzLnZhbHVlLmxpc3QuZm9yRWFjaCgoa2V5cykgPT4ge1xyXG4gICAgICBrZXlzLnByaWNlID0gdGhpcy5iYXNrZXRzLnZhbHVlW2luZGV4XT8uc3ViamVjdD8udmFsdWU/LmJhc2tldEl0ZW1zXHJcbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5zZXJ2aWNlLnR5cGUgPT09IGtleXMudHlwZSlcclxuICAgICAgICAucmVkdWNlKChzdW0sIGN1cnJlbnQpID0+IHN1bSArIGN1cnJlbnQucHJpY2UsIDApO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5iYXNrZXRQcmljZXM7XHJcbiAgfVxyXG59XHJcblxyXG5pbnRlcmZhY2UgRGV0YWlsU2NoZW1hUHJvcGVydGllcyB7XHJcbiAgdHlwZT86ICdzdHJpbmcnIHwgJ251bWJlcicgfCAnaW50ZWdlcicgfCAnYXJyYXknO1xyXG4gICRyZWY/OiBzdHJpbmc7XHJcbiAgZm9ybWF0Pzogc3RyaW5nO1xyXG59XHJcbmludGVyZmFjZSBEZXRhaWxTY2hlbWEge1xyXG4gICRkZWZzPzogeyBba2V5OiBzdHJpbmddOiBEZXRhaWxTY2hlbWEgfTtcclxuICBhZGRpdGlvbmFsUHJvcGVydGllczogYm9vbGVhbjtcclxuICBwcm9wZXJ0aWVzOiB7IFtrZXk6IHN0cmluZ106IERldGFpbFNjaGVtYVByb3BlcnRpZXMgfTtcclxuICByZXF1aXJlZDogc3RyaW5nW107XHJcbn1cclxuIl19
720
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29idHNlcnZpY2VzL2Jhc2Uvc3JjL2xpYi92ZW5kb3Ivc2VydmljZXMvZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQztBQUN0QixPQUFPLEVBQUUsZUFBZSxFQUF3QixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCxPQUFPLEVBSUwsWUFBWSxFQUVaLGFBQWEsRUFHYixXQUFXLEVBR1osTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBSUwsYUFBYSxFQUVkLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBbUdqRixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUM7QUFnRHpCLE1BQU0sT0FBTyxjQUFjO0lBY3pCLFlBQ0UsTUFBd0IsRUFDaEIsT0FBMkIsRUFDM0IsYUFBK0MsRUFDL0MsY0FBcUM7UUFGckMsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDM0Isa0JBQWEsR0FBYixhQUFhLENBQWtDO1FBQy9DLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUU3QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtZQUNsQixPQUFPLEVBQUUsSUFBSSxlQUFlLGlDQUN2QixN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QUFZLENBQUM7SUFDM0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgQWp2IGZyb20gJ2Fqdic7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFrZSwgdGFwLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIEFkZEl0ZW1Ub0Jhc2tldCxcclxuICBCYXNrZXQsXHJcbiAgQmFza2V0SXRlbSxcclxuICBCYXNrZXRTdGF0dXMsXHJcbiAgTWFuYWdlbWVudEluZm8sXHJcbiAgUGFzc2VuZ2VyVHlwZSxcclxuICBQYXltZW50TWV0aG9kLFxyXG4gIFNlcnZpY2UsXHJcbiAgU2VydmljZVR5cGUsXHJcbiAgU2V0QmFza2V0SXRlbU1pVmFsdWUsXHJcbiAgU3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvXHJcbn0gZnJvbSAnLi4vdHlwZXMvZ3JhcGhxbC50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgR2V0TWlBdXRvU3VnZXN0aW9uQXJyYXksXHJcbiAgR2V0VXNlckJhc2tldEl0ZW1SZXN1bHQsXHJcbiAgR2V0VXNlckJhc2tldFJlc3VsdCxcclxuICBNZW51U2xpZGVFbnVtLFxyXG4gIFVzZXJCYXNrZXRSZXN1bHRcclxufSBmcm9tICcuLi90eXBlcy90eXBlcyc7XHJcbmltcG9ydCB7IE1hbmFnZW1lbnRJbmZvQW5kSXNWYWxpZCB9IGZyb20gJy4uL2NsYXNzZXMvbWFuYWdlbWVudC1pbmZvLWFuZC12YWxpZCc7XHJcbmltcG9ydCB7IE1vZGFsVHlwZXMgfSBmcm9tICcuLi9jbGFzc2VzL21vZGFsLXR5cGVzLmVudW0nO1xyXG5pbXBvcnQgeyBTdXBwbGVtZW50YXJ5Qm9va2luZ0luZm9JbXBsIH0gZnJvbSAnLi4vY2xhc3Nlcy9zdXBwbGVtZW50YXJ5LWJvb2tpbmctaW5mby1pbXBsJztcclxuaW1wb3J0IHsgQmFza2V0SW5mb01pRGV0YWlsc0ltcGwgfSBmcm9tICcuLi9jbGFzc2VzL2Jhc2tldC1pbmZvLW1pLWRldGFpbHMuaW1wbCc7XHJcbmltcG9ydCB7IEJhc2VIZWxwZXJSb3V0aW5lcyB9IGZyb20gJy4uL2NsYXNzZXMvaGVscGVycyc7XHJcbmltcG9ydCB7IEJhc2VNb2RhbE9wZW5lclNlcnZpY2UgfSBmcm9tICcuL21vZGFsLW9wZW5lci5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBCYXNlR2V0VXNlckZldGNoZXIsXHJcbiAgU2VhcmNoR2V0VXNlckZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvdXNlci1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBBY2NlcHROZXdQcmljZUZldGNoZXJUeXBlLFxyXG4gIEJhc2VBY2NlcHROZXdQcmljZVVwZGF0ZXJcclxufSBmcm9tICcuLi91cGRhdGVycy9hY2NlcHQtbmV3LXByaWNlLnVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRCYXNrZXRGZXRjaGVyLFxyXG4gIEdldEJhc2tldEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvYmFza2V0LWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRVc2VyQmFza2V0c0ZldGNoZXIsXHJcbiAgR2V0VXNlckJhc2tldHNGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC11c2Vycy1iYXNrZXRzLWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRNaUF1dG9TdWdlc3Rpb25GZXRjaGVyLFxyXG4gIE1pQXV0b1N1Z2dlc3RGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldE1pQXV0b1N1Z2VzdGlvbnMuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQWRkSXRlbVRvQmFza2V0RmV0Y2hlclR5cGUsXHJcbiAgQmFzZUFkZEl0ZW1Ub0Jhc2tldFVwZGF0ZXJcclxufSBmcm9tICcuLi91cGRhdGVycy9hZGQtaXRlbS10by1iYXNrZXQudXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQWRkVXNlckJhc2tldEZldGNoZXJUeXBlLFxyXG4gIEJhc2VBZGRVc2VyVG9CYXNrZXRJdGVtVXBkYXRlclxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL2FkZFVzZXJUb0Jhc2tldEl0ZW0nO1xyXG5pbXBvcnQge1xyXG4gIFNldEJhc2tldEl0ZW1MZWFkUGFzc2VuZ2VyRmV0Y2hlclR5cGUsXHJcbiAgQmFzZVNldEJhc2tldEl0ZW1MZWFkUGFzc2VuZ2VyVXBkYXRlclxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3NldC1iYXNrZXQtaXRlbS1sZWFkLXBhc3Nlbmdlci51cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlQm9va0Jhc2tldFVwZGF0ZXIsXHJcbiAgQm9va0Jhc2tldEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvYm9vay1iYXNrZXQtdXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUNyZWF0ZUJhc2tldFVwZGF0ZXIsXHJcbiAgQ3JlYXRlQmFza2V0RmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9jcmVhdGUtYmFza2V0LXVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VEZWxldGVCYXNrZXRVcGRhdGVyLFxyXG4gIERlbGV0ZUJhc2tldEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvcmVtb3ZlLWJhc2tldC11cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlUmVtb3ZlSXRlbUZyb21CYXNrZXRVcGRhdGVyLFxyXG4gIERlbGV0ZUJhc2tldEl0ZW1GZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3JlbW92ZS1pdGVtLWZyb20tYmFza2V0LnVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VSZXZhbGlkYXRlQmFza2V0VXBkYXRlcixcclxuICBSZXZhbGlkYXRlQmFza2V0RmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9yZXZhbGlkYXRlLWJhc2tldC11cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlU2VuZEJhc2tldEZvckFwcHJvdmFsVXBkYXRlcixcclxuICBTZW5kQmFza2V0QXBwcm92YWxGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3NlbmQtYmFza2V0LWZvci1hcHByb3ZhbC51cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlU2V0QmFza2V0SXRlbU1pR3JvdXBVcGRhdGVyLFxyXG4gIFNldEJhc2tldEl0TWlHcm91cEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvc2V0LWJhc2tldC1pdGVtLW1pLWdyb3VwJztcclxuaW1wb3J0IHsgVHJhdmVsbGVyIH0gZnJvbSAnLi4vbW9kZWxzL3RyYXZlbGxlci5vYmplY3QnO1xyXG5pbXBvcnQgeyBTZWFyY2hPYmplY3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3NlYXJjaC1vYmplY3RzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNldEJhc2tldEl0ZW1NaVZhbHVlVXBkYXRlcixcclxuICBTZXRCYXNrZXRJdE1pRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9zZXQtYmFza2V0LWl0ZW0tbWktdmFsdWUtdXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVZhbGlkYXRlTWlGcmVlVmFsdWVUZXN0ZXIsXHJcbiAgVmFsaWRhdGVNaUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdGVzdGVycy92YWxpZGF0ZS1taS1mcmVlLXZhbHVlLnRlc3Rlcic7XHJcbmltcG9ydCB7IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc2VhcmNoLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEZ1bGxVc2VyRGV0YWlscyxcclxuICBVc2VyU2VydmljZUludGVyZmFjZVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSXVzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2VcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0llbnRlcnByaXNlLWJhc2tldC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc3VwcGxlbWVudGFyeS1ib29raW5nLWluZm8taW1wbCc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZW1vdmVCYXNrZXRJdGVtVG9CYXNrZXQsXHJcbiAgTW92ZUl0ZW1Ub0FEaWZmZXJlbnRCYXNrZXRUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvbW92ZS1iYXNrZXQtaXRlbS10by1iYXNrZXQnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VVcGRhdGVCYXNrZXROb3Rlc1R5cGUsXHJcbiAgQmFzZVVwZGF0ZUJhc2tldE5vdGVVcGRhdGVyXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvdXBkYXRlLWJhc2tldC1ub3Rlcy11cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlVXBkYXRlQmFza2V0VGl0bGVUeXBlLFxyXG4gIEJhc2VVcGRhdGVCYXNrZXRUaXRsZVVwZGF0ZXJcclxufSBmcm9tICcuLi91cGRhdGVycy91cGRhdGUtYmFza2V0LXRpdGxlLXVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VTZXRQYXltZW50T3B0aW9uVXBkYXRlcixcclxuICBTZXRCYXNrZXRJdGVtUGF5bWVudE1ldGhvZFR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9zZXQtYmFza2V0LWl0ZW0tcGF5bWVuci1vcHRpb24udXBkYXRlcic7XHJcbmNvbnN0IFRFTVBJRCA9ICdURU1QSURfJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQmFza2V0QW5kSXRlbSB7XHJcbiAgYmFza2V0SWQ6IHN0cmluZztcclxuICBpdGVtOiBCYXNrZXRJdGVtO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgTWlHcm91cERldGFpbCB7XHJcbiAgdHlwZTogU2VydmljZVR5cGU7XHJcbiAgb3B0aW9uczogc3RyaW5nW107XHJcbiAgYmFza2V0SXRlbTogQmFza2V0SXRlbTtcclxuICB2YWx1ZTogc3RyaW5nO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgQmFza2V0SXRlbU1hbmFnZW1lbnRJbmZvIHtcclxuICBtaVBlckl0ZW06IE1hbmFnZW1lbnRJbmZvQW5kSXNWYWxpZFtdO1xyXG4gIG1pUGVyVXNlcjoge1xyXG4gICAgW2tleTogc3RyaW5nXToge1xyXG4gICAgICBtYW5hZ2VtZW50SW5mbzogTWFuYWdlbWVudEluZm9BbmRJc1ZhbGlkW107XHJcbiAgICAgIHN1cHBsZW1lbnRhcnlCb29raW5nSW5mbz86IFN1cHBsZW1lbnRhcnlCb29raW5nSW5mb0ludGVyZmFjZTtcclxuICAgIH07XHJcbiAgfTtcclxuICB1c2Vyczogc3RyaW5nW107XHJcbiAgYmFza2V0SXRlbTogQmFza2V0SXRlbTtcclxuICBoaWRlRm9yU2FtZVNlcnZpY2U/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEJhc2tldEluZm9ybWF0aW9uIHtcclxuICBwcmljZXM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH07XHJcbiAgbWl4ZWRDdXJyZW5jeTogYm9vbGVhbjtcclxuICBjb3VudDogbnVtYmVyO1xyXG4gIG1pR3JvdXBzOiBNaUdyb3VwRGV0YWlsW107XHJcbiAgYmFza2V0SW5mb01pRGV0YWlsczogQmFza2V0SW5mb01pRGV0YWlsc0ltcGxbXTtcclxuICBzdXBwSW5mbzogU3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvSW50ZXJmYWNlW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQmFza2V0UHJpY2VzTGlzdCB7XHJcbiAgdHlwZTogU2VydmljZVR5cGU7XHJcbiAgcHJpY2U6IG51bWJlcjtcclxuICBjdXJyZW5jeT86IHN0cmluZztcclxuICB0ZXh0OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQmFza2V0UHJpY2VzIHtcclxuICB0b3RhbDogbnVtYmVyO1xyXG4gIGN1cnJlbmN5Pzogc3RyaW5nO1xyXG4gIGxpc3Q6IEJhc2tldFByaWNlc0xpc3RbXTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgQmFza2V0RGV0YWlscyA9IFVzZXJCYXNrZXRSZXN1bHQgJiBCYXNrZXRJbmZvcm1hdGlvbjtcclxuZXhwb3J0IGNsYXNzIEludGVybmFsQmFza2V0PFEgZXh0ZW5kcyBTZWFyY2hHZXRVc2VyRmV0Y2hlclR5cGU+XHJcbiAgaW1wbGVtZW50cyBCYXNrZXRJbmZvcm1hdGlvbiwgSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2Vcclxue1xyXG4gIHN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxCYXNrZXREZXRhaWxzPjtcclxuICBpZD86IHN0cmluZztcclxuICB0ZW1waWQ/OiBzdHJpbmc7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBwcmljZXM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH07XHJcbiAgbWl4ZWRDdXJyZW5jeTogYm9vbGVhbjtcclxuICBjb3VudDogbnVtYmVyO1xyXG4gIG1pR3JvdXBzOiBNaUdyb3VwRGV0YWlsW107XHJcbiAgYmFza2V0SW5mb01pRGV0YWlsczogQmFza2V0SW5mb01pRGV0YWlsc0ltcGxbXTtcclxuICBzdXBwSW5mbzogU3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvSW50ZXJmYWNlW107XHJcbiAgZ3JhbmRUb3RhbDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGJhc2tldDogVXNlckJhc2tldFJlc3VsdCxcclxuICAgIHByaXZhdGUgaGVscGVyczogQmFzZUhlbHBlclJvdXRpbmVzLFxyXG4gICAgcHJpdmF0ZSBiYXNrZXRTZXJ2aWNlOiBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICAgIHByaXZhdGUgZ2V0VXNlckZldGNoZXI6IEJhc2VHZXRVc2VyRmV0Y2hlcjxRPlxyXG4gICkge1xyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7XHJcbiAgICAgIHN1YmplY3Q6IG5ldyBCZWhhdmlvclN1YmplY3Q8QmFza2V0RGV0YWlscz4oe1xyXG4gICAgICAgIC4uLmJhc2tldCxcclxuICAgICAgICBwcmljZXM6IHt9LFxyXG4gICAgICAgIG1peGVkQ3VycmVuY3k6IGZhbHNlLFxyXG4gICAgICAgIGNvdW50OiAwLFxyXG4gICAgICAgIG1pR3JvdXBzOiBbXSxcclxuICAgICAgICBiYXNrZXRJbmZvTWlEZXRhaWxzOiBbXSxcclxuICAgICAgICBzdXBwSW5mbzogW11cclxuICAgICAgfSksXHJcbiAgICAgIHRlbXBpZDogYmFza2V0LmlkLFxyXG4gICAgICBpZDogYmFza2V0LmlkLFxyXG4gICAgICB0aXRsZTogYmFza2V0LnRpdGxlLFxyXG4gICAgICBwcmljZXM6IHt9LFxyXG4gICAgICBtaXhlZEN1cnJlbmN5OiBmYWxzZSxcclxuICAgICAgY291bnQ6IDAsXHJcbiAgICAgIG1pR3JvdXBzOiBbXSxcclxuICAgICAgYmFza2V0SW5mb01pRGV0YWlsczogW10sXHJcbiAgICAgIHN1cHBJbmZvOiBbXVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm5leHQoYmFza2V0KTtcclxuICB9XHJcblxyXG4gIGRlc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLnN1YmplY3QuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIG5leHQoYmFza2V0OiBVc2VyQmFza2V0UmVzdWx0KSB7XHJcbiAgICBiYXNrZXQgPSB0aGlzLmhlbHBlcnMuY2xvbmUoYmFza2V0KTtcclxuICAgIGlmIChcclxuICAgICAgYmFza2V0LnN0YXR1cyA9PT0gQmFza2V0U3RhdHVzLkFwcHJvdmVkICYmXHJcbiAgICAgIGJhc2tldC5iYXNrZXRJdGVtc1swXS5wZXJJdGVtUGhvbmVOdW1iZXIgPT09IHVuZGVmaW5lZFxyXG4gICAgKSB7XHJcbiAgICAgIC8vIFdlJ3JlIGluIGFwcHJvdmVkIHN0YXRlIHNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgdGhlIHN1cHBsZW1lbnQgc3R1ZmZcclxuICAgICAgdGhpcy5iYXNrZXRTZXJ2aWNlXHJcbiAgICAgICAgLmdldEJhc2tldCh7IGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJywgaWQ6IGJhc2tldC5pZCwgd2l0aFN1cHBsZW1lbnRhbDogdHJ1ZSB9KVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKG5ld0Jhc2tldDogVXNlckJhc2tldFJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5uZXh0KG5ld0Jhc2tldCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaWQgPSBiYXNrZXQuaWQ7XHJcbiAgICB0aGlzLnRpdGxlID0gYmFza2V0LnRpdGxlO1xyXG4gICAgY29uc3QgdG9TZW5kOiBCYXNrZXREZXRhaWxzID0ge1xyXG4gICAgICAuLi5iYXNrZXQsXHJcbiAgICAgIC4uLihiYXNrZXQuYmFza2V0SXRlbXMgfHwgW10pLnJlZHVjZShcclxuICAgICAgICAoYWNjdW06IEJhc2tldEluZm9ybWF0aW9uLCBpdGVtOiBCYXNrZXRJdGVtLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWFjY3VtLnByaWNlc1tpdGVtLmN1cnJlbmN5XSkge1xyXG4gICAgICAgICAgICBhY2N1bS5wcmljZXNbaXRlbS5jdXJyZW5jeV0gPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYWNjdW0ucHJpY2VzW2l0ZW0uY3VycmVuY3ldICs9IGl0ZW0ucHJpY2U7XHJcblxyXG4gICAgICAgICAgYWNjdW0uc3VwcEluZm8ucHVzaChcclxuICAgICAgICAgICAgbmV3IFN1cHBsZW1lbnRhcnlCb29raW5nSW5mb0ltcGwoXHJcbiAgICAgICAgICAgICAgaXRlbSxcclxuICAgICAgICAgICAgICB0aGlzLmhlbHBlcnMsXHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRVc2VyRmV0Y2hlclxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKGl0ZW0ubWlHcm91cHNBdmFpbGFibGUgJiYgaXRlbS5taUdyb3Vwc0F2YWlsYWJsZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGFjY3VtLm1pR3JvdXBzLnB1c2goe1xyXG4gICAgICAgICAgICAgIHR5cGU6IGl0ZW0uc2VydmljZS50eXBlLFxyXG4gICAgICAgICAgICAgIG9wdGlvbnM6IGl0ZW0ubWlHcm91cHNBdmFpbGFibGUsXHJcbiAgICAgICAgICAgICAgYmFza2V0SXRlbTogaXRlbSxcclxuICAgICAgICAgICAgICB2YWx1ZTogaXRlbS5taUdyb3VwU2VsZWN0ZWQgfHwgJydcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoaXRlbS5tYW5hZ2VtZW50SW5mbz8ubGVuZ3RoID4gMCAmJiBpdGVtLnVzZXJzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGFjY3VtLmJhc2tldEluZm9NaURldGFpbHMucHVzaChcclxuICAgICAgICAgICAgICBuZXcgQmFza2V0SW5mb01pRGV0YWlsc0ltcGwoXHJcbiAgICAgICAgICAgICAgICBpdGVtLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5iYXNrZXRTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJzXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJpY2VzOiB7fSxcclxuICAgICAgICAgIG1peGVkQ3VycmVuY3k6IGZhbHNlLFxyXG4gICAgICAgICAgY291bnQ6IGJhc2tldC5iYXNrZXRJdGVtcz8ubGVuZ3RoIHx8IDAsXHJcbiAgICAgICAgICBtaUdyb3VwczogW10sXHJcbiAgICAgICAgICBiYXNrZXRJbmZvTWlEZXRhaWxzOiBbXSxcclxuICAgICAgICAgIHN1cHBJbmZvOiBbXVxyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG4gICAgfTtcclxuICAgIHRvU2VuZC5taXhlZEN1cnJlbmN5ID0gT2JqZWN0LmtleXModG9TZW5kLnByaWNlcykubGVuZ3RoID4gMTtcclxuICAgIHRoaXMuc3ViamVjdC5uZXh0KHRvU2VuZCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUVudGVycHJpc2VCYXNrZXRTZXJ2aWNlPFxyXG4gIEFOUFVfUSBleHRlbmRzIEFjY2VwdE5ld1ByaWNlRmV0Y2hlclR5cGUsXHJcbiAgQUlUQl9RIGV4dGVuZHMgQWRkSXRlbVRvQmFza2V0RmV0Y2hlclR5cGUsXHJcbiAgQVVUQl9RIGV4dGVuZHMgQWRkVXNlckJhc2tldEZldGNoZXJUeXBlLFxyXG4gIENCX1EgZXh0ZW5kcyBDcmVhdGVCYXNrZXRGZXRjaGVyVHlwZSxcclxuICBHQl9RIGV4dGVuZHMgR2V0QmFza2V0RmV0Y2hlclR5cGUsXHJcbiAgQkJfUSBleHRlbmRzIEJvb2tCYXNrZXRGZXRjaGVyVHlwZSxcclxuICBEQl9RIGV4dGVuZHMgRGVsZXRlQmFza2V0RmV0Y2hlclR5cGUsXHJcbiAgR0FTX1EgZXh0ZW5kcyBNaUF1dG9TdWdnZXN0RmV0Y2hlclR5cGUsXHJcbiAgUklCX1EgZXh0ZW5kcyBEZWxldGVCYXNrZXRJdGVtRmV0Y2hlclR5cGUsXHJcbiAgUlZCX1EgZXh0ZW5kcyBSZXZhbGlkYXRlQmFza2V0RmV0Y2hlclR5cGUsXHJcbiAgU0JNSV9RIGV4dGVuZHMgU2V0QmFza2V0SXRNaUdyb3VwRmV0Y2hlclR5cGUsXHJcbiAgU1ZNSV9RIGV4dGVuZHMgU2V0QmFza2V0SXRNaUZldGNoZXJUeXBlLFxyXG4gIFZNSV9RIGV4dGVuZHMgVmFsaWRhdGVNaUZldGNoZXJUeXBlLFxyXG4gIFNCQV9RIGV4dGVuZHMgU2VuZEJhc2tldEFwcHJvdmFsRmV0Y2hlclR5cGUsXHJcbiAgR1VfUSBleHRlbmRzIFNlYXJjaEdldFVzZXJGZXRjaGVyVHlwZSxcclxuICBHVUJfUSBleHRlbmRzIEdldFVzZXJCYXNrZXRzRmV0Y2hlclR5cGUsXHJcbiAgU0JMUF9RIGV4dGVuZHMgU2V0QmFza2V0SXRlbUxlYWRQYXNzZW5nZXJGZXRjaGVyVHlwZSxcclxuICBNSVREQl9RIGV4dGVuZHMgTW92ZUl0ZW1Ub0FEaWZmZXJlbnRCYXNrZXRUeXBlLFxyXG4gIFVCTl9RIGV4dGVuZHMgQmFzZVVwZGF0ZUJhc2tldE5vdGVzVHlwZSxcclxuICBVQlRfUSBleHRlbmRzIEJhc2VVcGRhdGVCYXNrZXRUaXRsZVR5cGUsXHJcbiAgU0JNX1EgZXh0ZW5kcyBTZXRCYXNrZXRJdGVtUGF5bWVudE1ldGhvZFR5cGVcclxuPiBpbXBsZW1lbnRzIEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlXHJcbntcclxuICBwcml2YXRlIGN1cnJlbnRCYXNrZXRzOiBJbnRlcm5hbEJhc2tldDxHVV9RPltdID0gW107XHJcblxyXG4gIGhpZ2hsaWdodEJhc2tldEl0ZW1zRW1pdHRlcjogU3ViamVjdDxHZXRVc2VyQmFza2V0SXRlbVJlc3VsdFtdPiA9IG5ldyBTdWJqZWN0PFxyXG4gICAgR2V0VXNlckJhc2tldEl0ZW1SZXN1bHRbXVxyXG4gID4oKTtcclxuXHJcbiAgYmFza2V0Q2hhbmdlRW1pdHRlcjogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oXHJcbiAgICAnJ1xyXG4gICk7XHJcblxyXG4gIHByaXZhdGUgZ2V0IGN1cnJlbnRCYXNrZXRJRCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci52YWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0IGN1cnJlbnRCYXNrZXRJRCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuY3VycmVudEJhc2tldElEKSB7XHJcbiAgICAgIC8vIHRoaXMgcHJldmVudHMgdGhlIGVtaXR0ZXIgZ2V0dGluZyBzdHVjayBpbiBhIGxvb3AgIC0gY2FzdWluZyBicm93c2VyIG92ZXJsb2Fkc1xyXG4gICAgICB0aGlzLmJhc2tldENoYW5nZUVtaXR0ZXIubmV4dCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBiYXNrZXRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJbnRlcm5hbEJhc2tldDxHVV9RPltdPihbXSk7XHJcblxyXG4gIGJhc2tldExpc3Q6IEJhc2tldFByaWNlc0xpc3RbXSA9IFtcclxuICAgIHtcclxuICAgICAgdHlwZTogU2VydmljZVR5cGUuRmxpZ2h0LFxyXG4gICAgICB0ZXh0OiAnRkxJR0hUUycsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5SYWlsLFxyXG4gICAgICB0ZXh0OiAnUkFJTCcsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5Ib3RlbCxcclxuICAgICAgdGV4dDogJ0hPVEVMUycsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5DYWIsXHJcbiAgICAgIHRleHQ6ICdUQVhJUycsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5DYXIsXHJcbiAgICAgIHRleHQ6ICdDQVJTJyxcclxuICAgICAgcHJpY2U6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6IFNlcnZpY2VUeXBlLkV1cm9zdGFyLFxyXG4gICAgICB0ZXh0OiAnRVVST1NUQVInLFxyXG4gICAgICBwcmljZTogMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogU2VydmljZVR5cGUuSW50ZXJuYXRpb25hbFJhaWwsXHJcbiAgICAgIHRleHQ6ICdJTlRFUk5BVElPTkFMIFJBSUwnLFxyXG4gICAgICBwcmljZTogMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogU2VydmljZVR5cGUuUGFya2luZyxcclxuICAgICAgdGV4dDogJ1BBUktJTkcnLFxyXG4gICAgICBwcmljZTogMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogU2VydmljZVR5cGUuTG91bmdlLFxyXG4gICAgICB0ZXh0OiAnTE9VTkdFUycsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5Db2FjaCxcclxuICAgICAgdGV4dDogJ0NPQUNIJyxcclxuICAgICAgcHJpY2U6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6IFNlcnZpY2VUeXBlLkZhc3RUcmFjayxcclxuICAgICAgdGV4dDogJ0ZBU1RfVFJBQ0snLFxyXG4gICAgICBwcmljZTogMFxyXG4gICAgfVxyXG4gIF07XHJcblxyXG4gIGJhc2tldFByaWNlczogQmVoYXZpb3JTdWJqZWN0PEJhc2tldFByaWNlcz4gPVxyXG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdDxCYXNrZXRQcmljZXM+KHsgdG90YWw6IG51bGwsIGxpc3Q6IHRoaXMuYmFza2V0TGlzdCB9KTtcclxuXHJcbiAgbWVudVN0YXRlID0gTWVudVNsaWRlRW51bS5PVVQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhY2NlcHROZXdQcmljZVVwZGF0ZXI6IEJhc2VBY2NlcHROZXdQcmljZVVwZGF0ZXI8QU5QVV9RPixcclxuICAgIHByaXZhdGUgYWRkSXRlbVRvQmFza2V0VXBkYXRlcjogQmFzZUFkZEl0ZW1Ub0Jhc2tldFVwZGF0ZXI8QUlUQl9RPixcclxuICAgIHByaXZhdGUgYWRkVXNlclRvQmFza2V0SXRlbTogQmFzZUFkZFVzZXJUb0Jhc2tldEl0ZW1VcGRhdGVyPEFVVEJfUT4sXHJcbiAgICBwcml2YXRlIGJhc2tldENyZWF0b3I6IEJhc2VDcmVhdGVCYXNrZXRVcGRhdGVyPENCX1E+LFxyXG4gICAgcHVibGljIGJhc2tldEZldGNoZXI6IEJhc2VHZXRCYXNrZXRGZXRjaGVyPEdCX1E+LFxyXG4gICAgcHJpdmF0ZSBib29rQmFza2V0VXBkYXRlcjogQmFzZUJvb2tCYXNrZXRVcGRhdGVyPEJCX1E+LFxyXG4gICAgcHJpdmF0ZSBkZWxldGVCYXNrZXRVcGRhdGVyOiBCYXNlRGVsZXRlQmFza2V0VXBkYXRlcjxEQl9RPixcclxuICAgIHByaXZhdGUgZ2V0TWlBdXRvU3VnZXN0aW9uRmV0Y2hlcjogQmFzZUdldE1pQXV0b1N1Z2VzdGlvbkZldGNoZXI8R0FTX1E+LFxyXG4gICAgcHJpdmF0ZSBoZWxwZXJzOiBCYXNlSGVscGVyUm91dGluZXMsXHJcbiAgICBwcml2YXRlIHJlbW92ZUl0ZW1Gcm9tQmFza2V0VXBkYXRlcjogQmFzZVJlbW92ZUl0ZW1Gcm9tQmFza2V0VXBkYXRlcjxSSUJfUT4sXHJcbiAgICBwcml2YXRlIHJldmFsaWRhdGVCYXNrZXRVcGRhdGVyOiBCYXNlUmV2YWxpZGF0ZUJhc2tldFVwZGF0ZXI8UlZCX1E+LFxyXG4gICAgcHJpdmF0ZSBzZXRCYXNrZXRJdGVtTWlHcm91cFVwZGF0ZXI6IEJhc2VTZXRCYXNrZXRJdGVtTWlHcm91cFVwZGF0ZXI8U0JNSV9RPixcclxuICAgIHByaXZhdGUgc2V0QmFza2V0SXRlbU1pVmFsdWVVcGRhdGVyOiBCYXNlU2V0QmFza2V0SXRlbU1pVmFsdWVVcGRhdGVyPFNWTUlfUT4sXHJcbiAgICBwcml2YXRlIHZhbGlkYXRlTWlGcmVlVmFsdWU6IEJhc2VWYWxpZGF0ZU1pRnJlZVZhbHVlVGVzdGVyPFZNSV9RPixcclxuICAgIHByaXZhdGUgc2VuZEJhc2tldEZvckFwcHJvdmFsVXBkYXRlcjogQmFzZVNlbmRCYXNrZXRGb3JBcHByb3ZhbFVwZGF0ZXI8U0JBX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRVc2VyRmV0Y2hlcjogQmFzZUdldFVzZXJGZXRjaGVyPEdVX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRVc2VyQmFza2V0c0ZldGNoZXI6IEJhc2VHZXRVc2VyQmFza2V0c0ZldGNoZXI8R1VCX1E+LFxyXG4gICAgcHJpdmF0ZSBTZXRCYXNrZXRJdGVtTGVhZFBhc3NlbmdlcjogQmFzZVNldEJhc2tldEl0ZW1MZWFkUGFzc2VuZ2VyVXBkYXRlcjxTQkxQX1E+LFxyXG4gICAgcHJpdmF0ZSBtb3ZlSXRlbVRvQURpZmZlcmVudEJhc2tldDogQmFzZW1vdmVCYXNrZXRJdGVtVG9CYXNrZXQ8TUlUREJfUT4sXHJcbiAgICBwcml2YXRlIHVwZGF0ZUJhc2tldE5vdGVzVXBkYXRlcjogQmFzZVVwZGF0ZUJhc2tldE5vdGVVcGRhdGVyPFVCTl9RPixcclxuICAgIHByaXZhdGUgdXBkYXRlQmFza2V0VGl0bGVVcGRhdGVyOiBCYXNlVXBkYXRlQmFza2V0VGl0bGVVcGRhdGVyPFVCVF9RPixcclxuICAgIHByaXZhdGUgc2V0UGF5bWVudE1ldGhvZFVwZGF0ZXI6IEJhc2VTZXRQYXltZW50T3B0aW9uVXBkYXRlcjxTQk1fUT4sXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZUludGVyZmFjZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBCYXNlTW9kYWxPcGVuZXJTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnVzZXJTZXJ2aWNlLmNoYW5nZVVzZXIuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHVzZXJEZXRhaWxzOiBGdWxsVXNlckRldGFpbHMpID0+IHtcclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0KCkge1xyXG4gICAgaWYgKHRoaXMudXNlclNlcnZpY2UuZ2V0ZnVsbFVzZXJEZXRhaWxzKGZhbHNlKS51c2VyRGF0YS52YWx1ZSkge1xyXG4gICAgICB0aGlzLmdldFVzZXJCYXNrZXRzRmV0Y2hlclxyXG4gICAgICAgIC5mZXRjaExpc3Qoe1xyXG4gICAgICAgICAgYmFza2V0U3RhdHVzOiBCYXNrZXRTdGF0dXMuT3BlbixcclxuICAgICAgICAgIHVzZXI6IHRoaXMudXNlclNlcnZpY2VcclxuICAgICAgICAgICAgLmdldGZ1bGxVc2VyRGV0YWlscyh0cnVlKVxyXG4gICAgICAgICAgICAudXNlckRhdGEudmFsdWUudXNlcl9pZC50b1N0cmluZygpXHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAoYmFza2V0czogVXNlckJhc2tldFJlc3VsdFtdKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRCYXNrZXRzID0gYmFza2V0cy5tYXAoKGJhc2tldDogVXNlckJhc2tldFJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChiYXNrZXQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpbnRCYXNrZXQgPSB0aGlzLmZpbmRCYXNrZXQoYmFza2V0LmlkKTtcclxuICAgICAgICAgICAgICAgIGlmICghaW50QmFza2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgIGludEJhc2tldCA9IG5ldyBJbnRlcm5hbEJhc2tldChcclxuICAgICAgICAgICAgICAgICAgICBiYXNrZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRVc2VyRmV0Y2hlclxyXG4gICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFza2V0cy5wdXNoKGludEJhc2tldCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW50QmFza2V0O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmJhc2tldHMubmV4dChjdXJyZW50QmFza2V0cyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY3VycmVudEJhc2tldHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhc2tldElEID0gY3VycmVudEJhc2tldHNbMF0uaWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFza2V0SUQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmJhc2tldENoYW5nZUVtaXR0ZXIubmV4dCh0aGlzLmN1cnJlbnRCYXNrZXRJRCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEJhc2tldHMuZm9yRWFjaCgoYmFza2V0OiBJbnRlcm5hbEJhc2tldEludGVyZmFjZSkgPT5cclxuICAgICAgICBiYXNrZXQuc3ViamVjdC51bnN1YnNjcmliZSgpXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuY3VycmVudEJhc2tldHMgPSBbXTtcclxuICAgICAgdGhpcy5jdXJyZW50QmFza2V0SUQgPSBudWxsO1xyXG4gICAgICB0aGlzLmJhc2tldHMubmV4dCh0aGlzLmN1cnJlbnRCYXNrZXRzKTtcclxuICAgICAgdGhpcy5iYXNrZXRDaGFuZ2VFbWl0dGVyLm5leHQodGhpcy5jdXJyZW50QmFza2V0SUQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEFsbE9wZW5CYXNrZXRzKHVzZXJfaWQ6IHN0cmluZyk6IFByb21pc2U8VXNlckJhc2tldFJlc3VsdFtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRVc2VyQmFza2V0c0ZldGNoZXJcclxuICAgICAgLmZldGNoTGlzdCh7IGJhc2tldFN0YXR1czogQmFza2V0U3RhdHVzLk9wZW4sIHVzZXI6IHVzZXJfaWQgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBtYXAoKHJlc3VsdHM6IFVzZXJCYXNrZXRSZXN1bHRbXSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0OiBVc2VyQmFza2V0UmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmZpbmRCYXNrZXQocmVzdWx0LmlkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW50QmFza2V0ID0gbmV3IEludGVybmFsQmFza2V0KFxyXG4gICAgICAgICAgICAgICAgICByZXN1bHQsXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuaGVscGVycyxcclxuICAgICAgICAgICAgICAgICAgdGhpcyxcclxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRVc2VyRmV0Y2hlclxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhc2tldHMucHVzaChpbnRCYXNrZXQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYWRkVG9CYXNrZXQoXHJcbiAgICBpdGVtOiBBZGRJdGVtVG9CYXNrZXQuVmFyaWFibGVzLFxyXG4gICAgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPixcclxuICAgIHNlYXJjaFNlcnZpY2U6IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgdHJhdmVsbGVyczogVHJhdmVsbGVyW10gPSBbXVxyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaXRlbS5jb252ZXJ0Q3VycmVuY3lUbyA9ICdHQlAnO1xyXG4gICAgaWYgKHRyYXZlbGxlcnM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgaXRlbS51c2VycyA9IHRoaXMuaGVscGVycy5tYWtlVXNlcnModHJhdmVsbGVycyk7XHJcbiAgICAgIGl0ZW0ubGVhZFBhc3NlbmdlciA9IGl0ZW0udXNlcnNbMF0uaWQ7XHJcbiAgICB9XHJcbiAgICBpdGVtLm91dGJvdW5kRGF0ZSA9IGl0ZW0ub3V0Ym91bmREYXRlXHJcbiAgICAgID8gbmV3IERhdGUodGhpcy5oZWxwZXJzLmZvcm1hdElzb0RhdGVUaW1lKGl0ZW0ub3V0Ym91bmREYXRlKSlcclxuICAgICAgOiBpdGVtLm91dGJvdW5kRGF0ZTtcclxuICAgIGl0ZW0uaW5ib3VuZERhdGUgPSBpdGVtLmluYm91bmREYXRlXHJcbiAgICAgID8gbmV3IERhdGUodGhpcy5oZWxwZXJzLmZvcm1hdElzb0RhdGVUaW1lKGl0ZW0uaW5ib3VuZERhdGUpKVxyXG4gICAgICA6IGl0ZW0uaW5ib3VuZERhdGU7XHJcblxyXG4gICAgaXRlbSA9IHRoaXMuY2hlY2tEZXRhaWxzKGl0ZW0pO1xyXG4gICAgaWYgKGl0ZW0gJiYgaW50QmFza2V0KSB7XHJcbiAgICAgIHRoaXMuYWRkSXRlbVRvQmFza2V0VXBkYXRlclxyXG4gICAgICAgIC51cGRhdGVPbmUoaXRlbSlcclxuICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAobmV3QmFza2V0OiBQYXJ0aWFsPFVzZXJCYXNrZXRSZXN1bHQ+KSA9PiB7XHJcbiAgICAgICAgICAgIGludEJhc2tldC5uZXh0KHtcclxuICAgICAgICAgICAgICAuLi5pbnRCYXNrZXQuc3ViamVjdC52YWx1ZSxcclxuICAgICAgICAgICAgICAuLi5uZXdCYXNrZXRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnVzZXJTZXJ2aWNlLmZpbmRTZXJ2aWNlKGl0ZW0uc2VydmljZSkudHlwZTtcclxuICAgICAgICAgICAgc2VhcmNoU2VydmljZS5zZWFyY2hfb2JqZWN0c1tzZXJ2aWNlXS5ib29raW5nX2Nob3NlbiA9IHRydWU7XHJcbiAgICAgICAgICAgIHNlYXJjaFNlcnZpY2Uuc2VhcmNoX29iamVjdHNbc2VydmljZV0uY2hvc2VuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNvbnN0IGJpOiBHZXRVc2VyQmFza2V0SXRlbVJlc3VsdFtdID0gbmV3QmFza2V0LmJhc2tldEl0ZW1zO1xyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodEJhc2tldEl0ZW1zRW1pdHRlci5uZXh0KGJpKTtcclxuICAgICAgICAgICAgdGhpcy5iYXNrZXRDaGFuZ2VFbWl0dGVyLm5leHQodGhpcy5jdXJyZW50QmFza2V0SUQpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICBpbnRCYXNrZXQuc3ViamVjdC5uZXh0KGludEJhc2tldC5zdWJqZWN0LnZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbG9hZEJhc2tldChpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgaW50QmFza2V0ID0gdGhpcy5maW5kQmFza2V0KGlkKTtcclxuICAgIGlmICghaW50QmFza2V0KSB7XHJcbiAgICAgIGludEJhc2tldCA9IG5ldyBJbnRlcm5hbEJhc2tldChcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZCxcclxuICAgICAgICAgIGJhc2tldEl0ZW1zOiBbXVxyXG4gICAgICAgIH0gYXMgQmFza2V0RGV0YWlscyxcclxuICAgICAgICB0aGlzLmhlbHBlcnMsXHJcbiAgICAgICAgdGhpcyxcclxuICAgICAgICB0aGlzLmdldFVzZXJGZXRjaGVyXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuY3VycmVudEJhc2tldHMucHVzaChpbnRCYXNrZXQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5iYXNrZXRGZXRjaGVyXHJcbiAgICAgIC5mZXRjaE9uZSh7IGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJywgaWR9KVxyXG4gICAgICAuc3Vic2NyaWJlKChuZXdCYXNrZXQ6IFVzZXJCYXNrZXRSZXN1bHQpID0+IHtcclxuICAgICAgICBpbnRCYXNrZXQubmV4dChuZXdCYXNrZXQpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHN1YnNyaWJlVG9CYXNrZXQoaWQ6IHN0cmluZywgb2JzZXJ2ZXI6IE9ic2VydmVyPEJhc2tldERldGFpbHM+KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnRCYXNrZXQgPSB0aGlzLmZpbmRCYXNrZXQoaWQpO1xyXG4gICAgaWYgKGludEJhc2tldCkge1xyXG4gICAgICBpbnRCYXNrZXQuc3ViamVjdC5zdWJzY3JpYmUob2JzZXJ2ZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRXhwaXJlZEl0ZW1zKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGludEJhc2tldCA9IHRoaXMuZmluZEJhc2tldChpZCk7XHJcbiAgICBpbnRCYXNrZXQuc3ViamVjdC52YWx1ZS5iYXNrZXRJdGVtc1xyXG4gICAgICAuZmlsdGVyKChiYXNrZXRJdGVtOiBCYXNrZXRJdGVtKTogYm9vbGVhbiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIGJhc2tldEl0ZW0ubGF0ZXN0VmFsaWRhdGlvblByaWNlRGlmZmVyZW5jZSAhPT0gMCB8fCBiYXNrZXRJdGVtLmV4cGlyZWRcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgICAuZm9yRWFjaCgoYmFza2V0SXRlbTogQmFza2V0SXRlbSkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQmFza2V0SXRlbShpZCwgYmFza2V0SXRlbSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlQmFza2V0SXRlbShiYXNrZXRJZDogc3RyaW5nLCBpdGVtOiBCYXNrZXRJdGVtKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0PEdVX1E+ID0gdGhpcy5maW5kQmFza2V0KGJhc2tldElkKTtcclxuICAgIC8vIGlmIGl0J3MgYSBob3RlbCByZW1vdmUgYWxsIGxpbmtlZCBpdGVtc1xyXG4gICAgaWYgKGl0ZW0uc2VydmljZS50eXBlID09PSBTZXJ2aWNlVHlwZS5Ib3RlbCkge1xyXG4gICAgICBjb25zdCBob3RlbEl0ZW1zID0gaW50QmFza2V0LnN1YmplY3QudmFsdWUuYmFza2V0SXRlbXMuZmlsdGVyKFxyXG4gICAgICAgIChiYXNrZXRJdGVtKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICBpdGVtLmRldGFpbC5ob3RlbElkID09PSBiYXNrZXRJdGVtLmRldGFpbC5ob3RlbElkICYmXHJcbiAgICAgICAgICAgIGl0ZW0uZGV0YWlsLnJvb21zWzBdLmlkID09PSBiYXNrZXRJdGVtLmRldGFpbC5yb29tc1swXS5pZCAmJlxyXG4gICAgICAgICAgICBpdGVtLmRldGFpbC5yb29tc1swXS5jaGVja0luID09PVxyXG4gICAgICAgICAgICAgIGJhc2tldEl0ZW0uZGV0YWlsLnJvb21zWzBdLmNoZWNrSW4gJiZcclxuICAgICAgICAgICAgaXRlbS5kZXRhaWwucm9vbXNbMF0uY2hlY2tPdXQgPT09XHJcbiAgICAgICAgICAgICAgYmFza2V0SXRlbS5kZXRhaWwucm9vbXNbMF0uY2hlY2tPdXRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoaG90ZWxJdGVtcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgLy8gRU5ULTI0NDcgbmV3IG1vZGFsIG1hZGUgaW4gTFUsIG5lZWRzIHRvIGJlIG1hZGUgaW4gYWxsIG9idHMgYW5kIGFwcCBvciB3aWxsIGdldCBlcnJvclxyXG4gICAgICAgIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oTW9kYWxUeXBlcy5XYXJuaW5nUmVtb3ZlTW9kYWxDb21wb25lbnQpO1xyXG4gICAgICAgIGhvdGVsSXRlbXMuZm9yRWFjaCgoaXRlbTogQmFza2V0SXRlbSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVJdGVtRnJvbUJhc2tldFVwZGF0ZXJcclxuICAgICAgICAgICAgLnVwZGF0ZU9uZSh7IGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJywgYmFza2V0SXRlbTogaXRlbS5pZCB9KVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChuZXdCYXNrZXQ6IEJhc2tldCkgPT4ge1xyXG4gICAgICAgICAgICAgIGludEJhc2tldC5uZXh0KHtcclxuICAgICAgICAgICAgICAgIC4uLmludEJhc2tldC5zdWJqZWN0LnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgLi4ubmV3QmFza2V0XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5iYXNrZXRDaGFuZ2VFbWl0dGVyLm5leHQoYmFza2V0SWQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUl0ZW1Gcm9tQmFza2V0VXBkYXRlclxyXG4gICAgICAgICAgLnVwZGF0ZU9uZSh7IGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJywgYmFza2V0SXRlbTogaXRlbS5pZCB9KVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgobmV3QmFza2V0OiBCYXNrZXQpID0+IHtcclxuICAgICAgICAgICAgaW50QmFza2V0Lm5leHQoe1xyXG4gICAgICAgICAgICAgIC4uLmludEJhc2tldC5zdWJqZWN0LnZhbHVlLFxyXG4gICAgICAgICAgICAgIC4uLm5ld0Jhc2tldFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5iYXNrZXRDaGFuZ2VFbWl0dGVyLm5leHQoYmFza2V0SWQpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlSXRlbUZyb21CYXNrZXRVcGRhdGVyXHJcbiAgICAgICAgLnVwZGF0ZU9uZSh7IGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJywgYmFza2V0SXRlbTogaXRlbS5pZCB9KVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKG5ld0Jhc2tldDogQmFza2V0KSA9PiB7XHJcbiAgICAgICAgICBpbnRCYXNrZXQubmV4dCh7XHJcbiAgICAgICAgICAgIC4uLmludEJhc2tldC5zdWJqZWN0LnZhbHVlLFxyXG4gICAgICAgICAgICAuLi5uZXdCYXNrZXRcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5iYXNrZXRDaGFuZ2VFbWl0dGVyLm5leHQoYmFza2V0SWQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldERlZmF1bHRCYXNrZXQoXHJcbiAgICBnZXRCb29rZWRCYXNrZXQ6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICk6IFByb21pc2U8SW50ZXJuYWxCYXNrZXQ8R1VfUT4+IHtcclxuICAgIGNvbnN0IGludGVybmFsQmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPiA9IG51bGw7XHJcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmN1cnJlbnRCYXNrZXRJRCk7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kT3JDcmVhdGVCYXNrZXQoXHJcbiAgICAgIHRoaXMuY3VycmVudEJhc2tldElELFxyXG4gICAgICBnZXRCb29rZWRCYXNrZXRcclxuICAgICkudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaW5kQmFza2V0KGlkOiBzdHJpbmcpOiBJbnRlcm5hbEJhc2tldDxHVV9RPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50QmFza2V0cy5maW5kKChiYXNrZXQ6IEludGVybmFsQmFza2V0PEdVX1E+KSA9PiB7XHJcbiAgICAgIHJldHVybiBiYXNrZXQuaWQgPT09IGlkIHx8IGJhc2tldC50ZW1waWQgPT09IGlkO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGZpbmRPckNyZWF0ZUJhc2tldChcclxuICAgIGlkPzogc3RyaW5nLFxyXG4gICAgZ2V0Qm9va2VkQmFza2V0OiBib29sZWFuID0gZmFsc2VcclxuICApOiBQcm9taXNlPEludGVybmFsQmFza2V0PEdVX1E+PiB7XHJcbiAgICBsZXQgYmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPiA9IG51bGw7XHJcbiAgICBpZiAoIWlkKSB7XHJcbiAgICAgIGNvbnN0IGFsbE9wZW5CYXNrZXRzID0gYXdhaXQgdGhpcy5nZXRBbGxPcGVuQmFza2V0cyhcclxuICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlXHJcbiAgICAgICAgICAuZ2V0ZnVsbFVzZXJEZXRhaWxzKHRydWUpXHJcbiAgICAgICAgICAudXNlckRhdGEudmFsdWUudXNlcl9pZC50b1N0cmluZygpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyBmaW5kIHRoZSBsYXN0IHVwZGF0ZWQgYmFza2V0XHJcbiAgICAgIGlmICghYWxsT3BlbkJhc2tldHM/Lmxlbmd0aCkge1xyXG4gICAgICAgIC8vIEVOVC0yNjE2IHJlbW92ZWQgYWRkaW5nIHRvIGN1cnJlbnQgYmFza2V0IGFzIHRoaXMgd2FzIGEgZHVwZVxyXG4gICAgICAgIGJhc2tldCA9IGF3YWl0IHRoaXMuY3JlYXRlQmFza2V0KCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gYmFza2V0cyBhcmUgYWxyZWFkeSBzb3J0ZWQgYnkgbGFzdCB1cGRhdGVkIC0gcmV0dXJuIHRoZSBsYXN0IHVwZGF0ZWQgYmFza2V0XHJcbiAgICAgICAgYmFza2V0ID0gdGhpcy5maW5kQmFza2V0KGFsbE9wZW5CYXNrZXRzWzBdLmlkKTtcclxuXHJcbiAgICAgICAgaWYgKGJhc2tldC5zdWJqZWN0LnZhbHVlLnN0YXR1cyA9PT0gJ0JPT0tFRCcgJiYgIWdldEJvb2tlZEJhc2tldCkge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgICAnKysrIFJldHJpZXZlZCBiYXNrZXQgaXMgaW4gYm9va2VkIHN0YXR1cyAtIGNyZWF0aW5nIGEgbmV3IG9uZSArKysnXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgYmFza2V0ID0gYXdhaXQgdGhpcy5jcmVhdGVCYXNrZXQoKTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudEJhc2tldHMucHVzaChiYXNrZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmJhc2tldHMubmV4dCh0aGlzLmN1cnJlbnRCYXNrZXRzKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYmFza2V0ID0gdGhpcy5maW5kQmFza2V0KGlkKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coJysrKyBGb3VuZCBCYXNrZXQ6ICcsIGJhc2tldCwgJyArKysnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYmFza2V0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZUJhc2tldCgpOiBQcm9taXNlPEludGVybmFsQmFza2V0PEdVX1E+PiB7XHJcbiAgICBjb25zdCBiYXNrZXQ6IFVzZXJCYXNrZXRSZXN1bHQgPSB7XHJcbiAgICAgIGlkOiBURU1QSUQgKyBtb21lbnQoKS51bml4KCkudG9TdHJpbmcoKSxcclxuICAgICAgb3duZXI6IG51bGwsXHJcbiAgICAgIHJlZmVyZW5jZTogbnVsbCxcclxuICAgICAgdGl0bGU6IG51bGwsXHJcbiAgICAgIG5vdGVzOiBudWxsLFxyXG4gICAgICBjcmVhdGVkQXQ6IG51bGwsXHJcbiAgICAgIHVwZGF0ZWRBdDogbnVsbCxcclxuICAgICAgYmFza2V0SXRlbXM6IFtdLFxyXG4gICAgICBzdGF0dXM6IG51bGwsXHJcbiAgICAgIHZhbGlkYXRlZDogZmFsc2VcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaW50QmFza2V0ID0gbmV3IEludGVybmFsQmFza2V0PEdVX1E+KFxyXG4gICAgICBiYXNrZXQsXHJcbiAgICAgIHRoaXMuaGVscGVycyxcclxuICAgICAgdGhpcyxcclxuICAgICAgdGhpcy5nZXRVc2VyRmV0Y2hlclxyXG4gICAgKTtcclxuICAgIC8vIHsgc3ViamVjdDogbmV3IEJlaGF2aW9yU3ViamVjdDxCYXNrZXQ+KGJhc2tldCksIHRlbXBpZDogYmFza2V0LmlkLCBpZDogYmFza2V0LmlkLCB0aXRsZTogYmFza2V0LmlkIH07XHJcblxyXG4gICAgLy8gZW50LTI2MTYgb25seSBwbGFjZSB3ZSBuZWVkIHRvIGFkZCBhIGJhc2tldCB0byBjdXJyZW50IGJhc2tldHNcclxuICAgIGNvbnN0IHRvUmV0dXJuID0gYXdhaXQgdGhpcy5jcmVhdGVCYXNrZXRPbkRCKGludEJhc2tldCk7XHJcbiAgICB0aGlzLmN1cnJlbnRCYXNrZXRzLnB1c2godG9SZXR1cm4pO1xyXG4gICAgdGhpcy5iYXNrZXRzLm5leHQodGhpcy5jdXJyZW50QmFza2V0cyk7XHJcbiAgICB0aGlzLmJhc2tldENoYW5nZUVtaXR0ZXIubmV4dCh0b1JldHVybi5pZCk7XHJcbiAgICByZXR1cm4gdG9SZXR1cm47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUJhc2tldE9uREIoXHJcbiAgICBpbnRCYXNrZXQ6IEludGVybmFsQmFza2V0PEdVX1E+XHJcbiAgKTogUHJvbWlzZTxJbnRlcm5hbEJhc2tldDxHVV9RPj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5iYXNrZXRDcmVhdG9yXHJcbiAgICAgICAgLnVwZGF0ZU9uZSh7fSlcclxuICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAoYmFza2V0OiBVc2VyQmFza2V0UmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIGludEJhc2tldC5pZCA9IGJhc2tldC5pZDtcclxuICAgICAgICAgICAgaW50QmFza2V0Lm5leHQoYmFza2V0KTtcclxuICAgICAgICAgICAgcmVzb2x2ZShpbnRCYXNrZXQpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKCkgPT4ge31cclxuICAgICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVNZW51KCk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLm1lbnVTdGF0ZSA9PT0gTWVudVNsaWRlRW51bS5JTiB8fFxyXG4gICAgICB0aGlzLm1lbnVTdGF0ZSA9PT0gTWVudVNsaWRlRW51bS5GTEFUXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5tZW51U3RhdGUgPSBNZW51U2xpZGVFbnVtLk9VVDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubWVudVN0YXRlID0gTWVudVNsaWRlRW51bS5JTjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlTWVudSgpOiB2b2lkIHtcclxuICAgIHRoaXMubWVudVN0YXRlID0gTWVudVNsaWRlRW51bS5JTjtcclxuICB9XHJcblxyXG4gIGdldExhdGVzdEJhc2tldEl0ZW1Gb3JUeXBlcyhcclxuICAgIGJhc2tldEl0ZW1zOiBCYXNrZXRJdGVtW11cclxuICApOiBSZWNvcmQ8U2VydmljZVR5cGUsIEJhc2tldEl0ZW0+IHtcclxuICAgIHJldHVybiAoYmFza2V0SXRlbXMgfHwgW10pLnJlZHVjZShcclxuICAgICAgKFxyXG4gICAgICAgIGxhdGVzdEl0ZW1zOiBSZWNvcmQ8U2VydmljZVR5cGUsIEJhc2tldEl0ZW0+LFxyXG4gICAgICAgIGJhc2tldEl0ZW06IEJhc2tldEl0ZW1cclxuICAgICAgKSA9PiB7XHJcbiAgICAgICAgbGF0ZXN0SXRlbXNbYmFza2V0SXRlbS5zZXJ2aWNlLnR5cGVdID0gYmFza2V0SXRlbTtcclxuICAgICAgICByZXR1cm4gbGF0ZXN0SXRlbXM7XHJcbiAgICAgIH0sXHJcbiAgICAgIHt9IGFzIFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT5cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrRGV0YWlscyhcclxuICAgIGl0ZW06IEFkZEl0ZW1Ub0Jhc2tldC5WYXJpYWJsZXNcclxuICApOiBBZGRJdGVtVG9CYXNrZXQuVmFyaWFibGVzIHtcclxuICAgIGNvbnN0IHNlcnZpY2VUb0NoZWNrOiBTZXJ2aWNlID0gdGhpcy51c2VyU2VydmljZS5maW5kU2VydmljZShpdGVtLnNlcnZpY2UpO1xyXG4gICAgaWYgKCFzZXJ2aWNlVG9DaGVjaykge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gZmluZCBzZXJ2aWNlIGZvciBiYXNrZXQgaXRlbSA6ICcgKyBpdGVtLnNlcnZpY2UpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVjayB0aGUgaXRlbS5kZXRhaWwgb2JqZWN0IGFnYWluc3QgdGhlIHJlbGV2YW50IHNlcnZpY2UgZGV0YWlsU2NoZW1hIHVzaW5nIEFqdlxyXG4gICAgY29uc3QgYWp2ID0gbmV3IEFqdigpO1xyXG5cclxuICAgIC8vIEN1c3RvbSBKYXZhc2NyaXB0IElTTyBEYXRlIFRpbWUgZm9ybWF0XHJcbiAgICBhanYuYWRkRm9ybWF0KCdqcy1kYXRlLXRpbWUnLCAoZGF0ZVRpbWVTdHJpbmc6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdHlwZW9mIGRhdGVUaW1lU3RyaW5nID09PSAnb2JqZWN0JyAmJlxyXG4gICAgICAgIGRhdGVUaW1lU3RyaW5nLmhhc093blByb3BlcnR5KCd0b0lTT1N0cmluZycpXHJcbiAgICAgICkge1xyXG4gICAgICAgIGRhdGVUaW1lU3RyaW5nID0gZGF0ZVRpbWVTdHJpbmcudG9JU09TdHJpbmcoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuICFpc05hTihEYXRlLnBhcnNlKGRhdGVUaW1lU3RyaW5nKSk7IC8vIGFueSB0ZXN0IHRoYXQgcmV0dXJucyB0cnVlL2ZhbHNlXHJcbiAgICB9KTtcclxuXHJcbiAgICBhanYuYWRkRm9ybWF0KCdyYWlsU2VhdGluZycsIChyaWxzZWF0aW5nOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB2YWxpZGF0ZURldGFpbFNjaGVtYSA9IGFqdi5jb21waWxlKHNlcnZpY2VUb0NoZWNrLmRldGFpbFNjaGVtYSk7XHJcbiAgICBjb25zdCB2YWxpZGF0ZVNlYXJjaFNjaGVtYSA9IGFqdi5jb21waWxlKHNlcnZpY2VUb0NoZWNrLnNlYXJjaFF1ZXJ5U2NoZW1hKTtcclxuXHJcbiAgICAvLyBpZiB0aGVyZSBhcmUgYW55IG1vbWVudCBkYXRlIG9iamVjdHMgaW4gdGhlIHNlYXJjaFF1ZXJ5IG9iamVjdCBjb252ZXJ0IHRoZXNlIHRvIGRhdGUtdGltZSBzdHJpbmdzXHJcbiAgICBpdGVtLnNlYXJjaFF1ZXJ5ID0gdGhpcy5oZWxwZXJzLnNhbml0aXplTW9tZW50RGF0ZXMoaXRlbS5zZWFyY2hRdWVyeSk7XHJcbiAgICBpdGVtLmRldGFpbCA9IHRoaXMuaGVscGVycy5yZW1vdmVOdWxscyhpdGVtLmRldGFpbCk7XHJcblxyXG4gICAgaWYgKCF2YWxpZGF0ZVNlYXJjaFNjaGVtYShpdGVtLnNlYXJjaFF1ZXJ5KSkge1xyXG4gICAgICBjb25zdCBlcnJvciA9IGBJdGVtIHNlYXJjaFF1ZXJ5IGlzIG5vdCB2YWxpZCBmb3IgJHtzZXJ2aWNlVG9DaGVjay5uYW1lfSBzZWFyY2ggc2NoZW1hLmA7XHJcbiAgICAgIGNvbnNvbGUud2Fybignc2VhcmNoU2NoZW1hJywgc2VydmljZVRvQ2hlY2suc2VhcmNoUXVlcnlTY2hlbWEpO1xyXG4gICAgICBjb25zb2xlLndhcm4oJ2l0ZW0uc2VhcmNoUXVlcnknLCBpdGVtLnNlYXJjaFF1ZXJ5KTtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICdTZWFyY2ggUXVlcnkgVmFsaWRhdGlvbiBlcnJvcnMnLFxyXG4gICAgICAgIHZhbGlkYXRlU2VhcmNoU2NoZW1hLmVycm9yc1xyXG4gICAgICApO1xyXG4gICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKE1vZGFsVHlwZXMuTW9kYWxFcnJvckNvbXBvbmVudCwge30sIHsgZXJyb3IgfSk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdmFsaWRhdGVEZXRhaWxTY2hlbWEoaXRlbS5kZXRhaWwpKSB7XHJcbiAgICAgIGNvbnN0IGVycm9yID0gYEl0ZW0gZGV0YWlsIGlzIG5vdCB2YWxpZCBmb3IgJHtzZXJ2aWNlVG9DaGVjay5uYW1lfSBkZXRhaWwgc2NoZW1hLmA7XHJcbiAgICAgIGNvbnNvbGUud2FybignZGV0YWlsU2NoZW1hJywgc2VydmljZVRvQ2hlY2suZGV0YWlsU2NoZW1hKTtcclxuICAgICAgY29uc29sZS53YXJuKCdpdGVtLmRldGFpbCcsIGl0ZW0uZGV0YWlsKTtcclxuICAgICAgY29uc29sZS53YXJuKCdEZXRhaWwgZXJyb3JzJywgdmFsaWRhdGVEZXRhaWxTY2hlbWEuZXJyb3JzKTtcclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihNb2RhbFR5cGVzLk1vZGFsRXJyb3JDb21wb25lbnQsIHt9LCB7IGVycm9yIH0pO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgZ2V0TnVtYmVySXRlbXNGb3JCYXNrZXQoYmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPiA9IG51bGwpOiBudW1iZXIge1xyXG4gICAgYmFza2V0ID0gYmFza2V0IHx8IHRoaXMuZmluZEJhc2tldCh0aGlzLmN1cnJlbnRCYXNrZXRJRCk7XHJcbiAgICByZXR1cm4gYmFza2V0Py5zdWJqZWN0LnZhbHVlLmJhc2tldEl0ZW1zLmxlbmd0aCB8fCAwO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQmFza2V0KGJhc2tldGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHVua25vd24+IHtcclxuICAgIGlmIChiYXNrZXRpZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5kZWxldGVCYXNrZXRVcGRhdGVyLnVwZGF0ZU9uZSh7IGlkOiBiYXNrZXRpZCB9KS5waXBlKFxyXG4gICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgc3dpdGNoTWFwKChkYXRhOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5maW5kQmFza2V0KGJhc2tldGlkKT8uZGVzdHJ1Y3RvcigpO1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50QmFza2V0cyA9IHRoaXMuY3VycmVudEJhc2tldHMuZmlsdGVyKFxyXG4gICAgICAgICAgICAoaW50QmEpID0+IGludEJhLmlkICE9PSBiYXNrZXRpZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuYmFza2V0cy5uZXh0KHRoaXMuY3VycmVudEJhc2tldHMpO1xyXG4gICAgICAgICAgaWYgKGJhc2tldGlkID09PSB0aGlzLmN1cnJlbnRCYXNrZXRJRCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRCYXNrZXRJRCA9IHRoaXMuY3VycmVudEJhc2tldHNbMF0/LmlkIHx8IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci5uZXh0KHRoaXMuY3VycmVudEJhc2tldElEKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihkYXRhKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29udGludWVTZWFyY2hBbmRCb29rKFxyXG4gICAgYmFza2V0SXRlbXM6IGFueVtdLFxyXG4gICAgaXRpbmlhcnlVcmw6IHN0cmluZ1tdLFxyXG4gICAgc2VhcmNoU2VydmljZTogRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2VJbnRlcmZhY2VcclxuICApOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBsYXRlc3RCYXNrZXRJdGVtcyA9IHRoaXMuZ2V0TGF0ZXN0QmFza2V0SXRlbUZvclR5cGVzKGJhc2tldEl0ZW1zKTtcclxuICAgIGNvbnN0IG5leHRTZWFyY2g6IFNlYXJjaE9iamVjdCA9XHJcbiAgICAgIHNlYXJjaFNlcnZpY2UuZ2V0SGlnaGVzdFNlYXJjaFByaW9yaXR5T2JqZWN0KGxhdGVzdEJhc2tldEl0ZW1zKTtcclxuICAgIGlmIChuZXh0U2VhcmNoKSB7XHJcbiAgICAgIChzZWFyY2hTZXJ2aWNlLnNlYXJjaGVzIGFzIGFueSlbXHJcbiAgICAgICAgbmV4dFNlYXJjaC50eXBlXHJcbiAgICAgIF0udXBkYXRlRnJvbVByZXZpb3VzU2VhcmNoZXMobGF0ZXN0QmFza2V0SXRlbXMpO1xyXG4gICAgICByZXR1cm4gW25leHRTZWFyY2guc2VhcmNoVXJsXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBpdGluaWFyeVVybDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZFRyYXZlbGxlcnMoXHJcbiAgICBiYXNrZXRpZDogc3RyaW5nLFxyXG4gICAgYmFza2V0SXRlbTogQmFza2V0SXRlbSxcclxuICAgIHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdLFxyXG4gICAgaW5kZXg6IG51bWJlciA9IDBcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IGJhc2tldCA9IHRoaXMuZmluZEJhc2tldChiYXNrZXRpZCk7XHJcbiAgICBpZiAoaW5kZXggPCB0cmF2ZWxsZXJzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCB0cmF2ZWxsZXIgPSB0cmF2ZWxsZXJzW2luZGV4XTtcclxuICAgICAgY29uc3QgcGFzc2VuZ2VyVHlwZTogUGFzc2VuZ2VyVHlwZSA9IHRyYXZlbGxlci5pc0NoaWxkXHJcbiAgICAgICAgPyBQYXNzZW5nZXJUeXBlLkNoaWxkXHJcbiAgICAgICAgOiB0cmF2ZWxsZXIuaXNJbmZhbnRcclxuICAgICAgICA/IFBhc3NlbmdlclR5cGUuSW5mYW50XHJcbiAgICAgICAgOiBQYXNzZW5nZXJUeXBlLkFkdWx0O1xyXG5cclxuICAgICAgdGhpcy5hZGRVc2VyVG9CYXNrZXRJdGVtXHJcbiAgICAgICAgLnVwZGF0ZU9uZSh7XHJcbiAgICAgICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgICAgICBiYXNrZXRJdGVtOiBiYXNrZXRJdGVtLmlkLFxyXG4gICAgICAgICAgdXNlcnM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGlkOiB0cmF2ZWxsZXIuaWQsXHJcbiAgICAgICAgICAgICAgcGFzc2VuZ2VyVHlwZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgd2l0aFN1cHBsZW1lbnRhbDogZmFsc2VcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAoKSA9PiB7fSxcclxuICAgICAgICAgICgpID0+IHt9LFxyXG4gICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFRyYXZlbGxlcnMoYmFza2V0LmlkLCBiYXNrZXRJdGVtLCB0cmF2ZWxsZXJzLCBpbmRleCArIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmJhc2tldEZldGNoZXIuZmV0Y2hPbmUoeyBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsIGlkOiBiYXNrZXQuaWQgfSkuc3Vic2NyaWJlKFxyXG4gICAgICAgIChiYXNrZXQxOiBHZXRVc2VyQmFza2V0UmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICBiYXNrZXQuc3ViamVjdC5uZXh0KHsgLi4uYmFza2V0LnN1YmplY3QudmFsdWUsIC4uLmJhc2tldDEgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoXykgPT4ge30sXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgYmFza2V0Lm5leHQoYmFza2V0LnN1YmplY3QudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldExlYWRQYXNzZW5nZXIoXHJcbiAgICBiYXNrZXRpZDogc3RyaW5nLFxyXG4gICAgYmFza2V0SXRlbTogQmFza2V0SXRlbSxcclxuICAgIHRyYXZlbGxlcnM6IFRyYXZlbGxlcixcclxuICAgIGluZGV4OiBudW1iZXIgPSAwXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBiYXNrZXQgPSB0aGlzLmZpbmRCYXNrZXQoYmFza2V0aWQpO1xyXG4gICAgaWYgKGluZGV4IDwgMSkge1xyXG4gICAgICB0aGlzLlNldEJhc2tldEl0ZW1MZWFkUGFzc2VuZ2VyLnVwZGF0ZU9uZSh7XHJcbiAgICAgICAgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLFxyXG4gICAgICAgIGlkOiBiYXNrZXRJdGVtLmlkLFxyXG4gICAgICAgIHVzZXI6IHRyYXZlbGxlcnMuaWQsXHJcbiAgICAgICAgd2l0aFN1cHBsZW1lbnRhbDogZmFsc2VcclxuICAgICAgfSkuc3Vic2NyaWJlKFxyXG4gICAgICAgICgpID0+IHt9LFxyXG4gICAgICAgICgpID0+IHt9LFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2V0TGVhZFBhc3NlbmdlcihiYXNrZXQuaWQsIGJhc2tldEl0ZW0sIHRyYXZlbGxlcnMsIGluZGV4ICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5iYXNrZXRGZXRjaGVyLmZldGNoT25lKHsgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLCBpZDogYmFza2V0LmlkIH0pLnN1YnNjcmliZShcclxuICAgICAgICAoYmFza2V0MTogR2V0VXNlckJhc2tldFJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgYmFza2V0LnN1YmplY3QubmV4dCh7IC4uLmJhc2tldC5zdWJqZWN0LnZhbHVlLCAuLi5iYXNrZXQxIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKF8pID0+IHt9LFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgIGJhc2tldC5uZXh0KGJhc2tldC5zdWJqZWN0LnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVCYXNrZXQoXHJcbiAgICBiYXNrZXRpZDogc3RyaW5nLFxyXG4gICAgb2JzOiBPYnNlcnZhYmxlPEJhc2tldERldGFpbHM+XHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBvYnMucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgKGJhc2tldDogQmFza2V0RGV0YWlscykgPT4ge1xyXG4gICAgICAgICAgY29uc3QgaW50QmFza2V0ID0gdGhpcy5maW5kQmFza2V0KGJhc2tldGlkKTtcclxuICAgICAgICAgIGludEJhc2tldC5uZXh0KGJhc2tldCk7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICBjb25zdCBpbnRCYXNrZXQgPSB0aGlzLmZpbmRCYXNrZXQoYmFza2V0aWQpO1xyXG4gICAgICAgICAgaW50QmFza2V0Lm5leHQoaW50QmFza2V0LnN1YmplY3QudmFsdWUpO1xyXG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICgpID0+IHt9XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldmFsaWRhdGUoYmFza2V0aWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVCYXNrZXQoXHJcbiAgICAgIGJhc2tldGlkLFxyXG4gICAgICB0aGlzLnJldmFsaWRhdGVCYXNrZXRVcGRhdGVyLnVwZGF0ZU9uZSh7IGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJywgaWQ6IGJhc2tldGlkIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2V0QmFza2V0SXRlbU1pR3JvdXAoXHJcbiAgICBiYXNrZXRpZDogc3RyaW5nLFxyXG4gICAgYmFza2V0SXRlbWlkOiBzdHJpbmcsXHJcbiAgICBncm91cDogc3RyaW5nXHJcbiAgKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUJhc2tldChcclxuICAgICAgYmFza2V0aWQsXHJcbiAgICAgIHRoaXMuc2V0QmFza2V0SXRlbU1pR3JvdXBVcGRhdGVyLnVwZGF0ZU9uZSh7XHJcbiAgICAgICAgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLFxyXG4gICAgICAgIGJhc2tldEl0ZW06IGJhc2tldEl0ZW1pZCxcclxuICAgICAgICBncm91cFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFjY2VwdE5ld1ByaWNlKGJhc2tldGlkOiBzdHJpbmcsIGl0ZW06IEJhc2tldEl0ZW0pOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQmFza2V0KFxyXG4gICAgICBiYXNrZXRpZCxcclxuICAgICAgdGhpcy5hY2NlcHROZXdQcmljZVVwZGF0ZXIudXBkYXRlT25lKHsgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLCBpZDogaXRlbS5pZCB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlRnJlZVZhbGVNaShcclxuICAgIG1pSXRlbTogTWFuYWdlbWVudEluZm8sXHJcbiAgICBmcmVlVmFsdWU6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy52YWxpZGF0ZU1pRnJlZVZhbHVlXHJcbiAgICAgICAgLnRlc3QoeyBtaTogbWlJdGVtLmlkLCBmcmVlVmFsdWUgfSlcclxuICAgICAgICAuc3Vic2NyaWJlKHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldE1pRnJlZVZhbHVlKFxyXG4gICAgYmFza2V0aWQ6IHN0cmluZyxcclxuICAgIG1pSXRlbTogTWFuYWdlbWVudEluZm8sXHJcbiAgICBmcmVlVmFsdWU6IHN0cmluZyxcclxuICAgIHVzZXJJZDogc3RyaW5nID0gbnVsbFxyXG4gICkge1xyXG4gICAgY29uc3QgaW50QmFza2V0ID0gdGhpcy5maW5kQmFza2V0KGJhc2tldGlkKTtcclxuICAgIGNvbnN0IGFyZ3M6IFNldEJhc2tldEl0ZW1NaVZhbHVlLlZhcmlhYmxlcyA9IHtcclxuICAgICAgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLFxyXG4gICAgICBtaTogbWlJdGVtLmlkLFxyXG4gICAgICBtaUZyZWVWYWx1ZTogZnJlZVZhbHVlXHJcbiAgICB9O1xyXG4gICAgaWYgKCEhdXNlcklkKSB7XHJcbiAgICAgIGFyZ3MudXNlciA9IHVzZXJJZDtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0QmFza2V0SXRlbU1pVmFsdWVVcGRhdGVyXHJcbiAgICAgIC51cGRhdGVPbmUoYXJncylcclxuICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAoYmFza2V0OiBCYXNrZXREZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgICBpbnRCYXNrZXQubmV4dChiYXNrZXQpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKF8pID0+IHt9LFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgIGludEJhc2tldC5uZXh0KGludEJhc2tldC5zdWJqZWN0LnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBzZXRNaVNlbGVjdGVkVmFsdWUoXHJcbiAgICBiYXNrZXRpZDogc3RyaW5nLFxyXG4gICAgbWlJdGVtOiBNYW5hZ2VtZW50SW5mbyxcclxuICAgIHNlbGVjdGVkVmFsdWU6IHN0cmluZyxcclxuICAgIHVzZXJJZDogc3RyaW5nID0gbnVsbFxyXG4gICkge1xyXG4gICAgY29uc3QgYXJnczogU2V0QmFza2V0SXRlbU1pVmFsdWUuVmFyaWFibGVzID0ge1xyXG4gICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgIG1pOiBtaUl0ZW0uaWQsXHJcbiAgICAgIG1pVmFsdWU6IHNlbGVjdGVkVmFsdWVcclxuICAgIH07XHJcbiAgICBpZiAoISF1c2VySWQpIHtcclxuICAgICAgYXJncy51c2VyID0gdXNlcklkO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVCYXNrZXQoXHJcbiAgICAgIGJhc2tldGlkLFxyXG4gICAgICB0aGlzLnNldEJhc2tldEl0ZW1NaVZhbHVlVXBkYXRlci51cGRhdGVPbmUoYXJncylcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRNaUF1dG9TdWdlc3Rpb25zKFxyXG4gICAgbWlJZDogc3RyaW5nLFxyXG4gICAgcGFydGlhbExhYmVsOiBzdHJpbmcsXHJcbiAgICBpc0xvYWRpbmc6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPlxyXG4gICk6IE9ic2VydmFibGU8R2V0TWlBdXRvU3VnZXN0aW9uQXJyYXk+IHtcclxuICAgIGlzTG9hZGluZz8ubmV4dCh0cnVlKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5nZXRNaUF1dG9TdWdlc3Rpb25GZXRjaGVyXHJcbiAgICAgIC5mZXRjaExpc3QoeyBtaTogbWlJZCwgcGFydGlhbExhYmVsIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCgoXykgPT4ge1xyXG4gICAgICAgICAgaXNMb2FkaW5nPy5uZXh0KGZhbHNlKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgc2F2ZU1pRGF0YShiYXNrZXRJZDogc3RyaW5nLCBibWlBcnJheTogQmFza2V0SXRlbU1hbmFnZW1lbnRJbmZvW10pIHtcclxuICAgIGJtaUFycmF5LmZvckVhY2goKGJtaTogQmFza2V0SXRlbU1hbmFnZW1lbnRJbmZvKSA9PiB7XHJcbiAgICAgIGJtaS5taVBlckl0ZW0uZm9yRWFjaCgoaXRlbTogTWFuYWdlbWVudEluZm9BbmRJc1ZhbGlkKSA9PiB7XHJcbiAgICAgICAgaXRlbS5zYXZlKGJhc2tldElkLCBudWxsKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGJtaS51c2Vycy5mb3JFYWNoKCh1c2VyOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBibWkubWlQZXJVc2VyW3VzZXJdLm1hbmFnZW1lbnRJbmZvLmZvckVhY2goXHJcbiAgICAgICAgICAoaXRlbTogTWFuYWdlbWVudEluZm9BbmRJc1ZhbGlkKSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0uc2F2ZShiYXNrZXRJZCwgdXNlcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbmRCYXNrZXRGb3JBcHByb3ZhbChiYXNrZXRpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy51cGRhdGVCYXNrZXQoXHJcbiAgICAgIGJhc2tldGlkLFxyXG4gICAgICB0aGlzLnNlbmRCYXNrZXRGb3JBcHByb3ZhbFVwZGF0ZXJcclxuICAgICAgICAudXBkYXRlT25lKHsgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLCBiYXNrZXQ6IGJhc2tldGlkIH0pXHJcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzZXRCYXNrZXRJdGVtUGF5bWVudE9wdGlvbihcclxuICAgIGJhc2tldDogQmFza2V0RGV0YWlscyxcclxuICAgIGJhc2tldEl0ZW06IEJhc2tldEl0ZW0sXHJcbiAgICBwYXltZW50TWV0aG9kOiBzdHJpbmdcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJhc2tldChcclxuICAgICAgYmFza2V0LmlkLFxyXG4gICAgICB0aGlzLnNldFBheW1lbnRNZXRob2RVcGRhdGVyLnVwZGF0ZU9uZSh7XHJcbiAgICAgICAgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLFxyXG4gICAgICAgIGJhc2tldEl0ZW06IGJhc2tldEl0ZW0uaWQsXHJcbiAgICAgICAgcGF5bWVudE1ldGhvZFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGJvb2tCYXNrZXQoXHJcbiAgICBiYXNrZXRpZDogc3RyaW5nLFxyXG4gICAgc3VwcGxlbWVudGFyeUluZm86IFN1cHBsZW1lbnRhcnlCb29raW5nSW5mb1tdXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy51cGRhdGVCYXNrZXQoXHJcbiAgICAgIGJhc2tldGlkLFxyXG4gICAgICB0aGlzLmJvb2tCYXNrZXRVcGRhdGVyLnVwZGF0ZU9uZSh7IGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJywgaWQ6IGJhc2tldGlkLCBzdXBwbGVtZW50YXJ5SW5mbyB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG1vdmVCYXNrZXRJdGVtKFxyXG4gICAgb3JpZ2luYWxCYXNrZXRJZDogc3RyaW5nLFxyXG4gICAgYmFza2V0SXRlbTogQmFza2V0SXRlbSxcclxuICAgIGJhc2tldElkVG9Nb3ZlVG86IHN0cmluZ1xyXG4gICk6IHZvaWQge1xyXG4gICAgdGhpcy5tb3ZlSXRlbVRvQURpZmZlcmVudEJhc2tldFxyXG4gICAgICAudXBkYXRlT25lKHtcclxuICAgICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgICAgYmFza2V0SXRlbTogYmFza2V0SXRlbS5pZCxcclxuICAgICAgICBuZXdCYXNrZXQ6IGJhc2tldElkVG9Nb3ZlVG9cclxuICAgICAgfSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkQmFza2V0KG9yaWdpbmFsQmFza2V0SWQpO1xyXG4gICAgICAgIHRoaXMubG9hZEJhc2tldChiYXNrZXRJZFRvTW92ZVRvKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVCYXNrZXROb3RlcyhiYXNrZXRJZDogc3RyaW5nLCBub3Rlczogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUJhc2tldChcclxuICAgICAgYmFza2V0SWQsXHJcbiAgICAgIHRoaXMudXBkYXRlQmFza2V0Tm90ZXNVcGRhdGVyLnVwZGF0ZU9uZSh7IGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJywgaWQ6IGJhc2tldElkLCBub3RlcyB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldFRpdGxlKGJhc2tldElkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQmFza2V0KFxyXG4gICAgICBiYXNrZXRJZCxcclxuICAgICAgdGhpcy51cGRhdGVCYXNrZXRUaXRsZVVwZGF0ZXIudXBkYXRlT25lKHsgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLCBpZDogYmFza2V0SWQsIG5ld1RpdGxlOiB0aXRsZSB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgZ2V0QmFza2V0KHF1ZXJ5OiB7XHJcbiAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCc7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgd2l0aFN1cHBsZW1lbnRhbDogdHJ1ZTtcclxuICB9KTogT2JzZXJ2YWJsZTxHZXRVc2VyQmFza2V0UmVzdWx0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5iYXNrZXRGZXRjaGVyLmZldGNoT25lKHF1ZXJ5KTtcclxuICB9XHJcblxyXG4gIGF0TGVhc3RPbmVTZWFyY2hDaG9zZW4oKTogYm9vbGVhbiB7XHJcbiAgICAvLyBpZiB3ZSBoYXZlIGFueSBpdGVtIG9uIGFueSBiYXNrZXQgd2Ugc2hvdyBiYXNrZXRzIGluIHNlYXJjaCBzY3JlZW5cclxuICAgIHJldHVybiAhIXRoaXMuY3VycmVudEJhc2tldHMuZmlsdGVyKFxyXG4gICAgICAoYmFza2V0KSA9PiBiYXNrZXQuc3ViamVjdC52YWx1ZS5iYXNrZXRJdGVtcy5sZW5ndGhcclxuICAgICkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEJhc2tldFN0YXRzKGluZGV4OiBudW1iZXIpOiBCZWhhdmlvclN1YmplY3Q8QmFza2V0UHJpY2VzPiB7XHJcbiAgICBjb25zdCBiYXNrZXRQcmljZXNPYmogPVxyXG4gICAgICB0aGlzLmJhc2tldHMudmFsdWVbaW5kZXhdPy5zdWJqZWN0Py52YWx1ZT8ucHJpY2VzIHx8IHt9O1xyXG4gICAgY29uc3QgYmFza2V0UHJpY2VzS2V5ID0gT2JqZWN0LmtleXMoYmFza2V0UHJpY2VzT2JqKVswXTtcclxuICAgIGlmIChiYXNrZXRQcmljZXNLZXkpIHtcclxuICAgICAgdGhpcy5iYXNrZXRQcmljZXMudmFsdWUuY3VycmVuY3kgPSBiYXNrZXRQcmljZXNLZXk7XHJcbiAgICAgIHRoaXMuYmFza2V0UHJpY2VzLnZhbHVlLnRvdGFsID1cclxuICAgICAgICB0aGlzLmJhc2tldHMudmFsdWVbaW5kZXhdLnN1YmplY3QudmFsdWUucHJpY2VzW2Jhc2tldFByaWNlc0tleV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmJhc2tldFByaWNlcy52YWx1ZS50b3RhbCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5iYXNrZXRQcmljZXMudmFsdWUubGlzdC5mb3JFYWNoKChrZXlzKSA9PiB7XHJcbiAgICAgIGtleXMucHJpY2UgPSB0aGlzLmJhc2tldHMudmFsdWVbaW5kZXhdPy5zdWJqZWN0Py52YWx1ZT8uYmFza2V0SXRlbXNcclxuICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnNlcnZpY2UudHlwZSA9PT0ga2V5cy50eXBlKVxyXG4gICAgICAgIC5yZWR1Y2UoKHN1bSwgY3VycmVudCkgPT4gc3VtICsgY3VycmVudC5wcmljZSwgMCk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aGlzLmJhc2tldFByaWNlcztcclxuICB9XHJcbn1cclxuXHJcbmludGVyZmFjZSBEZXRhaWxTY2hlbWFQcm9wZXJ0aWVzIHtcclxuICB0eXBlPzogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdpbnRlZ2VyJyB8ICdhcnJheSc7XHJcbiAgJHJlZj86IHN0cmluZztcclxuICBmb3JtYXQ/OiBzdHJpbmc7XHJcbn1cclxuaW50ZXJmYWNlIERldGFpbFNjaGVtYSB7XHJcbiAgJGRlZnM/OiB7IFtrZXk6IHN0cmluZ106IERldGFpbFNjaGVtYSB9O1xyXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBib29sZWFuO1xyXG4gIHByb3BlcnRpZXM6IHsgW2tleTogc3RyaW5nXTogRGV0YWlsU2NoZW1hUHJvcGVydGllcyB9O1xyXG4gIHJlcXVpcmVkOiBzdHJpbmdbXTtcclxufVxyXG4iXX0=