breeze-client 2.1.6 → 2.1.7-mjs

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 (378) hide show
  1. package/LICENSE +1 -1
  2. package/adapter-ajax-angularjs/{breeze-client-adapter-ajax-angularjs.d.ts → index.d.ts} +1 -0
  3. package/adapter-ajax-fetch/{breeze-client-adapter-ajax-fetch.d.ts → index.d.ts} +1 -0
  4. package/adapter-ajax-httpclient/{breeze-client-adapter-ajax-httpclient.d.ts → index.d.ts} +1 -0
  5. package/adapter-ajax-jquery/{breeze-client-adapter-ajax-jquery.d.ts → index.d.ts} +1 -0
  6. package/adapter-ajax-post/{breeze-client-adapter-ajax-post.d.ts → index.d.ts} +1 -0
  7. package/adapter-data-service-odata/{breeze-client-adapter-data-service-odata.d.ts → index.d.ts} +1 -0
  8. package/adapter-data-service-webapi/{breeze-client-adapter-data-service-webapi.d.ts → index.d.ts} +1 -0
  9. package/adapter-model-library-backing-store/{breeze-client-adapter-model-library-backing-store.d.ts → index.d.ts} +1 -0
  10. package/adapter-model-library-ko/{breeze-client-adapter-model-library-ko.d.ts → index.d.ts} +1 -0
  11. package/adapter-uri-builder-json/{breeze-client-adapter-uri-builder-json.d.ts → index.d.ts} +1 -0
  12. package/adapter-uri-builder-odata/{breeze-client-adapter-uri-builder-odata.d.ts → index.d.ts} +1 -0
  13. package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +135 -0
  14. package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +49 -0
  15. package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +5 -0
  16. package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +135 -0
  17. package/esm2022/adapter-ajax-fetch/adapter-core.mjs +49 -0
  18. package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +5 -0
  19. package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +139 -0
  20. package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +49 -0
  21. package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +5 -0
  22. package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +107 -0
  23. package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +5 -0
  24. package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +77 -0
  25. package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +5 -0
  26. package/esm2022/adapter-data-service-odata/adapter-core.mjs +49 -0
  27. package/{esm5/adapter-data-service-odata/adapter-data-service-odata.js → esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs} +138 -147
  28. package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +5 -0
  29. package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +100 -0
  30. package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +5 -0
  31. package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +269 -0
  32. package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +5 -0
  33. package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +241 -0
  34. package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +5 -0
  35. package/esm2022/adapter-uri-builder-json/adapter-core.mjs +49 -0
  36. package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +37 -0
  37. package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +5 -0
  38. package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +49 -0
  39. package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +191 -0
  40. package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +5 -0
  41. package/esm2022/breeze-client.mjs +5 -0
  42. package/esm2022/index.mjs +2 -0
  43. package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +5 -0
  44. package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +269 -0
  45. package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +5 -0
  46. package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +421 -0
  47. package/esm2022/src/abstract-data-service-adapter.mjs +325 -0
  48. package/esm2022/src/array.mjs +4 -0
  49. package/esm2022/src/assert-param.mjs +330 -0
  50. package/esm2022/src/breeze.mjs +85 -0
  51. package/esm2022/src/complex-array.mjs +117 -0
  52. package/esm2022/src/config.mjs +232 -0
  53. package/esm2022/src/core.mjs +712 -0
  54. package/esm2022/src/csdl-metadata-parser.mjs +385 -0
  55. package/esm2022/src/data-service.mjs +239 -0
  56. package/esm2022/src/data-type.mjs +507 -0
  57. package/esm2022/src/default-property-interceptor.mjs +460 -0
  58. package/{esm2015/src/entity-action.js → esm2022/src/entity-action.mjs} +25 -25
  59. package/esm2022/src/entity-aspect.mjs +897 -0
  60. package/esm2022/src/entity-group.mjs +192 -0
  61. package/esm2022/src/entity-key.mjs +127 -0
  62. package/esm2022/src/entity-manager.mjs +2183 -0
  63. package/esm2022/src/entity-metadata.mjs +2242 -0
  64. package/esm2022/src/entity-query.mjs +1024 -0
  65. package/esm2022/src/entity-state.mjs +107 -0
  66. package/esm2022/src/enum.mjs +143 -0
  67. package/esm2022/src/event.mjs +264 -0
  68. package/esm2022/src/interface-registry.mjs +39 -0
  69. package/esm2022/src/key-generator.mjs +110 -0
  70. package/esm2022/src/local-query-comparison-options.mjs +75 -0
  71. package/esm2022/src/mapping-context.mjs +422 -0
  72. package/{esm5/src/naming-convention.js → esm2022/src/naming-convention.mjs} +35 -29
  73. package/esm2022/src/observable-array.mjs +183 -0
  74. package/esm2022/src/predicate.mjs +1259 -0
  75. package/esm2022/src/primitive-array.mjs +85 -0
  76. package/esm2022/src/query-options.mjs +160 -0
  77. package/esm2022/src/relation-array.mjs +173 -0
  78. package/esm2022/src/save-options.mjs +51 -0
  79. package/esm2022/src/unattached-children-map.mjs +56 -0
  80. package/{esm5/src/validate.js → esm2022/src/validate.mjs} +116 -110
  81. package/esm2022/src/validation-options.mjs +78 -0
  82. package/{fesm2015/breeze-client-adapter-ajax-angularjs.js → fesm2022/breeze-client-adapter-ajax-angularjs.mjs} +6 -1
  83. package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +1 -0
  84. package/{fesm2015/breeze-client-adapter-ajax-fetch.js → fesm2022/breeze-client-adapter-ajax-fetch.mjs} +9 -4
  85. package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +1 -0
  86. package/{fesm2015/breeze-client-adapter-ajax-httpclient.js → fesm2022/breeze-client-adapter-ajax-httpclient.mjs} +6 -4
  87. package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +1 -0
  88. package/{fesm2015/breeze-client-adapter-ajax-jquery.js → fesm2022/breeze-client-adapter-ajax-jquery.mjs} +6 -2
  89. package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +1 -0
  90. package/{fesm2015/breeze-client-adapter-ajax-post.js → fesm2022/breeze-client-adapter-ajax-post.mjs} +1 -1
  91. package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +1 -0
  92. package/{fesm2015/breeze-client-adapter-data-service-odata.js → fesm2022/breeze-client-adapter-data-service-odata.mjs} +68 -69
  93. package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +1 -0
  94. package/{fesm2015/breeze-client-adapter-data-service-webapi.js → fesm2022/breeze-client-adapter-data-service-webapi.mjs} +30 -30
  95. package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +1 -0
  96. package/{fesm2015/breeze-client-adapter-model-library-backing-store.js → fesm2022/breeze-client-adapter-model-library-backing-store.mjs} +14 -13
  97. package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +1 -0
  98. package/{fesm2015/breeze-client-adapter-model-library-ko.js → fesm2022/breeze-client-adapter-model-library-ko.mjs} +14 -13
  99. package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +1 -0
  100. package/{fesm2015/breeze-client-adapter-uri-builder-json.js → fesm2022/breeze-client-adapter-uri-builder-json.mjs} +9 -8
  101. package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +1 -0
  102. package/{fesm2015/breeze-client-adapter-uri-builder-odata.js → fesm2022/breeze-client-adapter-uri-builder-odata.mjs} +86 -86
  103. package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +1 -0
  104. package/{fesm2015/breeze-client-mixin-get-entity-graph.js → fesm2022/breeze-client-mixin-get-entity-graph.mjs} +1 -1
  105. package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +1 -0
  106. package/{fesm2015/breeze-client-mixin-save-queuing.js → fesm2022/breeze-client-mixin-save-queuing.mjs} +23 -2
  107. package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +1 -0
  108. package/{fesm2015/breeze-client.js → fesm2022/breeze-client.mjs} +2126 -1577
  109. package/fesm2022/breeze-client.mjs.map +1 -0
  110. package/mixin-get-entity-graph/{breeze-client-mixin-get-entity-graph.d.ts → index.d.ts} +1 -0
  111. package/mixin-save-queuing/{breeze-client-mixin-save-queuing.d.ts → index.d.ts} +1 -0
  112. package/package.json +93 -11
  113. package/src/abstract-data-service-adapter.d.ts +20 -0
  114. package/src/config.d.ts +1 -1
  115. package/src/core.d.ts +1 -1
  116. package/src/entity-aspect.d.ts +1 -1
  117. package/src/entity-metadata.d.ts +8 -6
  118. package/src/entity-query.d.ts +18 -4
  119. package/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.metadata.json +0 -1
  120. package/adapter-ajax-angularjs/package.json +0 -13
  121. package/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.metadata.json +0 -1
  122. package/adapter-ajax-fetch/package.json +0 -13
  123. package/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.metadata.json +0 -1
  124. package/adapter-ajax-httpclient/package.json +0 -13
  125. package/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.metadata.json +0 -1
  126. package/adapter-ajax-jquery/package.json +0 -13
  127. package/adapter-ajax-post/breeze-client-adapter-ajax-post.metadata.json +0 -1
  128. package/adapter-ajax-post/package.json +0 -13
  129. package/adapter-data-service-odata/breeze-client-adapter-data-service-odata.metadata.json +0 -1
  130. package/adapter-data-service-odata/package.json +0 -13
  131. package/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.metadata.json +0 -1
  132. package/adapter-data-service-webapi/package.json +0 -13
  133. package/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.metadata.json +0 -1
  134. package/adapter-model-library-backing-store/package.json +0 -13
  135. package/adapter-model-library-ko/breeze-client-adapter-model-library-ko.metadata.json +0 -1
  136. package/adapter-model-library-ko/package.json +0 -13
  137. package/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.metadata.json +0 -1
  138. package/adapter-uri-builder-json/package.json +0 -13
  139. package/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.metadata.json +0 -1
  140. package/adapter-uri-builder-odata/package.json +0 -13
  141. package/breeze-client.d.ts +0 -8
  142. package/breeze-client.metadata.json +0 -1
  143. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js +0 -190
  144. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js.map +0 -1
  145. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js +0 -2
  146. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js.map +0 -1
  147. package/bundles/breeze-client-adapter-ajax-fetch.umd.js +0 -190
  148. package/bundles/breeze-client-adapter-ajax-fetch.umd.js.map +0 -1
  149. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js +0 -2
  150. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js.map +0 -1
  151. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js +0 -195
  152. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js.map +0 -1
  153. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js +0 -2
  154. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js.map +0 -1
  155. package/bundles/breeze-client-adapter-ajax-jquery.umd.js +0 -115
  156. package/bundles/breeze-client-adapter-ajax-jquery.umd.js.map +0 -1
  157. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js +0 -2
  158. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js.map +0 -1
  159. package/bundles/breeze-client-adapter-ajax-post.umd.js +0 -92
  160. package/bundles/breeze-client-adapter-ajax-post.umd.js.map +0 -1
  161. package/bundles/breeze-client-adapter-ajax-post.umd.min.js +0 -2
  162. package/bundles/breeze-client-adapter-ajax-post.umd.min.js.map +0 -1
  163. package/bundles/breeze-client-adapter-data-service-odata.umd.js +0 -747
  164. package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +0 -1
  165. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +0 -16
  166. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +0 -1
  167. package/bundles/breeze-client-adapter-data-service-webapi.umd.js +0 -333
  168. package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +0 -1
  169. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +0 -16
  170. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +0 -1
  171. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js +0 -280
  172. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js.map +0 -1
  173. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js +0 -2
  174. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js.map +0 -1
  175. package/bundles/breeze-client-adapter-model-library-ko.umd.js +0 -252
  176. package/bundles/breeze-client-adapter-model-library-ko.umd.js.map +0 -1
  177. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js +0 -2
  178. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js.map +0 -1
  179. package/bundles/breeze-client-adapter-uri-builder-json.umd.js +0 -96
  180. package/bundles/breeze-client-adapter-uri-builder-json.umd.js.map +0 -1
  181. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js +0 -2
  182. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js.map +0 -1
  183. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js +0 -262
  184. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js.map +0 -1
  185. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js +0 -2
  186. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js.map +0 -1
  187. package/bundles/breeze-client-mixin-get-entity-graph.umd.js +0 -258
  188. package/bundles/breeze-client-mixin-get-entity-graph.umd.js.map +0 -1
  189. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js +0 -2
  190. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js.map +0 -1
  191. package/bundles/breeze-client-mixin-save-queuing.umd.js +0 -579
  192. package/bundles/breeze-client-mixin-save-queuing.umd.js.map +0 -1
  193. package/bundles/breeze-client-mixin-save-queuing.umd.min.js +0 -16
  194. package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +0 -1
  195. package/bundles/breeze-client.umd.js +0 -14181
  196. package/bundles/breeze-client.umd.js.map +0 -1
  197. package/bundles/breeze-client.umd.min.js +0 -16
  198. package/bundles/breeze-client.umd.min.js.map +0 -1
  199. package/esm2015/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -130
  200. package/esm2015/adapter-ajax-angularjs/adapter-core.js +0 -49
  201. package/esm2015/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
  202. package/esm2015/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -130
  203. package/esm2015/adapter-ajax-fetch/adapter-core.js +0 -49
  204. package/esm2015/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
  205. package/esm2015/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -137
  206. package/esm2015/adapter-ajax-httpclient/adapter-core.js +0 -49
  207. package/esm2015/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
  208. package/esm2015/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -103
  209. package/esm2015/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
  210. package/esm2015/adapter-ajax-post/adapter-ajax-post.js +0 -77
  211. package/esm2015/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
  212. package/esm2015/adapter-data-service-odata/adapter-core.js +0 -49
  213. package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +0 -463
  214. package/esm2015/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
  215. package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -100
  216. package/esm2015/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
  217. package/esm2015/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -268
  218. package/esm2015/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
  219. package/esm2015/adapter-model-library-ko/adapter-model-library-ko.js +0 -240
  220. package/esm2015/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
  221. package/esm2015/adapter-uri-builder-json/adapter-core.js +0 -49
  222. package/esm2015/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -36
  223. package/esm2015/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
  224. package/esm2015/adapter-uri-builder-odata/adapter-core.js +0 -49
  225. package/esm2015/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -192
  226. package/esm2015/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
  227. package/esm2015/breeze-client.js +0 -9
  228. package/esm2015/index.js +0 -2
  229. package/esm2015/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
  230. package/esm2015/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
  231. package/esm2015/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
  232. package/esm2015/mixin-save-queuing/mixin-save-queuing.js +0 -400
  233. package/esm2015/src/abstract-data-service-adapter.js +0 -296
  234. package/esm2015/src/array.js +0 -4
  235. package/esm2015/src/assert-param.js +0 -312
  236. package/esm2015/src/breeze.js +0 -85
  237. package/esm2015/src/complex-array.js +0 -119
  238. package/esm2015/src/config.js +0 -223
  239. package/esm2015/src/core.js +0 -714
  240. package/esm2015/src/csdl-metadata-parser.js +0 -385
  241. package/esm2015/src/data-service.js +0 -203
  242. package/esm2015/src/data-type.js +0 -503
  243. package/esm2015/src/default-property-interceptor.js +0 -460
  244. package/esm2015/src/entity-aspect.js +0 -804
  245. package/esm2015/src/entity-group.js +0 -187
  246. package/esm2015/src/entity-key.js +0 -116
  247. package/esm2015/src/entity-manager.js +0 -2094
  248. package/esm2015/src/entity-metadata.js +0 -2109
  249. package/esm2015/src/entity-query.js +0 -996
  250. package/esm2015/src/entity-state.js +0 -107
  251. package/esm2015/src/enum.js +0 -141
  252. package/esm2015/src/event.js +0 -256
  253. package/esm2015/src/interface-registry.js +0 -41
  254. package/esm2015/src/key-generator.js +0 -108
  255. package/esm2015/src/local-query-comparison-options.js +0 -65
  256. package/esm2015/src/mapping-context.js +0 -411
  257. package/esm2015/src/naming-convention.js +0 -88
  258. package/esm2015/src/observable-array.js +0 -185
  259. package/esm2015/src/predicate.js +0 -1242
  260. package/esm2015/src/primitive-array.js +0 -87
  261. package/esm2015/src/query-options.js +0 -152
  262. package/esm2015/src/relation-array.js +0 -175
  263. package/esm2015/src/save-options.js +0 -41
  264. package/esm2015/src/unattached-children-map.js +0 -58
  265. package/esm2015/src/validate.js +0 -991
  266. package/esm2015/src/validation-options.js +0 -64
  267. package/esm5/adapter-ajax-angularjs/adapter-ajax-angularjs.js +0 -132
  268. package/esm5/adapter-ajax-angularjs/adapter-core.js +0 -49
  269. package/esm5/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +0 -5
  270. package/esm5/adapter-ajax-fetch/adapter-ajax-fetch.js +0 -132
  271. package/esm5/adapter-ajax-fetch/adapter-core.js +0 -49
  272. package/esm5/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +0 -5
  273. package/esm5/adapter-ajax-httpclient/adapter-ajax-httpclient.js +0 -139
  274. package/esm5/adapter-ajax-httpclient/adapter-core.js +0 -49
  275. package/esm5/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +0 -5
  276. package/esm5/adapter-ajax-jquery/adapter-ajax-jquery.js +0 -105
  277. package/esm5/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +0 -5
  278. package/esm5/adapter-ajax-post/adapter-ajax-post.js +0 -81
  279. package/esm5/adapter-ajax-post/breeze-client-adapter-ajax-post.js +0 -5
  280. package/esm5/adapter-data-service-odata/adapter-core.js +0 -49
  281. package/esm5/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +0 -5
  282. package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +0 -105
  283. package/esm5/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +0 -5
  284. package/esm5/adapter-model-library-backing-store/adapter-model-library-backing-store.js +0 -270
  285. package/esm5/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +0 -5
  286. package/esm5/adapter-model-library-ko/adapter-model-library-ko.js +0 -242
  287. package/esm5/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +0 -5
  288. package/esm5/adapter-uri-builder-json/adapter-core.js +0 -49
  289. package/esm5/adapter-uri-builder-json/adapter-uri-builder-json.js +0 -38
  290. package/esm5/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +0 -5
  291. package/esm5/adapter-uri-builder-odata/adapter-core.js +0 -49
  292. package/esm5/adapter-uri-builder-odata/adapter-uri-builder-odata.js +0 -197
  293. package/esm5/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +0 -5
  294. package/esm5/breeze-client.js +0 -9
  295. package/esm5/index.js +0 -2
  296. package/esm5/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +0 -5
  297. package/esm5/mixin-get-entity-graph/mixin-get-entity-graph.js +0 -269
  298. package/esm5/mixin-save-queuing/breeze-client-mixin-save-queuing.js +0 -5
  299. package/esm5/mixin-save-queuing/mixin-save-queuing.js +0 -412
  300. package/esm5/src/abstract-data-service-adapter.js +0 -302
  301. package/esm5/src/array.js +0 -4
  302. package/esm5/src/assert-param.js +0 -317
  303. package/esm5/src/breeze.js +0 -85
  304. package/esm5/src/complex-array.js +0 -119
  305. package/esm5/src/config.js +0 -228
  306. package/esm5/src/core.js +0 -722
  307. package/esm5/src/csdl-metadata-parser.js +0 -385
  308. package/esm5/src/data-service.js +0 -207
  309. package/esm5/src/data-type.js +0 -510
  310. package/esm5/src/default-property-interceptor.js +0 -460
  311. package/esm5/src/entity-action.js +0 -52
  312. package/esm5/src/entity-aspect.js +0 -810
  313. package/esm5/src/entity-group.js +0 -189
  314. package/esm5/src/entity-key.js +0 -118
  315. package/esm5/src/entity-manager.js +0 -2112
  316. package/esm5/src/entity-metadata.js +0 -2144
  317. package/esm5/src/entity-query.js +0 -1023
  318. package/esm5/src/entity-state.js +0 -114
  319. package/esm5/src/enum.js +0 -144
  320. package/esm5/src/event.js +0 -259
  321. package/esm5/src/interface-registry.js +0 -43
  322. package/esm5/src/key-generator.js +0 -111
  323. package/esm5/src/local-query-comparison-options.js +0 -67
  324. package/esm5/src/mapping-context.js +0 -413
  325. package/esm5/src/observable-array.js +0 -201
  326. package/esm5/src/predicate.js +0 -1307
  327. package/esm5/src/primitive-array.js +0 -87
  328. package/esm5/src/query-options.js +0 -167
  329. package/esm5/src/relation-array.js +0 -175
  330. package/esm5/src/save-options.js +0 -43
  331. package/esm5/src/unattached-children-map.js +0 -60
  332. package/esm5/src/validation-options.js +0 -66
  333. package/fesm2015/breeze-client-adapter-ajax-angularjs.js.map +0 -1
  334. package/fesm2015/breeze-client-adapter-ajax-fetch.js.map +0 -1
  335. package/fesm2015/breeze-client-adapter-ajax-httpclient.js.map +0 -1
  336. package/fesm2015/breeze-client-adapter-ajax-jquery.js.map +0 -1
  337. package/fesm2015/breeze-client-adapter-ajax-post.js.map +0 -1
  338. package/fesm2015/breeze-client-adapter-data-service-odata.js.map +0 -1
  339. package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +0 -1
  340. package/fesm2015/breeze-client-adapter-model-library-backing-store.js.map +0 -1
  341. package/fesm2015/breeze-client-adapter-model-library-ko.js.map +0 -1
  342. package/fesm2015/breeze-client-adapter-uri-builder-json.js.map +0 -1
  343. package/fesm2015/breeze-client-adapter-uri-builder-odata.js.map +0 -1
  344. package/fesm2015/breeze-client-mixin-get-entity-graph.js.map +0 -1
  345. package/fesm2015/breeze-client-mixin-save-queuing.js.map +0 -1
  346. package/fesm2015/breeze-client.js.map +0 -1
  347. package/fesm5/breeze-client-adapter-ajax-angularjs.js +0 -186
  348. package/fesm5/breeze-client-adapter-ajax-angularjs.js.map +0 -1
  349. package/fesm5/breeze-client-adapter-ajax-fetch.js +0 -186
  350. package/fesm5/breeze-client-adapter-ajax-fetch.js.map +0 -1
  351. package/fesm5/breeze-client-adapter-ajax-httpclient.js +0 -193
  352. package/fesm5/breeze-client-adapter-ajax-httpclient.js.map +0 -1
  353. package/fesm5/breeze-client-adapter-ajax-jquery.js +0 -111
  354. package/fesm5/breeze-client-adapter-ajax-jquery.js.map +0 -1
  355. package/fesm5/breeze-client-adapter-ajax-post.js +0 -86
  356. package/fesm5/breeze-client-adapter-ajax-post.js.map +0 -1
  357. package/fesm5/breeze-client-adapter-data-service-odata.js +0 -523
  358. package/fesm5/breeze-client-adapter-data-service-odata.js.map +0 -1
  359. package/fesm5/breeze-client-adapter-data-service-webapi.js +0 -111
  360. package/fesm5/breeze-client-adapter-data-service-webapi.js.map +0 -1
  361. package/fesm5/breeze-client-adapter-model-library-backing-store.js +0 -276
  362. package/fesm5/breeze-client-adapter-model-library-backing-store.js.map +0 -1
  363. package/fesm5/breeze-client-adapter-model-library-ko.js +0 -248
  364. package/fesm5/breeze-client-adapter-model-library-ko.js.map +0 -1
  365. package/fesm5/breeze-client-adapter-uri-builder-json.js +0 -92
  366. package/fesm5/breeze-client-adapter-uri-builder-json.js.map +0 -1
  367. package/fesm5/breeze-client-adapter-uri-builder-odata.js +0 -250
  368. package/fesm5/breeze-client-adapter-uri-builder-odata.js.map +0 -1
  369. package/fesm5/breeze-client-mixin-get-entity-graph.js +0 -254
  370. package/fesm5/breeze-client-mixin-get-entity-graph.js.map +0 -1
  371. package/fesm5/breeze-client-mixin-save-queuing.js +0 -356
  372. package/fesm5/breeze-client-mixin-save-queuing.js.map +0 -1
  373. package/fesm5/breeze-client.js +0 -13903
  374. package/fesm5/breeze-client.js.map +0 -1
  375. package/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.metadata.json +0 -1
  376. package/mixin-get-entity-graph/package.json +0 -13
  377. package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +0 -1
  378. package/mixin-save-queuing/package.json +0 -13
@@ -0,0 +1,421 @@
1
+ //#region Copyright, Version, and Description
2
+ /*
3
+ * Copyright 2015-2021 IdeaBlade, Inc. All Rights Reserved.
4
+ * Use, reproduction, distribution, and modification of this code is subject to the terms and
5
+ * conditions of the IdeaBlade Breeze license, available at http://www.breezejs.com/license
6
+ *
7
+ * Author: Ward Bell
8
+ * Version: 2.0.6 Steve Schmitt - convert to TypeScript, move to breeze-client repo, change enableSaveQueuing function
9
+ * Version: 2.0.5 Ward Bell
10
+ * --------------------------------------------------------------------------------
11
+ * Adds "Save Queuing" capability to new EntityManagers
12
+ *
13
+ * Save Queuing automatically queues and defers an EntityManager.saveChanges call
14
+ * when another save is in progress for that manager and the server has not yet responded.
15
+ * This feature is helpful when your app needs to allow rapid, continuous changes
16
+ * to entities that may be in the process of being saved.
17
+ *
18
+ * Without "Save Queuing", an EntityManager will throw an exception
19
+ * when you call saveChanges for an entity which is currently being saved.
20
+ *
21
+ * !!! Use with caution !!!
22
+ * It is usually better to disable user input while a save is in progress.
23
+ * Save Queuing may be appropriate for simple "auto-save" scenarios
24
+ * when the save latency is "short" (under a few seconds).
25
+ *
26
+ * Save Queuing is NOT intended for occassionally disconnected or offline scenarios.
27
+ *
28
+ * Save Queuing is experimental. It will not become a part of BreezeJS core
29
+ * but might become an official Breeze plugin in future
30
+ * although not necessarily in this form or with this API
31
+ *
32
+ * Must call EntityManager.enableSaveQueuing(true) to turn it on;
33
+ * EntityManager.enableSaveQueuing(false) restores the manager's original
34
+ * saveChanges method as it was at the time saveQueuing was first enabled.
35
+ *
36
+ * This module adds "enableSaveQueuing" to the EntityManager prototype.
37
+ * Calling "enableSaveQueuing(true)" adds a new _saveQueuing object
38
+ * to the manager instance.
39
+ *
40
+ * See DocCode:saveQueuingTests.js
41
+ * https://github.com/Breeze/breeze.js.samples/blob/master/net/DocCode/DocCode/tests/saveQueuingTests.js
42
+ *
43
+ * LIMITATIONS
44
+ * - Can't handle changes to the primary key (dangerous in any case)
45
+ * - Assumes promises. Does not support the (deprecated) success and fail callbacks
46
+ * - Does not queue saveOptions. The first one is re-used for all queued saves.
47
+ * - Does not deal with export/import of entities while save is inflight
48
+ * - Does not deal with rejectChanges while save is in flight
49
+ * - Does not support parallel saves even when the change-sets are independent.
50
+ * The native saveChanges allows such saves.
51
+ * SaveQueuing does not; too complex and doesn't fit the primary scenario anyway.
52
+ * - The resolved saveResult is the saveResult of the last completed save
53
+ * - A queued save that might have succeeded if saved immediately
54
+ * may fail because the server no longer accepts it later
55
+ * - Prior to Breeze v.1.5.3, a queued save that might have succeeded
56
+ * if saved immediately will fail if subsequently attempt to save
57
+ * an invalid entity. Can detect and circumvent after v.1.5.3.
58
+ *
59
+ * All members of EntityManager._saveQueuing are internal;
60
+ * touch them at your own risk.
61
+ */
62
+ //#endregion
63
+ import { EntityState, breeze } from 'breeze-client';
64
+ export function enableSaveQueuing(em, enable = true) {
65
+ let saveQueuing = em['_saveQueueing'] ||
66
+ (em['_saveQueuing'] = new SaveQueuing(em));
67
+ enable = (enable === undefined) ? true : enable;
68
+ saveQueuing._isEnabled = enable;
69
+ if (enable) {
70
+ // delegate to save changes queuing
71
+ em.saveChanges = saveChangesWithQueuing;
72
+ }
73
+ else {
74
+ // revert to the native EntityManager.saveChanges
75
+ em.saveChanges = em['_saveQueuing'].baseSaveChanges;
76
+ }
77
+ }
78
+ /**
79
+ * Replacement for EntityManager.saveChanges
80
+ * This version queues saveChanges calls while a real save is in progress
81
+ **/
82
+ function saveChangesWithQueuing(entities, saveOptions) {
83
+ try {
84
+ // `this` is an EntityManager
85
+ let saveQueuing = this._saveQueuing;
86
+ if (saveQueuing.isSaving) {
87
+ // save in progress; queue the save for later
88
+ return saveQueuing.queueSaveChanges(entities);
89
+ }
90
+ else {
91
+ // note that save is in progress; then save
92
+ saveQueuing.isSaving = true;
93
+ saveQueuing.saveOptions = saveOptions;
94
+ return saveQueuing.saveChanges(entities, saveOptions);
95
+ }
96
+ }
97
+ catch (err) {
98
+ return Promise.reject(err);
99
+ }
100
+ }
101
+ ///////// SaveQueuing /////////
102
+ class SaveQueuing {
103
+ entityManager;
104
+ baseSaveChanges;
105
+ isSaving;
106
+ _isEnabled;
107
+ activeSaveDeferred;
108
+ nextSaveDeferred;
109
+ activeSaveMemo;
110
+ nextSaveMemo;
111
+ saveOptions;
112
+ constructor(entityManager) {
113
+ this.entityManager = entityManager;
114
+ this.baseSaveChanges = entityManager.saveChanges;
115
+ this.isSaving = false;
116
+ }
117
+ isEnabled() {
118
+ return this._isEnabled;
119
+ }
120
+ getSavedNothingResult() {
121
+ return { entities: [], keyMappings: [] };
122
+ }
123
+ queueSaveChanges(entities) {
124
+ let self = this; // `this` is a SaveQueuing
125
+ let em = self.entityManager;
126
+ let changes = entities || em.getChanges();
127
+ if (changes.length === 0) {
128
+ return Promise.resolve(this.getSavedNothingResult());
129
+ }
130
+ let valError = em.saveChangesValidateOnClient(changes);
131
+ if (valError) {
132
+ return Promise.reject(valError);
133
+ }
134
+ let saveMemo = self.nextSaveMemo || (self.nextSaveMemo = new SaveMemo());
135
+ memoizeChanges();
136
+ let deferred = self.nextSaveDeferred || (self.nextSaveDeferred = new Deferred());
137
+ return deferred.promise;
138
+ function memoizeChanges() {
139
+ if (changes.length === 0) {
140
+ return;
141
+ }
142
+ let queuedChanges = saveMemo.queuedChanges;
143
+ changes.forEach(e => {
144
+ if (!e.entityAspect.isBeingSaved && queuedChanges.indexOf(e) === -1) {
145
+ queuedChanges.push(e);
146
+ }
147
+ });
148
+ saveMemo.updateEntityMemos(changes);
149
+ }
150
+ }
151
+ saveChanges(entities, saveOptions) {
152
+ let self = this; // `this` is a SaveQueuing
153
+ let promise = self.baseSaveChanges.call(self.entityManager, entities, saveOptions || self.saveOptions)
154
+ .then(function (saveResult) { return self.saveSucceeded(saveResult); })
155
+ .then(null, function (error) { console.log(error); return self.saveFailed(error); });
156
+ rememberAddedOriginalValues(entities); // do it after ... so don't send OrigValues to the server
157
+ return promise;
158
+ function rememberAddedOriginalValues(entities) {
159
+ // added entities normally don't have original values but these will now
160
+ let added = entities ?
161
+ entities.filter(function (e) { return e.entityAspect.entityState.isAdded(); }) :
162
+ self.entityManager.getEntities(null, EntityState.Added);
163
+ added.forEach(entity => {
164
+ let props = entity.entityType.dataProperties;
165
+ let originalValues = entity.entityAspect.originalValues;
166
+ props.forEach(dp => {
167
+ if (dp.isPartOfKey) {
168
+ return;
169
+ }
170
+ originalValues[dp.name] = entity.getProperty(dp.name);
171
+ });
172
+ });
173
+ }
174
+ }
175
+ saveSucceeded(saveResult) {
176
+ let self = this; // `this` is a SaveQueueing
177
+ let activeSaveDeferred = self.activeSaveDeferred;
178
+ let nextSaveDeferred = self.nextSaveDeferred;
179
+ let nextSaveMemo = self.nextSaveMemo;
180
+ // prepare as if nothing queued or left to save
181
+ self.isSaving = false;
182
+ self.activeSaveDeferred = null;
183
+ self.activeSaveMemo = null;
184
+ self.nextSaveDeferred = null;
185
+ self.nextSaveMemo = null;
186
+ if (nextSaveMemo) {
187
+ // a save was queued since last save returned
188
+ nextSaveMemo.pkFixup(saveResult.keyMappings);
189
+ nextSaveMemo.applyToSavedEntities(self.entityManager, saveResult.entities);
190
+ // remove detached entities from queuedChanges
191
+ let queuedChanges = nextSaveMemo.queuedChanges.filter(e => {
192
+ return !e.entityAspect.entityState.isDetached();
193
+ });
194
+ if (queuedChanges.length > 0) {
195
+ // save again
196
+ self.isSaving = true;
197
+ // remember the queued changes that triggered this save
198
+ self.activeSaveDeferred = nextSaveDeferred;
199
+ self.activeSaveMemo = nextSaveMemo;
200
+ self.saveChanges(queuedChanges, this.saveOptions);
201
+ }
202
+ else if (nextSaveDeferred) {
203
+ nextSaveDeferred.resolve(this.getSavedNothingResult());
204
+ }
205
+ }
206
+ if (activeSaveDeferred) {
207
+ activeSaveDeferred.resolve(saveResult);
208
+ }
209
+ return saveResult; // for the current promise chain
210
+ }
211
+ saveFailed(error) {
212
+ let self = this; // `this` is a SaveQueueing
213
+ error = new QueuedSaveFailedError(error, self);
214
+ let activeSaveDeferred = self.activeSaveDeferred;
215
+ let nextSaveDeferred = self.nextSaveDeferred;
216
+ self.isSaving = false;
217
+ self.activeSaveDeferred = null;
218
+ self.activeSaveMemo = null;
219
+ self.nextSaveDeferred = null;
220
+ self.nextSaveMemo = null;
221
+ if (activeSaveDeferred) {
222
+ activeSaveDeferred.reject(error);
223
+ }
224
+ if (nextSaveDeferred) {
225
+ nextSaveDeferred.reject(error);
226
+ }
227
+ return Promise.reject(error); // let promise chain hear error
228
+ }
229
+ }
230
+ /// for backward compat with older Promise implementation
231
+ class Deferred {
232
+ resolve;
233
+ reject;
234
+ promise;
235
+ constructor() {
236
+ this.promise = new Promise(function (resolve, reject) {
237
+ this.resolve = resolve;
238
+ this.reject = reject;
239
+ }.bind(this));
240
+ }
241
+ }
242
+ ////////// QueuedSaveFailedError /////////
243
+ // Error sub-class thrown when rejecting queued saves.
244
+ export class QueuedSaveFailedError extends Error {
245
+ name = "QueuedSaveFailedError";
246
+ innerError;
247
+ message;
248
+ failedSaveMemo;
249
+ nextSaveMemo;
250
+ // Error sub-class thrown when rejecting queued saves.
251
+ // `innerError` is the actual save error
252
+ // `failedSaveMemo` is the saveMemo that prompted this save
253
+ // `nextSaveMemo` holds queued changes accumulated since that save.
254
+ // You may try to recover using this info. Good luck with that.
255
+ constructor(errObject, saveQueuing) {
256
+ super();
257
+ this.innerError = errObject;
258
+ this.message = "Queued save failed: " + errObject.message;
259
+ this.failedSaveMemo = saveQueuing.activeSaveMemo;
260
+ this.nextSaveMemo = saveQueuing.nextSaveMemo;
261
+ }
262
+ }
263
+ ////////// SaveMemo ////////////////
264
+ // SaveMemo is a record of changes for a queued save, consisting of:
265
+ // entityMemos: info about entities that are being saved and
266
+ // have been changed since the save started
267
+ // queuedChanges: entities that are queued for save but
268
+ // are not currently being saved
269
+ class SaveMemo {
270
+ entityMemos;
271
+ queuedChanges;
272
+ constructor() {
273
+ this.entityMemos = {};
274
+ this.queuedChanges = [];
275
+ }
276
+ applyToSavedEntities(entityManager, savedEntities) {
277
+ let entityMemos = this.entityMemos; // `this` is a SaveMemo
278
+ let queuedChanges = this.queuedChanges;
279
+ let restorePublishing = this.disableManagerPublishing(entityManager);
280
+ try {
281
+ savedEntities.forEach(saved => {
282
+ let key = this.makeEntityMemoKey(saved);
283
+ let entityMemo = entityMemos[key];
284
+ let resave = entityMemo && entityMemo.applyToSavedEntity(saved);
285
+ if (resave) {
286
+ queuedChanges.push(saved);
287
+ }
288
+ });
289
+ }
290
+ finally {
291
+ restorePublishing();
292
+ // D#2651 hasChanges will be wrong if changes made while save in progress
293
+ let hasChanges = queuedChanges.length > 0;
294
+ // Must use breeze internal method to properly set this flag true
295
+ if (hasChanges) {
296
+ entityManager._setHasChanges(true);
297
+ }
298
+ }
299
+ }
300
+ disableManagerPublishing(manager) {
301
+ let Event = breeze.Event;
302
+ Event.enable('entityChanged', manager, false);
303
+ Event.enable('hasChangesChanged', manager, false);
304
+ return function restorePublishing() {
305
+ Event.enable('entityChanged', manager, true);
306
+ Event.enable('hasChangesChanged', manager, true);
307
+ };
308
+ }
309
+ pkFixup(keyMappings) {
310
+ let entityMemos = this.entityMemos; // `this` is a SaveMemo
311
+ keyMappings.forEach(km => {
312
+ let type = km.entityTypeName;
313
+ let tempKey = type + '|' + km.tempValue;
314
+ if (entityMemos[tempKey]) {
315
+ entityMemos[type + '|' + km.realValue] = entityMemos[tempKey];
316
+ delete entityMemos[tempKey];
317
+ }
318
+ for (let memoKey in entityMemos) {
319
+ entityMemos[memoKey].fkFixup(km);
320
+ }
321
+ });
322
+ }
323
+ makeEntityMemoKey(entity) {
324
+ let entityKey = entity.entityAspect.getKey();
325
+ return entityKey.entityType.name + '|' + entityKey.values;
326
+ }
327
+ updateEntityMemos(changes) {
328
+ let entityMemos = this.entityMemos; // `this` is a SaveMemo
329
+ changes.forEach(change => {
330
+ // only update entityMemo for entity being save
331
+ if (!change.entityAspect.isBeingSaved) {
332
+ return;
333
+ }
334
+ let key = this.makeEntityMemoKey(change);
335
+ let entityMemo = entityMemos[key] || (entityMemos[key] = new EntityMemo(change));
336
+ entityMemo.update();
337
+ });
338
+ }
339
+ }
340
+ ///////// EntityMemo Type ///////////////
341
+ // Information about an entity that is being saved
342
+ // and which has been changed since that save started
343
+ class EntityMemo {
344
+ entity;
345
+ pendingChanges;
346
+ isDeleted;
347
+ constructor(entity) {
348
+ this.entity = entity;
349
+ this.pendingChanges = {};
350
+ }
351
+ applyToSavedEntity(saved) {
352
+ let entityMemo = this;
353
+ let aspect = saved.entityAspect;
354
+ if (aspect.entityState.isDetached()) {
355
+ return false;
356
+ }
357
+ else if (entityMemo.isDeleted) {
358
+ aspect.setDeleted();
359
+ return true;
360
+ }
361
+ // treat entity with pending changes as modified
362
+ let props = Object.keys(entityMemo.pendingChanges);
363
+ if (props.length === 0) {
364
+ return false;
365
+ }
366
+ let originalValues = aspect.originalValues;
367
+ props.forEach(name => {
368
+ originalValues[name] = saved.getProperty(name);
369
+ saved.setProperty(name, entityMemo.pendingChanges[name]);
370
+ });
371
+ aspect.setModified();
372
+ return true;
373
+ }
374
+ fkFixup(keyMapping) {
375
+ let entityMemo = this;
376
+ let type = entityMemo.entity.entityType;
377
+ let fkProps = type.foreignKeyProperties;
378
+ fkProps.forEach(fkProp => {
379
+ if (fkProp.parentType.name === keyMapping.entityTypeName &&
380
+ entityMemo.pendingChanges[fkProp.name] === keyMapping.tempValue) {
381
+ entityMemo.pendingChanges[fkProp.name] = keyMapping.realValue;
382
+ }
383
+ });
384
+ }
385
+ // update the entityMemo of changes to an entity being saved
386
+ // so that we know how to save it again later
387
+ update() {
388
+ let entityMemo = this;
389
+ let props;
390
+ let entity = entityMemo.entity;
391
+ let aspect = entity.entityAspect;
392
+ let stateName = aspect.entityState.name;
393
+ switch (stateName) {
394
+ case 'Added':
395
+ let originalValues = aspect.originalValues;
396
+ props = entity.entityType.dataProperties;
397
+ props.forEach(dp => {
398
+ if (dp.isPartOfKey) {
399
+ return;
400
+ }
401
+ let name = dp.name;
402
+ let value = entity.getProperty(name);
403
+ if (originalValues[name] !== value) {
404
+ entityMemo.pendingChanges[name] = value;
405
+ }
406
+ });
407
+ break;
408
+ case 'Deleted':
409
+ entityMemo.isDeleted = true;
410
+ entityMemo.pendingChanges = {};
411
+ break;
412
+ case 'Modified':
413
+ props = Object.keys(aspect.originalValues);
414
+ props.forEach(name => {
415
+ entityMemo.pendingChanges[name] = entity.getProperty(name);
416
+ });
417
+ break;
418
+ }
419
+ }
420
+ }
421
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4aW4tc2F2ZS1xdWV1aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21peGluLXNhdmUtcXVldWluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2Q0FBNkM7QUFDN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkRHO0FBQ0gsWUFBWTtBQUNaLE9BQU8sRUFBcUMsV0FBVyxFQUFjLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUduRyxNQUFNLFVBQVUsaUJBQWlCLENBQUMsRUFBaUIsRUFBRSxTQUFrQixJQUFJO0lBQ3pFLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUM7UUFDbkMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU3QyxNQUFNLEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2hELFdBQVcsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO0lBQ2hDLElBQUksTUFBTSxFQUFFO1FBQ1YsbUNBQW1DO1FBQ25DLEVBQUUsQ0FBQyxXQUFXLEdBQUcsc0JBQXNCLENBQUM7S0FDekM7U0FBTTtRQUNMLGlEQUFpRDtRQUNqRCxFQUFFLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxlQUFlLENBQUM7S0FDckQ7QUFDSCxDQUFDO0FBRUQ7OztJQUdJO0FBQ0osU0FBUyxzQkFBc0IsQ0FBQyxRQUF5QixFQUFFLFdBQWdCO0lBQ3pFLElBQUk7UUFDRiw2QkFBNkI7UUFDN0IsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNwQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUU7WUFDeEIsNkNBQTZDO1lBQzdDLE9BQU8s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QUNiLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDM0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDbkIsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3RCxDQUFDLENBQUMsQ0FBQztnQkFDSCxNQUFNO1NBQ1Q7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyNyZWdpb24gQ29weXJpZ2h0LCBWZXJzaW9uLCBhbmQgRGVzY3JpcHRpb25cclxuLypcclxuICogQ29weXJpZ2h0IDIwMTUtMjAyMSBJZGVhQmxhZGUsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIFVzZSwgcmVwcm9kdWN0aW9uLCBkaXN0cmlidXRpb24sIGFuZCBtb2RpZmljYXRpb24gb2YgdGhpcyBjb2RlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZFxyXG4gKiBjb25kaXRpb25zIG9mIHRoZSBJZGVhQmxhZGUgQnJlZXplIGxpY2Vuc2UsIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyZWV6ZWpzLmNvbS9saWNlbnNlXHJcbiAqXHJcbiAqIEF1dGhvcjogV2FyZCBCZWxsXHJcbiAqIFZlcnNpb246IDIuMC42IFN0ZXZlIFNjaG1pdHQgLSBjb252ZXJ0IHRvIFR5cGVTY3JpcHQsIG1vdmUgdG8gYnJlZXplLWNsaWVudCByZXBvLCBjaGFuZ2UgZW5hYmxlU2F2ZVF1ZXVpbmcgZnVuY3Rpb25cclxuICogVmVyc2lvbjogMi4wLjUgV2FyZCBCZWxsXHJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAqIEFkZHMgXCJTYXZlIFF1ZXVpbmdcIiBjYXBhYmlsaXR5IHRvIG5ldyBFbnRpdHlNYW5hZ2Vyc1xyXG4gKlxyXG4gKiBTYXZlIFF1ZXVpbmcgYXV0b21hdGljYWxseSBxdWV1ZXMgYW5kIGRlZmVycyBhbiBFbnRpdHlNYW5hZ2VyLnNhdmVDaGFuZ2VzIGNhbGxcclxuICogd2hlbiBhbm90aGVyIHNhdmUgaXMgaW4gcHJvZ3Jlc3MgZm9yIHRoYXQgbWFuYWdlciBhbmQgdGhlIHNlcnZlciBoYXMgbm90IHlldCByZXNwb25kZWQuXHJcbiAqIFRoaXMgZmVhdHVyZSBpcyBoZWxwZnVsIHdoZW4geW91ciBhcHAgbmVlZHMgdG8gYWxsb3cgcmFwaWQsIGNvbnRpbnVvdXMgY2hhbmdlc1xyXG4gKiB0byBlbnRpdGllcyB0aGF0IG1heSBiZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBzYXZlZC5cclxuICpcclxuICogV2l0aG91dCBcIlNhdmUgUXVldWluZ1wiLCBhbiBFbnRpdHlNYW5hZ2VyIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uXHJcbiAqIHdoZW4geW91IGNhbGwgc2F2ZUNoYW5nZXMgZm9yIGFuIGVudGl0eSB3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcgc2F2ZWQuXHJcbiAqXHJcbiAqICEhISBVc2Ugd2l0aCBjYXV0aW9uICEhIVxyXG4gKiBJdCBpcyB1c3VhbGx5IGJldHRlciB0byBkaXNhYmxlIHVzZXIgaW5wdXQgd2hpbGUgYSBzYXZlIGlzIGluIHByb2dyZXNzLlxyXG4gKiBTYXZlIFF1ZXVpbmcgbWF5IGJlIGFwcHJvcHJpYXRlIGZvciBzaW1wbGUgXCJhdXRvLXNhdmVcIiBzY2VuYXJpb3NcclxuICogd2hlbiB0aGUgc2F2ZSBsYXRlbmN5IGlzIFwic2hvcnRcIiAodW5kZXIgYSBmZXcgc2Vjb25kcykuXHJcbiAqXHJcbiAqIFNhdmUgUXVldWluZyBpcyBOT1QgaW50ZW5kZWQgZm9yIG9jY2Fzc2lvbmFsbHkgZGlzY29ubmVjdGVkIG9yIG9mZmxpbmUgc2NlbmFyaW9zLlxyXG4gKlxyXG4gKiBTYXZlIFF1ZXVpbmcgaXMgZXhwZXJpbWVudGFsLiBJdCB3aWxsIG5vdCBiZWNvbWUgYSBwYXJ0IG9mIEJyZWV6ZUpTIGNvcmVcclxuICogYnV0IG1pZ2h0IGJlY29tZSBhbiBvZmZpY2lhbCBCcmVlemUgcGx1Z2luIGluIGZ1dHVyZVxyXG4gKiBhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgaW4gdGhpcyBmb3JtIG9yIHdpdGggdGhpcyBBUElcclxuICpcclxuICogTXVzdCBjYWxsIEVudGl0eU1hbmFnZXIuZW5hYmxlU2F2ZVF1ZXVpbmcodHJ1ZSkgdG8gdHVybiBpdCBvbjtcclxuICogRW50aXR5TWFuYWdlci5lbmFibGVTYXZlUXVldWluZyhmYWxzZSkgcmVzdG9yZXMgdGhlIG1hbmFnZXIncyBvcmlnaW5hbFxyXG4gKiBzYXZlQ2hhbmdlcyBtZXRob2QgYXMgaXQgd2FzIGF0IHRoZSB0aW1lIHNhdmVRdWV1aW5nIHdhcyBmaXJzdCBlbmFibGVkLlxyXG4gKlxyXG4gKiBUaGlzIG1vZHVsZSBhZGRzIFwiZW5hYmxlU2F2ZVF1ZXVpbmdcIiB0byB0aGUgRW50aXR5TWFuYWdlciBwcm90b3R5cGUuXHJcbiAqIENhbGxpbmcgXCJlbmFibGVTYXZlUXVldWluZyh0cnVlKVwiIGFkZHMgYSBuZXcgX3NhdmVRdWV1aW5nIG9iamVjdFxyXG4gKiB0byB0aGUgbWFuYWdlciBpbnN0YW5jZS5cclxuICpcclxuICogU2VlIERvY0NvZGU6c2F2ZVF1ZXVpbmdUZXN0cy5qc1xyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQnJlZXplL2JyZWV6ZS5qcy5zYW1wbGVzL2Jsb2IvbWFzdGVyL25ldC9Eb2NDb2RlL0RvY0NvZGUvdGVzdHMvc2F2ZVF1ZXVpbmdUZXN0cy5qc1xyXG4gKlxyXG4gKiBMSU1JVEFUSU9OU1xyXG4gKiAtIENhbid0IGhhbmRsZSBjaGFuZ2VzIHRvIHRoZSBwcmltYXJ5IGtleSAoZGFuZ2Vyb3VzIGluIGFueSBjYXNlKVxyXG4gKiAtIEFzc3VtZXMgcHJvbWlzZXMuIERvZXMgbm90IHN1cHBvcnQgdGhlIChkZXByZWNhdGVkKSBzdWNjZXNzIGFuZCBmYWlsIGNhbGxiYWNrc1xyXG4gKiAtIERvZXMgbm90IHF1ZXVlIHNhdmVPcHRpb25zLiBUaGUgZmlyc3Qgb25lIGlzIHJlLXVzZWQgZm9yIGFsbCBxdWV1ZWQgc2F2ZXMuXHJcbiAqIC0gRG9lcyBub3QgZGVhbCB3aXRoIGV4cG9ydC9pbXBvcnQgb2YgZW50aXRpZXMgd2hpbGUgc2F2ZSBpcyBpbmZsaWdodFxyXG4gKiAtIERvZXMgbm90IGRlYWwgd2l0aCByZWplY3RDaGFuZ2VzIHdoaWxlIHNhdmUgaXMgaW4gZmxpZ2h0XHJcbiAqIC0gRG9lcyBub3Qgc3VwcG9ydCBwYXJhbGxlbCBzYXZlcyBldmVuIHdoZW4gdGhlIGNoYW5nZS1zZXRzIGFyZSBpbmRlcGVuZGVudC5cclxuICogICBUaGUgbmF0aXZlIHNhdmVDaGFuZ2VzIGFsbG93cyBzdWNoIHNhdmVzLlxyXG4gKiAgIFNhdmVRdWV1aW5nIGRvZXMgbm90OyB0b28gY29tcGxleCBhbmQgZG9lc24ndCBmaXQgdGhlIHByaW1hcnkgc2NlbmFyaW8gYW55d2F5LlxyXG4gKiAtIFRoZSByZXNvbHZlZCBzYXZlUmVzdWx0IGlzIHRoZSBzYXZlUmVzdWx0IG9mIHRoZSBsYXN0IGNvbXBsZXRlZCBzYXZlXHJcbiAqIC0gQSBxdWV1ZWQgc2F2ZSB0aGF0IG1pZ2h0IGhhdmUgc3VjY2VlZGVkIGlmIHNhdmVkIGltbWVkaWF0ZWx5XHJcbiAqICAgbWF5IGZhaWwgYmVjYXVzZSB0aGUgc2VydmVyIG5vIGxvbmdlciBhY2NlcHRzIGl0IGxhdGVyXHJcbiAqIC0gUHJpb3IgdG8gQnJlZXplIHYuMS41LjMsIGEgcXVldWVkIHNhdmUgdGhhdCBtaWdodCBoYXZlIHN1Y2NlZWRlZFxyXG4gKiAgIGlmIHNhdmVkIGltbWVkaWF0ZWx5IHdpbGwgZmFpbCBpZiBzdWJzZXF1ZW50bHkgYXR0ZW1wdCB0byBzYXZlXHJcbiAqICAgYW4gaW52YWxpZCBlbnRpdHkuIENhbiBkZXRlY3QgYW5kIGNpcmN1bXZlbnQgYWZ0ZXIgdi4xLjUuMy5cclxuICpcclxuICogQWxsIG1lbWJlcnMgb2YgRW50aXR5TWFuYWdlci5fc2F2ZVF1ZXVpbmcgYXJlIGludGVybmFsO1xyXG4gKiB0b3VjaCB0aGVtIGF0IHlvdXIgb3duIHJpc2suXHJcbiAqL1xyXG4vLyNlbmRyZWdpb25cclxuaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlNYW5hZ2VyLCBLZXlNYXBwaW5nLCBFbnRpdHlTdGF0ZSwgU2F2ZVJlc3VsdCwgYnJlZXplIH0gZnJvbSAnYnJlZXplLWNsaWVudCc7XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZVNhdmVRdWV1aW5nKGVtOiBFbnRpdHlNYW5hZ2VyLCBlbmFibGU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgbGV0IHNhdmVRdWV1aW5nID0gZW1bJ19zYXZlUXVldWVpbmcnXSB8fFxyXG4gICAgKGVtWydfc2F2ZVF1ZXVpbmcnXSA9IG5ldyBTYXZlUXVldWluZyhlbSkpO1xyXG5cclxuICBlbmFibGUgPSAoZW5hYmxlID09PSB1bmRlZmluZWQpID8gdHJ1ZSA6IGVuYWJsZTtcclxuICBzYXZlUXVldWluZy5faXNFbmFibGVkID0gZW5hYmxlO1xyXG4gIGlmIChlbmFibGUpIHtcclxuICAgIC8vIGRlbGVnYXRlIHRvIHNhdmUgY2hhbmdlcyBxdWV1aW5nXHJcbiAgICBlbS5zYXZlQ2hhbmdlcyA9IHNhdmVDaGFuZ2VzV2l0aFF1ZXVpbmc7XHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIHJldmVydCB0byB0aGUgbmF0aXZlIEVudGl0eU1hbmFnZXIuc2F2ZUNoYW5nZXNcclxuICAgIGVtLnNhdmVDaGFuZ2VzID0gZW1bJ19zYXZlUXVldWluZyddLmJhc2VTYXZlQ2hhbmdlcztcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXBsYWNlbWVudCBmb3IgRW50aXR5TWFuYWdlci5zYXZlQ2hhbmdlc1xyXG4gKiBUaGlzIHZlcnNpb24gcXVldWVzIHNhdmVDaGFuZ2VzIGNhbGxzIHdoaWxlIGEgcmVhbCBzYXZlIGlzIGluIHByb2dyZXNzXHJcbiAqKi9cclxuZnVuY3Rpb24gc2F2ZUNoYW5nZXNXaXRoUXVldWluZyhlbnRpdGllczogRW50aXR5W10gfCBudWxsLCBzYXZlT3B0aW9uczogYW55KSB7XHJcbiAgdHJ5IHtcclxuICAgIC8vIGB0aGlzYCBpcyBhbiBFbnRpdHlNYW5hZ2VyXHJcbiAgICBsZXQgc2F2ZVF1ZXVpbmcgPSB0aGlzLl9zYXZlUXVldWluZztcclxuICAgIGlmIChzYXZlUXVldWluZy5pc1NhdmluZykge1xyXG4gICAgICAvLyBzYXZlIGluIHByb2dyZXNzOyBxdWV1ZSB0aGUgc2F2ZSBmb3IgbGF0ZXJcclxuICAgICAgcmV0dXJuIHNhdmVRdWV1aW5nLnF1ZXVlU2F2ZUNoYW5nZXMoZW50aXRpZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gbm90ZSB0aGF0IHNhdmUgaXMgaW4gcHJvZ3Jlc3M7IHRoZW4gc2F2ZVxyXG4gICAgICBzYXZlUXVldWluZy5pc1NhdmluZyA9IHRydWU7XHJcbiAgICAgIHNhdmVRdWV1aW5nLnNhdmVPcHRpb25zID0gc2F2ZU9wdGlvbnM7XHJcbiAgICAgIHJldHVybiBzYXZlUXVldWluZy5zYXZlQ2hhbmdlcyhlbnRpdGllcywgc2F2ZU9wdGlvbnMpO1xyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XHJcbiAgfVxyXG59XHJcblxyXG4vLy8vLy8vLy8gU2F2ZVF1ZXVpbmcgLy8vLy8vLy8vXHJcbmNsYXNzIFNhdmVRdWV1aW5nIHtcclxuICBlbnRpdHlNYW5hZ2VyOiBFbnRpdHlNYW5hZ2VyO1xyXG4gIGJhc2VTYXZlQ2hhbmdlczogKCkgPT4gUHJvbWlzZTxhbnk+O1xyXG4gIGlzU2F2aW5nOiBib29sZWFuO1xyXG4gIF9pc0VuYWJsZWQ6IGJvb2xlYW47XHJcbiAgYWN0aXZlU2F2ZURlZmVycmVkOiBEZWZlcnJlZDxTYXZlUmVzdWx0PjtcclxuICBuZXh0U2F2ZURlZmVycmVkOiBEZWZlcnJlZDxTYXZlUmVzdWx0PjtcclxuICBhY3RpdmVTYXZlTWVtbzogU2F2ZU1lbW87XHJcbiAgbmV4dFNhdmVNZW1vOiBTYXZlTWVtbztcclxuICBzYXZlT3B0aW9uczogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcihlbnRpdHlNYW5hZ2VyOiBFbnRpdHlNYW5hZ2VyKSB7XHJcbiAgICB0aGlzLmVudGl0eU1hbmFnZXIgPSBlbnRpdHlNYW5hZ2VyO1xyXG4gICAgdGhpcy5iYXNlU2F2ZUNoYW5nZXMgPSBlbnRpdHlNYW5hZ2VyLnNhdmVDaGFuZ2VzO1xyXG4gICAgdGhpcy5pc1NhdmluZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaXNFbmFibGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzRW5hYmxlZDtcclxuICB9XHJcblxyXG4gIGdldFNhdmVkTm90aGluZ1Jlc3VsdCgpOiBTYXZlUmVzdWx0IHtcclxuICAgIHJldHVybiB7IGVudGl0aWVzOiBbXSBhcyBFbnRpdHlbXSwga2V5TWFwcGluZ3M6IFtdIGFzIEtleU1hcHBpbmdbXSB9O1xyXG4gIH1cclxuXHJcbiAgcXVldWVTYXZlQ2hhbmdlcyhlbnRpdGllczogRW50aXR5W10pIHtcclxuICAgIGxldCBzZWxmID0gdGhpczsgLy8gYHRoaXNgIGlzIGEgU2F2ZVF1ZXVpbmdcclxuICAgIGxldCBlbSA9IHNlbGYuZW50aXR5TWFuYWdlcjtcclxuXHJcbiAgICBsZXQgY2hhbmdlcyA9IGVudGl0aWVzIHx8IGVtLmdldENoYW5nZXMoKTtcclxuICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZ2V0U2F2ZWROb3RoaW5nUmVzdWx0KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB2YWxFcnJvciA9IGVtLnNhdmVDaGFuZ2VzVmFsaWRhdGVPbkNsaWVudChjaGFuZ2VzKTtcclxuICAgIGlmICh2YWxFcnJvcikge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QodmFsRXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBzYXZlTWVtbyA9IHNlbGYubmV4dFNhdmVNZW1vIHx8IChzZWxmLm5leHRTYXZlTWVtbyA9IG5ldyBTYXZlTWVtbygpKTtcclxuICAgIG1lbW9pemVDaGFuZ2VzKCk7XHJcbiAgICBsZXQgZGVmZXJyZWQgPSBzZWxmLm5leHRTYXZlRGVmZXJyZWQgfHwgKHNlbGYubmV4dFNhdmVEZWZlcnJlZCA9IG5ldyBEZWZlcnJlZDxTYXZlUmVzdWx0PigpKTtcclxuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIG1lbW9pemVDaGFuZ2VzKCkge1xyXG4gICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XHJcbiAgICAgIGxldCBxdWV1ZWRDaGFuZ2VzID0gc2F2ZU1lbW8ucXVldWVkQ2hhbmdlcztcclxuICAgICAgY2hhbmdlcy5mb3JFYWNoKGUgPT4ge1xyXG4gICAgICAgIGlmICghZS5lbnRpdHlBc3BlY3QuaXNCZWluZ1NhdmVkICYmIHF1ZXVlZENoYW5nZXMuaW5kZXhPZihlKSA9PT0gLTEpIHtcclxuICAgICAgICAgIHF1ZXVlZENoYW5nZXMucHVzaChlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgc2F2ZU1lbW8udXBkYXRlRW50aXR5TWVtb3MoY2hhbmdlcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzYXZlQ2hhbmdlcyhlbnRpdGllczogRW50aXR5W10sIHNhdmVPcHRpb25zOiBhbnkpIHtcclxuICAgIGxldCBzZWxmID0gdGhpczsgLy8gYHRoaXNgIGlzIGEgU2F2ZVF1ZXVpbmdcclxuICAgIGxldCBwcm9taXNlID0gc2VsZi5iYXNlU2F2ZUNoYW5nZXMuY2FsbChzZWxmLmVudGl0eU1hbmFnZXIsIGVudGl0aWVzLCBzYXZlT3B0aW9ucyB8fCBzZWxmLnNhdmVPcHRpb25zKVxyXG4gICAgICAudGhlbihmdW5jdGlvbiAoc2F2ZVJlc3VsdDogU2F2ZVJlc3VsdCkgeyByZXR1cm4gc2VsZi5zYXZlU3VjY2VlZGVkKHNhdmVSZXN1bHQpOyB9KVxyXG4gICAgICAudGhlbihudWxsLCBmdW5jdGlvbiAoZXJyb3I6IEVycm9yKSB7IGNvbnNvbGUubG9nKGVycm9yKTsgcmV0dXJuIHNlbGYuc2F2ZUZhaWxlZChlcnJvcik7IH0pO1xyXG4gICAgcmVtZW1iZXJBZGRlZE9yaWdpbmFsVmFsdWVzKGVudGl0aWVzKTsgLy8gZG8gaXQgYWZ0ZXIgLi4uIHNvIGRvbid0IHNlbmQgT3JpZ1ZhbHVlcyB0byB0aGUgc2VydmVyXHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuXHJcbiAgICBmdW5jdGlvbiByZW1lbWJlckFkZGVkT3JpZ2luYWxWYWx1ZXMoZW50aXRpZXM6IEVudGl0eVtdKSB7XHJcbiAgICAgIC8vIGFkZGVkIGVudGl0aWVzIG5vcm1hbGx5IGRvbid0IGhhdmUgb3JpZ2luYWwgdmFsdWVzIGJ1dCB0aGVzZSB3aWxsIG5vd1xyXG4gICAgICBsZXQgYWRkZWQgPSBlbnRpdGllcyA/XHJcbiAgICAgICAgZW50aXRpZXMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLmVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZS5pc0FkZGVkKCk7IH0pIDpcclxuICAgICAgICBzZWxmLmVudGl0eU1hbmFnZXIuZ2V0RW50aXRpZXMobnVsbCwgRW50aXR5U3RhdGUuQWRkZWQpO1xyXG4gICAgICBhZGRlZC5mb3JFYWNoKGVudGl0eSA9PiB7XHJcbiAgICAgICAgbGV0IHByb3BzID0gZW50aXR5LmVudGl0eVR5cGUuZGF0YVByb3BlcnRpZXM7XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsVmFsdWVzID0gZW50aXR5LmVudGl0eUFzcGVjdC5vcmlnaW5hbFZhbHVlcztcclxuICAgICAgICBwcm9wcy5mb3JFYWNoKGRwID0+IHtcclxuICAgICAgICAgIGlmIChkcC5pc1BhcnRPZktleSkgeyByZXR1cm47IH1cclxuICAgICAgICAgIG9yaWdpbmFsVmFsdWVzW2RwLm5hbWVdID0gZW50aXR5LmdldFByb3BlcnR5KGRwLm5hbWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBzYXZlU3VjY2VlZGVkKHNhdmVSZXN1bHQ6IFNhdmVSZXN1bHQpIHtcclxuICAgIGxldCBzZWxmID0gdGhpczsgLy8gYHRoaXNgIGlzIGEgU2F2ZVF1ZXVlaW5nXHJcbiAgICBsZXQgYWN0aXZlU2F2ZURlZmVycmVkID0gc2VsZi5hY3RpdmVTYXZlRGVmZXJyZWQ7XHJcbiAgICBsZXQgbmV4dFNhdmVEZWZlcnJlZCA9IHNlbGYubmV4dFNhdmVEZWZlcnJlZDtcclxuICAgIGxldCBuZXh0U2F2ZU1lbW8gPSBzZWxmLm5leHRTYXZlTWVtbztcclxuXHJcblxyXG4gICAgLy8gcHJlcGFyZSBhcyBpZiBub3RoaW5nIHF1ZXVlZCBvciBsZWZ0IHRvIHNhdmVcclxuICAgIHNlbGYuaXNTYXZpbmcgPSBmYWxzZTtcclxuICAgIHNlbGYuYWN0aXZlU2F2ZURlZmVycmVkID0gbnVsbDtcclxuICAgIHNlbGYuYWN0aXZlU2F2ZU1lbW8gPSBudWxsO1xyXG4gICAgc2VsZi5uZXh0U2F2ZURlZmVycmVkID0gbnVsbDtcclxuICAgIHNlbGYubmV4dFNhdmVNZW1vID0gbnVsbDtcclxuXHJcbiAgICBpZiAobmV4dFNhdmVNZW1vKSB7XHJcbiAgICAgIC8vIGEgc2F2ZSB3YXMgcXVldWVkIHNpbmNlIGxhc3Qgc2F2ZSByZXR1cm5lZFxyXG4gICAgICBuZXh0U2F2ZU1lbW8ucGtGaXh1cChzYXZlUmVzdWx0LmtleU1hcHBpbmdzKTtcclxuICAgICAgbmV4dFNhdmVNZW1vLmFwcGx5VG9TYXZlZEVudGl0aWVzKHNlbGYuZW50aXR5TWFuYWdlciwgc2F2ZVJlc3VsdC5lbnRpdGllcyk7XHJcbiAgICAgIC8vIHJlbW92ZSBkZXRhY2hlZCBlbnRpdGllcyBmcm9tIHF1ZXVlZENoYW5nZXNcclxuICAgICAgbGV0IHF1ZXVlZENoYW5nZXMgPSBuZXh0U2F2ZU1lbW8ucXVldWVkQ2hhbmdlcy5maWx0ZXIoZSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICFlLmVudGl0eUFzcGVjdC5lbnRpdHlTdGF0ZS5pc0RldGFjaGVkKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHF1ZXVlZENoYW5nZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vIHNhdmUgYWdhaW5cclxuICAgICAgICBzZWxmLmlzU2F2aW5nID0gdHJ1ZTtcclxuICAgICAgICAvLyByZW1lbWJlciB0aGUgcXVldWVkIGNoYW5nZXMgdGhhdCB0cmlnZ2VyZWQgdGhpcyBzYXZlXHJcbiAgICAgICAgc2VsZi5hY3RpdmVTYXZlRGVmZXJyZWQgPSBuZXh0U2F2ZURlZmVycmVkO1xyXG4gICAgICAgIHNlbGYuYWN0aXZlU2F2ZU1lbW8gPSBuZXh0U2F2ZU1lbW87XHJcbiAgICAgICAgc2VsZi5zYXZlQ2hhbmdlcyhxdWV1ZWRDaGFuZ2VzLCB0aGlzLnNhdmVPcHRpb25zKTtcclxuICAgICAgfSBlbHNlIGlmIChuZXh0U2F2ZURlZmVycmVkKSB7XHJcbiAgICAgICAgbmV4dFNhdmVEZWZlcnJlZC5yZXNvbHZlKHRoaXMuZ2V0U2F2ZWROb3RoaW5nUmVzdWx0KCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGFjdGl2ZVNhdmVEZWZlcnJlZCkgeyBhY3RpdmVTYXZlRGVmZXJyZWQucmVzb2x2ZShzYXZlUmVzdWx0KTsgfVxyXG4gICAgcmV0dXJuIHNhdmVSZXN1bHQ7ICAvLyBmb3IgdGhlIGN1cnJlbnQgcHJvbWlzZSBjaGFpblxyXG4gIH1cclxuXHJcbiAgc2F2ZUZhaWxlZChlcnJvcjogRXJyb3IpIHtcclxuICAgIGxldCBzZWxmID0gdGhpczsgLy8gYHRoaXNgIGlzIGEgU2F2ZVF1ZXVlaW5nXHJcbiAgICBlcnJvciA9IG5ldyBRdWV1ZWRTYXZlRmFpbGVkRXJyb3IoZXJyb3IsIHNlbGYpO1xyXG5cclxuICAgIGxldCBhY3RpdmVTYXZlRGVmZXJyZWQgPSBzZWxmLmFjdGl2ZVNhdmVEZWZlcnJlZDtcclxuICAgIGxldCBuZXh0U2F2ZURlZmVycmVkID0gc2VsZi5uZXh0U2F2ZURlZmVycmVkO1xyXG5cclxuICAgIHNlbGYuaXNTYXZpbmcgPSBmYWxzZTtcclxuICAgIHNlbGYuYWN0aXZlU2F2ZURlZmVycmVkID0gbnVsbDtcclxuICAgIHNlbGYuYWN0aXZlU2F2ZU1lbW8gPSBudWxsO1xyXG4gICAgc2VsZi5uZXh0U2F2ZURlZmVycmVkID0gbnVsbDtcclxuICAgIHNlbGYubmV4dFNhdmVNZW1vID0gbnVsbDtcclxuXHJcbiAgICBpZiAoYWN0aXZlU2F2ZURlZmVycmVkKSB7IGFjdGl2ZVNhdmVEZWZlcnJlZC5yZWplY3QoZXJyb3IpOyB9XHJcbiAgICBpZiAobmV4dFNhdmVEZWZlcnJlZCkgeyBuZXh0U2F2ZURlZmVycmVkLnJlamVjdChlcnJvcik7IH1cclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpOyAvLyBsZXQgcHJvbWlzZSBjaGFpbiBoZWFyIGVycm9yXHJcbiAgfVxyXG59XHJcblxyXG4vLy8gZm9yIGJhY2t3YXJkIGNvbXBhdCB3aXRoIG9sZGVyIFByb21pc2UgaW1wbGVtZW50YXRpb25cclxuY2xhc3MgRGVmZXJyZWQ8VD4ge1xyXG4gIHJlc29sdmU6ICh2YWw6IGFueSkgPT4gdm9pZDtcclxuICByZWplY3Q6IChlcnI6IGFueSkgPT4gdm9pZDtcclxuICBwcm9taXNlOiBQcm9taXNlPFQ+O1xyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2U8VD4oZnVuY3Rpb24gKHJlc29sdmU6ICh2YWw6IGFueSkgPT4gdm9pZCwgcmVqZWN0OiAoZXJyOiBhbnkpID0+IHZvaWQpIHtcclxuICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XHJcbiAgICB9LmJpbmQodGhpcykpO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbi8vLy8vLy8vLy8gUXVldWVkU2F2ZUZhaWxlZEVycm9yIC8vLy8vLy8vL1xyXG4vLyBFcnJvciBzdWItY2xhc3MgdGhyb3duIHdoZW4gcmVqZWN0aW5nIHF1ZXVlZCBzYXZlcy5cclxuZXhwb3J0IGNsYXNzIFF1ZXVlZFNhdmVGYWlsZWRFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBuYW1lID0gXCJRdWV1ZWRTYXZlRmFpbGVkRXJyb3JcIjtcclxuICBpbm5lckVycm9yOiBFcnJvcjtcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgZmFpbGVkU2F2ZU1lbW86IFNhdmVNZW1vO1xyXG4gIG5leHRTYXZlTWVtbzogU2F2ZU1lbW87XHJcblxyXG4gIC8vIEVycm9yIHN1Yi1jbGFzcyB0aHJvd24gd2hlbiByZWplY3RpbmcgcXVldWVkIHNhdmVzLlxyXG4gIC8vIGBpbm5lckVycm9yYCBpcyB0aGUgYWN0dWFsIHNhdmUgZXJyb3JcclxuICAvLyBgZmFpbGVkU2F2ZU1lbW9gIGlzIHRoZSBzYXZlTWVtbyB0aGF0IHByb21wdGVkIHRoaXMgc2F2ZVxyXG4gIC8vIGBuZXh0U2F2ZU1lbW9gIGhvbGRzIHF1ZXVlZCBjaGFuZ2VzIGFjY3VtdWxhdGVkIHNpbmNlIHRoYXQgc2F2ZS5cclxuICAvLyBZb3UgbWF5IHRyeSB0byByZWNvdmVyIHVzaW5nIHRoaXMgaW5mby4gR29vZCBsdWNrIHdpdGggdGhhdC5cclxuICBjb25zdHJ1Y3RvcihlcnJPYmplY3Q6IEVycm9yLCBzYXZlUXVldWluZzogYW55KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5pbm5lckVycm9yID0gZXJyT2JqZWN0O1xyXG4gICAgdGhpcy5tZXNzYWdlID0gXCJRdWV1ZWQgc2F2ZSBmYWlsZWQ6IFwiICsgZXJyT2JqZWN0Lm1lc3NhZ2U7XHJcbiAgICB0aGlzLmZhaWxlZFNhdmVNZW1vID0gc2F2ZVF1ZXVpbmcuYWN0aXZlU2F2ZU1lbW87XHJcbiAgICB0aGlzLm5leHRTYXZlTWVtbyA9IHNhdmVRdWV1aW5nLm5leHRTYXZlTWVtbztcclxuICB9XHJcbn1cclxuXHJcbi8vLy8vLy8vLy8gU2F2ZU1lbW8gLy8vLy8vLy8vLy8vLy8vL1xyXG4vLyBTYXZlTWVtbyBpcyBhIHJlY29yZCBvZiBjaGFuZ2VzIGZvciBhIHF1ZXVlZCBzYXZlLCBjb25zaXN0aW5nIG9mOlxyXG4vLyAgIGVudGl0eU1lbW9zOiAgIGluZm8gYWJvdXQgZW50aXRpZXMgdGhhdCBhcmUgYmVpbmcgc2F2ZWQgYW5kXHJcbi8vICAgICAgICAgICAgICAgICAgaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgdGhlIHNhdmUgc3RhcnRlZFxyXG4vLyAgIHF1ZXVlZENoYW5nZXM6IGVudGl0aWVzIHRoYXQgYXJlIHF1ZXVlZCBmb3Igc2F2ZSBidXRcclxuLy8gICAgICAgICAgICAgICAgICBhcmUgbm90IGN1cnJlbnRseSBiZWluZyBzYXZlZFxyXG5jbGFzcyBTYXZlTWVtbyB7XHJcbiAgZW50aXR5TWVtb3M6IHsgW2tleTogc3RyaW5nXTogRW50aXR5TWVtbyB9O1xyXG4gIHF1ZXVlZENoYW5nZXM6IEVudGl0eVtdO1xyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5lbnRpdHlNZW1vcyA9IHt9O1xyXG4gICAgdGhpcy5xdWV1ZWRDaGFuZ2VzID0gW107XHJcbiAgfVxyXG5cclxuICBhcHBseVRvU2F2ZWRFbnRpdGllcyhlbnRpdHlNYW5hZ2VyOiBFbnRpdHlNYW5hZ2VyLCBzYXZlZEVudGl0aWVzOiBFbnRpdHlbXSkge1xyXG4gICAgbGV0IGVudGl0eU1lbW9zID0gdGhpcy5lbnRpdHlNZW1vczsgLy8gYHRoaXNgIGlzIGEgU2F2ZU1lbW9cclxuICAgIGxldCBxdWV1ZWRDaGFuZ2VzID0gdGhpcy5xdWV1ZWRDaGFuZ2VzO1xyXG4gICAgbGV0IHJlc3RvcmVQdWJsaXNoaW5nID0gdGhpcy5kaXNhYmxlTWFuYWdlclB1Ymxpc2hpbmcoZW50aXR5TWFuYWdlcik7XHJcbiAgICB0cnkge1xyXG4gICAgICBzYXZlZEVudGl0aWVzLmZvckVhY2goc2F2ZWQgPT4ge1xyXG4gICAgICAgIGxldCBrZXkgPSB0aGlzLm1ha2VFbnRpdHlNZW1vS2V5KHNhdmVkKTtcclxuICAgICAgICBsZXQgZW50aXR5TWVtbyA9IGVudGl0eU1lbW9zW2tleV07XHJcbiAgICAgICAgbGV0IHJlc2F2ZSA9IGVudGl0eU1lbW8gJiYgZW50aXR5TWVtby5hcHBseVRvU2F2ZWRFbnRpdHkoc2F2ZWQpO1xyXG4gICAgICAgIGlmIChyZXNhdmUpIHtcclxuICAgICAgICAgIHF1ZXVlZENoYW5nZXMucHVzaChzYXZlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHJlc3RvcmVQdWJsaXNoaW5nKCk7XHJcbiAgICAgIC8vIEQjMjY1MSBoYXNDaGFuZ2VzIHdpbGwgYmUgd3JvbmcgaWYgY2hhbmdlcyBtYWRlIHdoaWxlIHNhdmUgaW4gcHJvZ3Jlc3NcclxuICAgICAgbGV0IGhhc0NoYW5nZXMgPSBxdWV1ZWRDaGFuZ2VzLmxlbmd0aCA+IDA7XHJcbiAgICAgIC8vIE11c3QgdXNlIGJyZWV6ZSBpbnRlcm5hbCBtZXRob2QgdG8gcHJvcGVybHkgc2V0IHRoaXMgZmxhZyB0cnVlXHJcbiAgICAgIGlmIChoYXNDaGFuZ2VzKSB7IGVudGl0eU1hbmFnZXIuX3NldEhhc0NoYW5nZXModHJ1ZSk7IH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGlzYWJsZU1hbmFnZXJQdWJsaXNoaW5nKG1hbmFnZXI6IEVudGl0eU1hbmFnZXIpIHtcclxuICAgIGxldCBFdmVudCA9IGJyZWV6ZS5FdmVudDtcclxuICAgIEV2ZW50LmVuYWJsZSgnZW50aXR5Q2hhbmdlZCcsIG1hbmFnZXIsIGZhbHNlKTtcclxuICAgIEV2ZW50LmVuYWJsZSgnaGFzQ2hhbmdlc0NoYW5nZWQnLCBtYW5hZ2VyLCBmYWxzZSk7XHJcblxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlc3RvcmVQdWJsaXNoaW5nKCkge1xyXG4gICAgICBFdmVudC5lbmFibGUoJ2VudGl0eUNoYW5nZWQnLCBtYW5hZ2VyLCB0cnVlKTtcclxuICAgICAgRXZlbnQuZW5hYmxlKCdoYXNDaGFuZ2VzQ2hhbmdlZCcsIG1hbmFnZXIsIHRydWUpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHBrRml4dXAoa2V5TWFwcGluZ3M6IEtleU1hcHBpbmdbXSkge1xyXG4gICAgbGV0IGVudGl0eU1lbW9zID0gdGhpcy5lbnRpdHlNZW1vczsgIC8vIGB0aGlzYCBpcyBhIFNhdmVNZW1vXHJcbiAgICBrZXlNYXBwaW5ncy5mb3JFYWNoKGttID0+IHtcclxuICAgICAgbGV0IHR5cGUgPSBrbS5lbnRpdHlUeXBlTmFtZTtcclxuICAgICAgbGV0IHRlbXBLZXkgPSB0eXBlICsgJ3wnICsga20udGVtcFZhbHVlO1xyXG4gICAgICBpZiAoZW50aXR5TWVtb3NbdGVtcEtleV0pIHtcclxuICAgICAgICBlbnRpdHlNZW1vc1t0eXBlICsgJ3wnICsga20ucmVhbFZhbHVlXSA9IGVudGl0eU1lbW9zW3RlbXBLZXldO1xyXG4gICAgICAgIGRlbGV0ZSBlbnRpdHlNZW1vc1t0ZW1wS2V5XTtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBtZW1vS2V5IGluIGVudGl0eU1lbW9zKSB7XHJcbiAgICAgICAgZW50aXR5TWVtb3NbbWVtb0tleV0uZmtGaXh1cChrbSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbWFrZUVudGl0eU1lbW9LZXkoZW50aXR5OiBFbnRpdHkpIHtcclxuICAgIGxldCBlbnRpdHlLZXkgPSBlbnRpdHkuZW50aXR5QXNwZWN0LmdldEtleSgpO1xyXG4gICAgcmV0dXJuIGVudGl0eUtleS5lbnRpdHlUeXBlLm5hbWUgKyAnfCcgKyBlbnRpdHlLZXkudmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlRW50aXR5TWVtb3MoY2hhbmdlczogRW50aXR5W10pIHtcclxuICAgIGxldCBlbnRpdHlNZW1vcyA9IHRoaXMuZW50aXR5TWVtb3M7ICAvLyBgdGhpc2AgaXMgYSBTYXZlTWVtb1xyXG4gICAgY2hhbmdlcy5mb3JFYWNoKGNoYW5nZSA9PiB7XHJcbiAgICAgIC8vIG9ubHkgdXBkYXRlIGVudGl0eU1lbW8gZm9yIGVudGl0eSBiZWluZyBzYXZlXHJcbiAgICAgIGlmICghY2hhbmdlLmVudGl0eUFzcGVjdC5pc0JlaW5nU2F2ZWQpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICBsZXQga2V5ID0gdGhpcy5tYWtlRW50aXR5TWVtb0tleShjaGFuZ2UpO1xyXG4gICAgICBsZXQgZW50aXR5TWVtbyA9IGVudGl0eU1lbW9zW2tleV0gfHwgKGVudGl0eU1lbW9zW2tleV0gPSBuZXcgRW50aXR5TWVtbyhjaGFuZ2UpKTtcclxuICAgICAgZW50aXR5TWVtby51cGRhdGUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG5cclxuLy8vLy8vLy8vIEVudGl0eU1lbW8gVHlwZSAvLy8vLy8vLy8vLy8vLy9cclxuLy8gSW5mb3JtYXRpb24gYWJvdXQgYW4gZW50aXR5IHRoYXQgaXMgYmVpbmcgc2F2ZWRcclxuLy8gYW5kIHdoaWNoIGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgdGhhdCBzYXZlIHN0YXJ0ZWRcclxuY2xhc3MgRW50aXR5TWVtbyB7XHJcbiAgZW50aXR5OiBFbnRpdHk7XHJcbiAgcGVuZGluZ0NoYW5nZXM6IGFueTtcclxuICBpc0RlbGV0ZWQ6IGJvb2xlYW47XHJcbiAgY29uc3RydWN0b3IoZW50aXR5OiBFbnRpdHkpIHtcclxuICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xyXG4gICAgdGhpcy5wZW5kaW5nQ2hhbmdlcyA9IHt9O1xyXG4gIH1cclxuXHJcblxyXG4gIGFwcGx5VG9TYXZlZEVudGl0eShzYXZlZDogRW50aXR5KSB7XHJcbiAgICBsZXQgZW50aXR5TWVtbyA9IHRoaXM7XHJcbiAgICBsZXQgYXNwZWN0ID0gc2F2ZWQuZW50aXR5QXNwZWN0O1xyXG4gICAgaWYgKGFzcGVjdC5lbnRpdHlTdGF0ZS5pc0RldGFjaGVkKCkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmIChlbnRpdHlNZW1vLmlzRGVsZXRlZCkge1xyXG4gICAgICBhc3BlY3Quc2V0RGVsZXRlZCgpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vIHRyZWF0IGVudGl0eSB3aXRoIHBlbmRpbmcgY2hhbmdlcyBhcyBtb2RpZmllZFxyXG4gICAgbGV0IHByb3BzID0gT2JqZWN0LmtleXMoZW50aXR5TWVtby5wZW5kaW5nQ2hhbmdlcyk7XHJcbiAgICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGxldCBvcmlnaW5hbFZhbHVlcyA9IGFzcGVjdC5vcmlnaW5hbFZhbHVlcztcclxuICAgIHByb3BzLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgIG9yaWdpbmFsVmFsdWVzW25hbWVdID0gc2F2ZWQuZ2V0UHJvcGVydHkobmFtZSk7XHJcbiAgICAgIHNhdmVkLnNldFByb3BlcnR5KG5hbWUsIGVudGl0eU1lbW8ucGVuZGluZ0NoYW5nZXNbbmFtZV0pO1xyXG4gICAgfSk7XHJcbiAgICBhc3BlY3Quc2V0TW9kaWZpZWQoKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZmtGaXh1cChrZXlNYXBwaW5nOiBLZXlNYXBwaW5nKSB7XHJcbiAgICBsZXQgZW50aXR5TWVtbyA9IHRoaXM7XHJcbiAgICBsZXQgdHlwZSA9IGVudGl0eU1lbW8uZW50aXR5LmVudGl0eVR5cGU7XHJcbiAgICBsZXQgZmtQcm9wcyA9IHR5cGUuZm9yZWlnbktleVByb3BlcnRpZXM7XHJcbiAgICBma1Byb3BzLmZvckVhY2goZmtQcm9wID0+IHtcclxuICAgICAgaWYgKGZrUHJvcC5wYXJlbnRUeXBlLm5hbWUgPT09IGtleU1hcHBpbmcuZW50aXR5VHlwZU5hbWUgJiZcclxuICAgICAgICBlbnRpdHlNZW1vLnBlbmRpbmdDaGFuZ2VzW2ZrUHJvcC5uYW1lXSA9PT0ga2V5TWFwcGluZy50ZW1wVmFsdWUpIHtcclxuICAgICAgICBlbnRpdHlNZW1vLnBlbmRpbmdDaGFuZ2VzW2ZrUHJvcC5uYW1lXSA9IGtleU1hcHBpbmcucmVhbFZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIHVwZGF0ZSB0aGUgZW50aXR5TWVtbyBvZiBjaGFuZ2VzIHRvIGFuIGVudGl0eSBiZWluZyBzYXZlZFxyXG4gIC8vIHNvIHRoYXQgd2Uga25vdyBob3cgdG8gc2F2ZSBpdCBhZ2FpbiBsYXRlclxyXG4gIHVwZGF0ZSgpIHtcclxuICAgIGxldCBlbnRpdHlNZW1vID0gdGhpcztcclxuICAgIGxldCBwcm9wcztcclxuICAgIGxldCBlbnRpdHkgPSBlbnRpdHlNZW1vLmVudGl0eTtcclxuICAgIGxldCBhc3BlY3QgPSBlbnRpdHkuZW50aXR5QXNwZWN0O1xyXG4gICAgbGV0IHN0YXRlTmFtZSA9IGFzcGVjdC5lbnRpdHlTdGF0ZS5uYW1lO1xyXG4gICAgc3dpdGNoIChzdGF0ZU5hbWUpIHtcclxuICAgICAgY2FzZSAnQWRkZWQnOlxyXG4gICAgICAgIGxldCBvcmlnaW5hbFZhbHVlcyA9IGFzcGVjdC5vcmlnaW5hbFZhbHVlcztcclxuICAgICAgICBwcm9wcyA9IGVudGl0eS5lbnRpdHlUeXBlLmRhdGFQcm9wZXJ0aWVzO1xyXG4gICAgICAgIHByb3BzLmZvckVhY2goZHAgPT4ge1xyXG4gICAgICAgICAgaWYgKGRwLmlzUGFydE9mS2V5KSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgbGV0IG5hbWUgPSBkcC5uYW1lO1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0gZW50aXR5LmdldFByb3BlcnR5KG5hbWUpO1xyXG4gICAgICAgICAgaWYgKG9yaWdpbmFsVmFsdWVzW25hbWVdICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICBlbnRpdHlNZW1vLnBlbmRpbmdDaGFuZ2VzW25hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdEZWxldGVkJzpcclxuICAgICAgICBlbnRpdHlNZW1vLmlzRGVsZXRlZCA9IHRydWU7XHJcbiAgICAgICAgZW50aXR5TWVtby5wZW5kaW5nQ2hhbmdlcyA9IHt9O1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnTW9kaWZpZWQnOlxyXG4gICAgICAgIHByb3BzID0gT2JqZWN0LmtleXMoYXNwZWN0Lm9yaWdpbmFsVmFsdWVzKTtcclxuICAgICAgICBwcm9wcy5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgICAgICAgZW50aXR5TWVtby5wZW5kaW5nQ2hhbmdlc1tuYW1lXSA9IGVudGl0eS5nZXRQcm9wZXJ0eShuYW1lKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19