breeze-client 2.2.0 → 2.2.1-cjs

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 (377) hide show
  1. package/adapter-ajax-angularjs/{index.d.ts → breeze-client-adapter-ajax-angularjs.d.ts} +0 -1
  2. package/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.metadata.json +1 -0
  3. package/adapter-ajax-angularjs/package.json +13 -0
  4. package/adapter-ajax-fetch/{index.d.ts → breeze-client-adapter-ajax-fetch.d.ts} +0 -1
  5. package/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.metadata.json +1 -0
  6. package/adapter-ajax-fetch/package.json +13 -0
  7. package/adapter-ajax-httpclient/{index.d.ts → breeze-client-adapter-ajax-httpclient.d.ts} +0 -1
  8. package/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.metadata.json +1 -0
  9. package/adapter-ajax-httpclient/package.json +13 -0
  10. package/adapter-ajax-jquery/{index.d.ts → breeze-client-adapter-ajax-jquery.d.ts} +0 -1
  11. package/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.metadata.json +1 -0
  12. package/adapter-ajax-jquery/package.json +13 -0
  13. package/adapter-ajax-post/{index.d.ts → breeze-client-adapter-ajax-post.d.ts} +0 -1
  14. package/adapter-ajax-post/breeze-client-adapter-ajax-post.metadata.json +1 -0
  15. package/adapter-ajax-post/package.json +13 -0
  16. package/adapter-data-service-odata/{index.d.ts → breeze-client-adapter-data-service-odata.d.ts} +0 -1
  17. package/adapter-data-service-odata/breeze-client-adapter-data-service-odata.metadata.json +1 -0
  18. package/adapter-data-service-odata/package.json +13 -0
  19. package/adapter-data-service-webapi/{index.d.ts → breeze-client-adapter-data-service-webapi.d.ts} +0 -1
  20. package/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.metadata.json +1 -0
  21. package/adapter-data-service-webapi/package.json +13 -0
  22. package/adapter-model-library-backing-store/{index.d.ts → breeze-client-adapter-model-library-backing-store.d.ts} +0 -1
  23. package/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.metadata.json +1 -0
  24. package/adapter-model-library-backing-store/package.json +13 -0
  25. package/adapter-model-library-ko/{index.d.ts → breeze-client-adapter-model-library-ko.d.ts} +0 -1
  26. package/adapter-model-library-ko/breeze-client-adapter-model-library-ko.metadata.json +1 -0
  27. package/adapter-model-library-ko/package.json +13 -0
  28. package/adapter-uri-builder-json/{index.d.ts → breeze-client-adapter-uri-builder-json.d.ts} +0 -1
  29. package/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.metadata.json +1 -0
  30. package/adapter-uri-builder-json/package.json +13 -0
  31. package/adapter-uri-builder-odata/{index.d.ts → breeze-client-adapter-uri-builder-odata.d.ts} +0 -1
  32. package/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.metadata.json +1 -0
  33. package/adapter-uri-builder-odata/package.json +13 -0
  34. package/breeze-client.d.ts +8 -0
  35. package/breeze-client.metadata.json +1 -0
  36. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js +190 -0
  37. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js.map +1 -0
  38. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js +2 -0
  39. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js.map +1 -0
  40. package/bundles/breeze-client-adapter-ajax-fetch.umd.js +190 -0
  41. package/bundles/breeze-client-adapter-ajax-fetch.umd.js.map +1 -0
  42. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js +2 -0
  43. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js.map +1 -0
  44. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js +195 -0
  45. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js.map +1 -0
  46. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js +2 -0
  47. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js.map +1 -0
  48. package/bundles/breeze-client-adapter-ajax-jquery.umd.js +115 -0
  49. package/bundles/breeze-client-adapter-ajax-jquery.umd.js.map +1 -0
  50. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js +2 -0
  51. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js.map +1 -0
  52. package/bundles/breeze-client-adapter-ajax-post.umd.js +92 -0
  53. package/bundles/breeze-client-adapter-ajax-post.umd.js.map +1 -0
  54. package/bundles/breeze-client-adapter-ajax-post.umd.min.js +2 -0
  55. package/bundles/breeze-client-adapter-ajax-post.umd.min.js.map +1 -0
  56. package/bundles/breeze-client-adapter-data-service-odata.umd.js +747 -0
  57. package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +1 -0
  58. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +16 -0
  59. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +1 -0
  60. package/bundles/breeze-client-adapter-data-service-webapi.umd.js +333 -0
  61. package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +1 -0
  62. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +16 -0
  63. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +1 -0
  64. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js +280 -0
  65. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js.map +1 -0
  66. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js +2 -0
  67. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js.map +1 -0
  68. package/bundles/breeze-client-adapter-model-library-ko.umd.js +252 -0
  69. package/bundles/breeze-client-adapter-model-library-ko.umd.js.map +1 -0
  70. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js +2 -0
  71. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js.map +1 -0
  72. package/bundles/breeze-client-adapter-uri-builder-json.umd.js +96 -0
  73. package/bundles/breeze-client-adapter-uri-builder-json.umd.js.map +1 -0
  74. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js +2 -0
  75. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js.map +1 -0
  76. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js +262 -0
  77. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js.map +1 -0
  78. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js +2 -0
  79. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js.map +1 -0
  80. package/bundles/breeze-client-mixin-get-entity-graph.umd.js +258 -0
  81. package/bundles/breeze-client-mixin-get-entity-graph.umd.js.map +1 -0
  82. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js +2 -0
  83. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js.map +1 -0
  84. package/bundles/breeze-client-mixin-save-queuing.umd.js +579 -0
  85. package/bundles/breeze-client-mixin-save-queuing.umd.js.map +1 -0
  86. package/bundles/breeze-client-mixin-save-queuing.umd.min.js +16 -0
  87. package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +1 -0
  88. package/bundles/breeze-client.umd.js +14234 -0
  89. package/bundles/breeze-client.umd.js.map +1 -0
  90. package/bundles/breeze-client.umd.min.js +16 -0
  91. package/bundles/breeze-client.umd.min.js.map +1 -0
  92. package/esm2015/adapter-ajax-angularjs/adapter-ajax-angularjs.js +130 -0
  93. package/esm2015/adapter-ajax-angularjs/adapter-core.js +49 -0
  94. package/esm2015/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +5 -0
  95. package/esm2015/adapter-ajax-fetch/adapter-ajax-fetch.js +130 -0
  96. package/esm2015/adapter-ajax-fetch/adapter-core.js +49 -0
  97. package/esm2015/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +5 -0
  98. package/esm2015/adapter-ajax-httpclient/adapter-ajax-httpclient.js +137 -0
  99. package/esm2015/adapter-ajax-httpclient/adapter-core.js +49 -0
  100. package/esm2015/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +5 -0
  101. package/esm2015/adapter-ajax-jquery/adapter-ajax-jquery.js +103 -0
  102. package/esm2015/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +5 -0
  103. package/esm2015/adapter-ajax-post/adapter-ajax-post.js +77 -0
  104. package/esm2015/adapter-ajax-post/breeze-client-adapter-ajax-post.js +5 -0
  105. package/esm2015/adapter-data-service-odata/adapter-core.js +49 -0
  106. package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +463 -0
  107. package/esm2015/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +5 -0
  108. package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +100 -0
  109. package/esm2015/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +5 -0
  110. package/esm2015/adapter-model-library-backing-store/adapter-model-library-backing-store.js +268 -0
  111. package/esm2015/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +5 -0
  112. package/esm2015/adapter-model-library-ko/adapter-model-library-ko.js +240 -0
  113. package/esm2015/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +5 -0
  114. package/esm2015/adapter-uri-builder-json/adapter-core.js +49 -0
  115. package/esm2015/adapter-uri-builder-json/adapter-uri-builder-json.js +36 -0
  116. package/esm2015/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +5 -0
  117. package/esm2015/adapter-uri-builder-odata/adapter-core.js +49 -0
  118. package/esm2015/adapter-uri-builder-odata/adapter-uri-builder-odata.js +192 -0
  119. package/esm2015/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +5 -0
  120. package/esm2015/breeze-client.js +9 -0
  121. package/esm2015/index.js +2 -0
  122. package/esm2015/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +5 -0
  123. package/esm2015/mixin-get-entity-graph/mixin-get-entity-graph.js +269 -0
  124. package/esm2015/mixin-save-queuing/breeze-client-mixin-save-queuing.js +5 -0
  125. package/esm2015/mixin-save-queuing/mixin-save-queuing.js +400 -0
  126. package/esm2015/src/abstract-data-service-adapter.js +327 -0
  127. package/esm2015/src/array.js +4 -0
  128. package/esm2015/src/assert-param.js +312 -0
  129. package/esm2015/src/breeze.js +85 -0
  130. package/esm2015/src/complex-array.js +119 -0
  131. package/esm2015/src/config.js +223 -0
  132. package/esm2015/src/core.js +714 -0
  133. package/esm2015/src/csdl-metadata-parser.js +385 -0
  134. package/esm2015/src/data-service.js +203 -0
  135. package/esm2015/src/data-type.js +506 -0
  136. package/esm2015/src/default-property-interceptor.js +460 -0
  137. package/{esm2022/src/entity-action.mjs → esm2015/src/entity-action.js} +25 -25
  138. package/esm2015/src/entity-aspect.js +804 -0
  139. package/esm2015/src/entity-group.js +187 -0
  140. package/esm2015/src/entity-key.js +116 -0
  141. package/esm2015/src/entity-manager.js +2094 -0
  142. package/esm2015/src/entity-metadata.js +2109 -0
  143. package/esm2015/src/entity-query.js +1015 -0
  144. package/esm2015/src/entity-state.js +107 -0
  145. package/esm2015/src/enum.js +141 -0
  146. package/esm2015/src/event.js +256 -0
  147. package/esm2015/src/interface-registry.js +41 -0
  148. package/esm2015/src/key-generator.js +108 -0
  149. package/esm2015/src/local-query-comparison-options.js +65 -0
  150. package/esm2015/src/mapping-context.js +411 -0
  151. package/esm2015/src/naming-convention.js +88 -0
  152. package/esm2015/src/observable-array.js +185 -0
  153. package/esm2015/src/predicate.js +1242 -0
  154. package/esm2015/src/primitive-array.js +87 -0
  155. package/esm2015/src/query-options.js +152 -0
  156. package/esm2015/src/relation-array.js +175 -0
  157. package/esm2015/src/save-options.js +41 -0
  158. package/esm2015/src/unattached-children-map.js +58 -0
  159. package/esm2015/src/validate.js +991 -0
  160. package/esm2015/src/validation-options.js +64 -0
  161. package/esm5/adapter-ajax-angularjs/adapter-ajax-angularjs.js +132 -0
  162. package/esm5/adapter-ajax-angularjs/adapter-core.js +49 -0
  163. package/esm5/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +5 -0
  164. package/esm5/adapter-ajax-fetch/adapter-ajax-fetch.js +132 -0
  165. package/esm5/adapter-ajax-fetch/adapter-core.js +49 -0
  166. package/esm5/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +5 -0
  167. package/esm5/adapter-ajax-httpclient/adapter-ajax-httpclient.js +139 -0
  168. package/esm5/adapter-ajax-httpclient/adapter-core.js +49 -0
  169. package/esm5/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +5 -0
  170. package/esm5/adapter-ajax-jquery/adapter-ajax-jquery.js +105 -0
  171. package/esm5/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +5 -0
  172. package/esm5/adapter-ajax-post/adapter-ajax-post.js +81 -0
  173. package/esm5/adapter-ajax-post/breeze-client-adapter-ajax-post.js +5 -0
  174. package/esm5/adapter-data-service-odata/adapter-core.js +49 -0
  175. package/{esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs → esm5/adapter-data-service-odata/adapter-data-service-odata.js} +147 -138
  176. package/esm5/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +5 -0
  177. package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +105 -0
  178. package/esm5/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +5 -0
  179. package/esm5/adapter-model-library-backing-store/adapter-model-library-backing-store.js +270 -0
  180. package/esm5/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +5 -0
  181. package/esm5/adapter-model-library-ko/adapter-model-library-ko.js +242 -0
  182. package/esm5/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +5 -0
  183. package/esm5/adapter-uri-builder-json/adapter-core.js +49 -0
  184. package/esm5/adapter-uri-builder-json/adapter-uri-builder-json.js +38 -0
  185. package/esm5/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +5 -0
  186. package/esm5/adapter-uri-builder-odata/adapter-core.js +49 -0
  187. package/esm5/adapter-uri-builder-odata/adapter-uri-builder-odata.js +197 -0
  188. package/esm5/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +5 -0
  189. package/esm5/breeze-client.js +9 -0
  190. package/esm5/index.js +2 -0
  191. package/esm5/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +5 -0
  192. package/esm5/mixin-get-entity-graph/mixin-get-entity-graph.js +269 -0
  193. package/esm5/mixin-save-queuing/breeze-client-mixin-save-queuing.js +5 -0
  194. package/esm5/mixin-save-queuing/mixin-save-queuing.js +412 -0
  195. package/esm5/src/abstract-data-service-adapter.js +333 -0
  196. package/esm5/src/array.js +4 -0
  197. package/esm5/src/assert-param.js +317 -0
  198. package/esm5/src/breeze.js +85 -0
  199. package/esm5/src/complex-array.js +119 -0
  200. package/esm5/src/config.js +228 -0
  201. package/esm5/src/core.js +722 -0
  202. package/esm5/src/csdl-metadata-parser.js +385 -0
  203. package/esm5/src/data-service.js +207 -0
  204. package/esm5/src/data-type.js +513 -0
  205. package/esm5/src/default-property-interceptor.js +460 -0
  206. package/esm5/src/entity-action.js +52 -0
  207. package/esm5/src/entity-aspect.js +810 -0
  208. package/esm5/src/entity-group.js +189 -0
  209. package/esm5/src/entity-key.js +118 -0
  210. package/esm5/src/entity-manager.js +2112 -0
  211. package/esm5/src/entity-metadata.js +2144 -0
  212. package/esm5/src/entity-query.js +1042 -0
  213. package/esm5/src/entity-state.js +114 -0
  214. package/esm5/src/enum.js +144 -0
  215. package/esm5/src/event.js +259 -0
  216. package/esm5/src/interface-registry.js +43 -0
  217. package/esm5/src/key-generator.js +111 -0
  218. package/esm5/src/local-query-comparison-options.js +67 -0
  219. package/esm5/src/mapping-context.js +413 -0
  220. package/esm5/src/naming-convention.js +90 -0
  221. package/esm5/src/observable-array.js +201 -0
  222. package/esm5/src/predicate.js +1307 -0
  223. package/esm5/src/primitive-array.js +87 -0
  224. package/esm5/src/query-options.js +167 -0
  225. package/esm5/src/relation-array.js +175 -0
  226. package/esm5/src/save-options.js +43 -0
  227. package/esm5/src/unattached-children-map.js +60 -0
  228. package/{esm2022/src/validate.mjs → esm5/src/validate.js} +110 -116
  229. package/esm5/src/validation-options.js +66 -0
  230. package/{fesm2022/breeze-client-adapter-ajax-angularjs.mjs → fesm2015/breeze-client-adapter-ajax-angularjs.js} +1 -6
  231. package/fesm2015/breeze-client-adapter-ajax-angularjs.js.map +1 -0
  232. package/{fesm2022/breeze-client-adapter-ajax-fetch.mjs → fesm2015/breeze-client-adapter-ajax-fetch.js} +4 -9
  233. package/fesm2015/breeze-client-adapter-ajax-fetch.js.map +1 -0
  234. package/{fesm2022/breeze-client-adapter-ajax-httpclient.mjs → fesm2015/breeze-client-adapter-ajax-httpclient.js} +4 -6
  235. package/fesm2015/breeze-client-adapter-ajax-httpclient.js.map +1 -0
  236. package/{fesm2022/breeze-client-adapter-ajax-jquery.mjs → fesm2015/breeze-client-adapter-ajax-jquery.js} +2 -6
  237. package/fesm2015/breeze-client-adapter-ajax-jquery.js.map +1 -0
  238. package/{fesm2022/breeze-client-adapter-ajax-post.mjs → fesm2015/breeze-client-adapter-ajax-post.js} +1 -1
  239. package/fesm2015/breeze-client-adapter-ajax-post.js.map +1 -0
  240. package/{fesm2022/breeze-client-adapter-data-service-odata.mjs → fesm2015/breeze-client-adapter-data-service-odata.js} +69 -68
  241. package/fesm2015/breeze-client-adapter-data-service-odata.js.map +1 -0
  242. package/{fesm2022/breeze-client-adapter-data-service-webapi.mjs → fesm2015/breeze-client-adapter-data-service-webapi.js} +30 -30
  243. package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +1 -0
  244. package/{fesm2022/breeze-client-adapter-model-library-backing-store.mjs → fesm2015/breeze-client-adapter-model-library-backing-store.js} +13 -14
  245. package/fesm2015/breeze-client-adapter-model-library-backing-store.js.map +1 -0
  246. package/{fesm2022/breeze-client-adapter-model-library-ko.mjs → fesm2015/breeze-client-adapter-model-library-ko.js} +13 -14
  247. package/fesm2015/breeze-client-adapter-model-library-ko.js.map +1 -0
  248. package/{fesm2022/breeze-client-adapter-uri-builder-json.mjs → fesm2015/breeze-client-adapter-uri-builder-json.js} +8 -9
  249. package/fesm2015/breeze-client-adapter-uri-builder-json.js.map +1 -0
  250. package/{fesm2022/breeze-client-adapter-uri-builder-odata.mjs → fesm2015/breeze-client-adapter-uri-builder-odata.js} +86 -86
  251. package/fesm2015/breeze-client-adapter-uri-builder-odata.js.map +1 -0
  252. package/{fesm2022/breeze-client-mixin-get-entity-graph.mjs → fesm2015/breeze-client-mixin-get-entity-graph.js} +1 -1
  253. package/fesm2015/breeze-client-mixin-get-entity-graph.js.map +1 -0
  254. package/{fesm2022/breeze-client-mixin-save-queuing.mjs → fesm2015/breeze-client-mixin-save-queuing.js} +2 -23
  255. package/fesm2015/breeze-client-mixin-save-queuing.js.map +1 -0
  256. package/{fesm2022/breeze-client.mjs → fesm2015/breeze-client.js} +1543 -2042
  257. package/fesm2015/breeze-client.js.map +1 -0
  258. package/fesm5/breeze-client-adapter-ajax-angularjs.js +186 -0
  259. package/fesm5/breeze-client-adapter-ajax-angularjs.js.map +1 -0
  260. package/fesm5/breeze-client-adapter-ajax-fetch.js +186 -0
  261. package/fesm5/breeze-client-adapter-ajax-fetch.js.map +1 -0
  262. package/fesm5/breeze-client-adapter-ajax-httpclient.js +193 -0
  263. package/fesm5/breeze-client-adapter-ajax-httpclient.js.map +1 -0
  264. package/fesm5/breeze-client-adapter-ajax-jquery.js +111 -0
  265. package/fesm5/breeze-client-adapter-ajax-jquery.js.map +1 -0
  266. package/fesm5/breeze-client-adapter-ajax-post.js +86 -0
  267. package/fesm5/breeze-client-adapter-ajax-post.js.map +1 -0
  268. package/fesm5/breeze-client-adapter-data-service-odata.js +523 -0
  269. package/fesm5/breeze-client-adapter-data-service-odata.js.map +1 -0
  270. package/fesm5/breeze-client-adapter-data-service-webapi.js +111 -0
  271. package/fesm5/breeze-client-adapter-data-service-webapi.js.map +1 -0
  272. package/fesm5/breeze-client-adapter-model-library-backing-store.js +276 -0
  273. package/fesm5/breeze-client-adapter-model-library-backing-store.js.map +1 -0
  274. package/fesm5/breeze-client-adapter-model-library-ko.js +248 -0
  275. package/fesm5/breeze-client-adapter-model-library-ko.js.map +1 -0
  276. package/fesm5/breeze-client-adapter-uri-builder-json.js +92 -0
  277. package/fesm5/breeze-client-adapter-uri-builder-json.js.map +1 -0
  278. package/fesm5/breeze-client-adapter-uri-builder-odata.js +250 -0
  279. package/fesm5/breeze-client-adapter-uri-builder-odata.js.map +1 -0
  280. package/fesm5/breeze-client-mixin-get-entity-graph.js +254 -0
  281. package/fesm5/breeze-client-mixin-get-entity-graph.js.map +1 -0
  282. package/fesm5/breeze-client-mixin-save-queuing.js +356 -0
  283. package/fesm5/breeze-client-mixin-save-queuing.js.map +1 -0
  284. package/fesm5/breeze-client.js +13956 -0
  285. package/fesm5/breeze-client.js.map +1 -0
  286. package/mixin-get-entity-graph/{index.d.ts → breeze-client-mixin-get-entity-graph.d.ts} +0 -1
  287. package/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.metadata.json +1 -0
  288. package/mixin-get-entity-graph/package.json +13 -0
  289. package/mixin-save-queuing/{index.d.ts → breeze-client-mixin-save-queuing.d.ts} +0 -1
  290. package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +1 -0
  291. package/mixin-save-queuing/package.json +13 -0
  292. package/package.json +12 -94
  293. package/src/config.d.ts +1 -1
  294. package/src/core.d.ts +1 -1
  295. package/src/entity-aspect.d.ts +1 -1
  296. package/src/entity-metadata.d.ts +6 -8
  297. package/src/entity-query.d.ts +1 -1
  298. package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +0 -135
  299. package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +0 -49
  300. package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +0 -5
  301. package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +0 -135
  302. package/esm2022/adapter-ajax-fetch/adapter-core.mjs +0 -49
  303. package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +0 -5
  304. package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +0 -139
  305. package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +0 -49
  306. package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +0 -5
  307. package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +0 -107
  308. package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +0 -5
  309. package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +0 -77
  310. package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +0 -5
  311. package/esm2022/adapter-data-service-odata/adapter-core.mjs +0 -49
  312. package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +0 -5
  313. package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +0 -100
  314. package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +0 -5
  315. package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +0 -269
  316. package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +0 -5
  317. package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +0 -241
  318. package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +0 -5
  319. package/esm2022/adapter-uri-builder-json/adapter-core.mjs +0 -49
  320. package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +0 -37
  321. package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +0 -5
  322. package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +0 -49
  323. package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +0 -191
  324. package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +0 -5
  325. package/esm2022/breeze-client.mjs +0 -5
  326. package/esm2022/index.mjs +0 -2
  327. package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +0 -5
  328. package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +0 -269
  329. package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +0 -5
  330. package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +0 -421
  331. package/esm2022/src/abstract-data-service-adapter.mjs +0 -325
  332. package/esm2022/src/array.mjs +0 -4
  333. package/esm2022/src/assert-param.mjs +0 -330
  334. package/esm2022/src/breeze.mjs +0 -85
  335. package/esm2022/src/complex-array.mjs +0 -117
  336. package/esm2022/src/config.mjs +0 -232
  337. package/esm2022/src/core.mjs +0 -712
  338. package/esm2022/src/csdl-metadata-parser.mjs +0 -385
  339. package/esm2022/src/data-service.mjs +0 -239
  340. package/esm2022/src/data-type.mjs +0 -510
  341. package/esm2022/src/default-property-interceptor.mjs +0 -460
  342. package/esm2022/src/entity-aspect.mjs +0 -897
  343. package/esm2022/src/entity-group.mjs +0 -192
  344. package/esm2022/src/entity-key.mjs +0 -127
  345. package/esm2022/src/entity-manager.mjs +0 -2183
  346. package/esm2022/src/entity-metadata.mjs +0 -2242
  347. package/esm2022/src/entity-query.mjs +0 -1024
  348. package/esm2022/src/entity-state.mjs +0 -107
  349. package/esm2022/src/enum.mjs +0 -143
  350. package/esm2022/src/event.mjs +0 -264
  351. package/esm2022/src/interface-registry.mjs +0 -39
  352. package/esm2022/src/key-generator.mjs +0 -110
  353. package/esm2022/src/local-query-comparison-options.mjs +0 -75
  354. package/esm2022/src/mapping-context.mjs +0 -422
  355. package/esm2022/src/naming-convention.mjs +0 -96
  356. package/esm2022/src/observable-array.mjs +0 -183
  357. package/esm2022/src/predicate.mjs +0 -1259
  358. package/esm2022/src/primitive-array.mjs +0 -85
  359. package/esm2022/src/query-options.mjs +0 -160
  360. package/esm2022/src/relation-array.mjs +0 -173
  361. package/esm2022/src/save-options.mjs +0 -51
  362. package/esm2022/src/unattached-children-map.mjs +0 -56
  363. package/esm2022/src/validation-options.mjs +0 -78
  364. package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +0 -1
  365. package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +0 -1
  366. package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +0 -1
  367. package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +0 -1
  368. package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +0 -1
  369. package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +0 -1
  370. package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
  371. package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +0 -1
  372. package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +0 -1
  373. package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +0 -1
  374. package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +0 -1
  375. package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +0 -1
  376. package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +0 -1
  377. package/fesm2022/breeze-client.mjs.map +0 -1
@@ -0,0 +1,207 @@
1
+ import { assertConfig } from './assert-param';
2
+ import { config } from './config';
3
+ import { core } from './core';
4
+ /**
5
+ A DataService instance is used to encapsulate the details of a single 'service'; this includes a serviceName, a dataService adapterInstance,
6
+ and whether the service has server side metadata.
7
+
8
+ You can construct an EntityManager with either a serviceName or a DataService instance, if you use a serviceName then a DataService
9
+ is constructed for you. (It can also be set via the EntityManager.setProperties method).
10
+
11
+ The same applies to the MetadataStore.fetchMetadata method, i.e. it takes either a serviceName or a DataService instance.
12
+
13
+ Each metadataStore contains a list of DataServices, each accessible via its ‘serviceName’.
14
+ ( see MetadataStore.getDataService and MetadataStore.addDataService). The ‘addDataService’ method is called internally
15
+ anytime a MetadataStore.fetchMetadata call occurs with a new dataService ( or service name).
16
+
17
+ **/
18
+ var DataService = /** @class */ (function () {
19
+ /** DataService constructor
20
+ > var dataService = new DataService({
21
+ > serviceName: altServiceName,
22
+ > hasServerMetadata: false
23
+ > });
24
+
25
+ > var metadataStore = new MetadataStore({
26
+ > namingConvention: NamingConvention.camelCase
27
+ > });
28
+
29
+ > return new EntityManager({
30
+ > dataService: dataService,
31
+ > metadataStore: metadataStore
32
+ > });
33
+ @param config - A configuration object.
34
+ **/
35
+ function DataService(config) {
36
+ updateWithConfig(this, config);
37
+ }
38
+ /**
39
+ Returns a copy of this DataService with the specified properties applied.
40
+ @param config - The configuration object to apply to create a new DataService.
41
+ **/
42
+ DataService.prototype.using = function (config) {
43
+ if (!config)
44
+ return this;
45
+ var result = new DataService(this);
46
+ return updateWithConfig(result, config);
47
+ };
48
+ DataService.resolve = function (dataServices) {
49
+ // final defaults
50
+ // Deliberate use of 'as any' below.
51
+ dataServices.push({
52
+ hasServerMetadata: true,
53
+ useJsonp: false
54
+ });
55
+ var ds = new DataService(core.resolveProperties(dataServices, ["serviceName", "adapterName", "uriBuilderName", "hasServerMetadata", "jsonResultsAdapter", "useJsonp"]));
56
+ if (!ds.serviceName) {
57
+ throw new Error("Unable to resolve a 'serviceName' for this dataService");
58
+ }
59
+ ds.adapterInstance = ds.adapterInstance || config.getAdapterInstance("dataService", ds.adapterName);
60
+ ds.jsonResultsAdapter = ds.jsonResultsAdapter || ds.adapterInstance.jsonResultsAdapter;
61
+ ds.uriBuilder = ds.uriBuilder || config.getAdapterInstance("uriBuilder", ds.uriBuilderName);
62
+ return ds;
63
+ };
64
+ /** @hidden @internal */
65
+ DataService._normalizeServiceName = function (serviceName) {
66
+ serviceName = serviceName.trim();
67
+ if (serviceName.substr(-1) !== "/") {
68
+ return serviceName + '/';
69
+ }
70
+ else {
71
+ return serviceName;
72
+ }
73
+ };
74
+ /** */
75
+ DataService.prototype.toJSON = function () {
76
+ // don't use default value here - because we want to be able to distinguish undefined props for inheritence purposes.
77
+ return core.toJson(this, {
78
+ serviceName: null,
79
+ adapterName: null,
80
+ uriBuilderName: null,
81
+ hasServerMetadata: null,
82
+ jsonResultsAdapter: function (v) {
83
+ return v && v.name;
84
+ },
85
+ useJsonp: null
86
+ });
87
+ };
88
+ DataService.fromJSON = function (json) {
89
+ json.jsonResultsAdapter = config._fetchObject(JsonResultsAdapter, json.jsonResultsAdapter);
90
+ return new DataService(json);
91
+ };
92
+ /**
93
+ Returns a url for this dataService with the specified suffix. This method handles dataService names either
94
+ with or without trailing '/'s. If the suffix starts with "http" then it will be returned as-is.
95
+ @method qualifyUrl
96
+ @param suffix {String} The resulting url.
97
+ @return {a Url string}
98
+ **/
99
+ DataService.prototype.qualifyUrl = function (suffix) {
100
+ if (suffix && suffix.startsWith("http")) {
101
+ return suffix;
102
+ }
103
+ var url = this.serviceName;
104
+ // remove any trailing "/"
105
+ if (core.stringEndsWith(url, "/")) {
106
+ url = url.substr(0, url.length - 1);
107
+ }
108
+ // ensure that it ends with "/" + suffix
109
+ suffix = "/" + suffix;
110
+ if (!core.stringEndsWith(url, suffix)) {
111
+ url = url + suffix;
112
+ }
113
+ return url;
114
+ };
115
+ return DataService;
116
+ }());
117
+ export { DataService };
118
+ DataService.prototype._$typeName = "DataService";
119
+ function updateWithConfig(obj, dsConfig) {
120
+ if (dsConfig) {
121
+ assertConfig(dsConfig)
122
+ .whereParam("serviceName").isOptional()
123
+ .whereParam("adapterName").isString().isOptional()
124
+ .whereParam("uriBuilderName").isString().isOptional()
125
+ .whereParam("hasServerMetadata").isBoolean().isOptional()
126
+ .whereParam("jsonResultsAdapter").isInstanceOf(JsonResultsAdapter).isOptional()
127
+ .whereParam("useJsonp").isBoolean().isOptional()
128
+ .applyAll(obj);
129
+ obj.serviceName = obj.serviceName && DataService._normalizeServiceName(obj.serviceName);
130
+ obj.adapterInstance = obj.adapterName ? config.getAdapterInstance("dataService", obj.adapterName) : undefined;
131
+ obj.uriBuilder = obj.uriBuilderName ? config.getAdapterInstance("uriBuilder", obj.uriBuilderName) : undefined;
132
+ }
133
+ return obj;
134
+ }
135
+ /**
136
+ A JsonResultsAdapter instance is used to provide custom extraction and parsing logic on the json results returned by any web service.
137
+ This facility makes it possible for breeze to talk to virtually any web service and return objects that will be first class 'breeze' citizens.
138
+ **/
139
+ var JsonResultsAdapter = /** @class */ (function () {
140
+ /**
141
+ JsonResultsAdapter constructor
142
+
143
+ @example
144
+ //
145
+ var jsonResultsAdapter = new JsonResultsAdapter({
146
+ name: "test1e",
147
+ extractResults: function(json) {
148
+ return json.results;
149
+ },
150
+ visitNode: function(node, mappingContext, nodeContext) {
151
+ var entityType = normalizeTypeName(node.$type);
152
+ var propertyName = nodeContext.propertyName;
153
+ var ignore = propertyName && propertyName.substr(0, 1) === "$";
154
+
155
+ return {
156
+ entityType: entityType,
157
+ nodeId: node.$id,
158
+ nodeRefId: node.$ref,
159
+ ignore: ignore,
160
+ passThru: false // default
161
+ };
162
+ }
163
+ });
164
+
165
+ var dataService = new DataService( {
166
+ serviceName: "breeze/foo",
167
+ jsonResultsAdapter: jsonResultsAdapter
168
+ });
169
+
170
+ var entityManager = new EntityManager( {
171
+ dataService: dataService
172
+ });
173
+
174
+ @param config - A configuration object.
175
+
176
+ **/
177
+ function JsonResultsAdapter(jsConfig) {
178
+ if (arguments.length !== 1) {
179
+ throw new Error("The JsonResultsAdapter ctor should be called with a single argument that is a configuration object.");
180
+ }
181
+ assertConfig(jsConfig)
182
+ .whereParam("name").isNonEmptyString()
183
+ .whereParam("extractResults").isFunction().isOptional().withDefault(extractResultsDefault)
184
+ .whereParam("extractSaveResults").isFunction().isOptional().withDefault(extractSaveResultsDefault)
185
+ .whereParam("extractKeyMappings").isFunction().isOptional().withDefault(extractKeyMappingsDefault)
186
+ .whereParam("extractDeletedKeys").isFunction().isOptional().withDefault(extractDeletedKeysDefault)
187
+ .whereParam("visitNode").isFunction()
188
+ .applyAll(this);
189
+ config._storeObject(this, "JsonResultsAdapter", this.name);
190
+ }
191
+ return JsonResultsAdapter;
192
+ }());
193
+ export { JsonResultsAdapter };
194
+ JsonResultsAdapter.prototype._$typeName = "JsonResultsAdapter";
195
+ function extractResultsDefault(data) {
196
+ return data.results;
197
+ }
198
+ function extractSaveResultsDefault(data) {
199
+ return data.entities || data.Entities || [];
200
+ }
201
+ function extractKeyMappingsDefault(data) {
202
+ return data.keyMappings || data.KeyMappings || [];
203
+ }
204
+ function extractDeletedKeysDefault(data) {
205
+ return data.deletedKeys || data.DeletedKeys || [];
206
+ }
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYnJlZXplLWNsaWVudC8iLCJzb3VyY2VzIjpbInNyYy9kYXRhLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQWlCOUI7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNIO0lBb0JFOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNILHFCQUFZLE1BQTBCO1FBQ3BDLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBR0Q7OztPQUdHO0lBQ0gsMkJBQUssR0FBTCxVQUFNLE1BQXlCO1FBQzdCLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDekIsSUFBSSxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVNLG1CQUFPLEdBQWQsVUFBZSxZQUEyQjtRQUN4QyxpQkFBaUI7UUFDakIsb0NBQW9DO1FBQ25DLFlBQW9CLENBQUMsSUFBSSxDQUFDO1lBQ3pCLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxFQUFFLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFDeEQsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRTtZ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LE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztBQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5VHlwZSwgTmF2aWdhdGlvblByb3BlcnR5IH0gZnJvbSAnLi9lbnRpdHktbWV0YWRhdGEnO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZUFkYXB0ZXIsIFVyaUJ1aWxkZXJBZGFwdGVyIH0gZnJvbSAnLi9pbnRlcmZhY2UtcmVnaXN0cnknO1xyXG5pbXBvcnQgeyBLZXlNYXBwaW5nIH0gZnJvbSAnLi9lbnRpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IE1hcHBpbmdDb250ZXh0IH0gZnJvbSAnLi9tYXBwaW5nLWNvbnRleHQnO1xyXG5pbXBvcnQgeyBhc3NlcnRDb25maWcgfSBmcm9tICcuL2Fzc2VydC1wYXJhbSc7XHJcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcclxuaW1wb3J0IHsgY29yZSB9IGZyb20gJy4vY29yZSc7XHJcblxyXG4vKiogQ29uZmlndXJhdGlvbiBpbmZvIHRvIGJlIHBhc3NlZCB0byB0aGUgW1tEYXRhU2VydmljZV1dIGNvbnN0cnVjdG9yICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVNlcnZpY2VDb25maWcge1xyXG4gIC8qKiBUaGUgc2VydmljZU5hbWUgZm9yIHRoaXMgRGF0YVNlcnZpY2UuICAqKi9cclxuICBzZXJ2aWNlTmFtZT86IHN0cmluZztcclxuICAvKiogVGhlIGFkYXB0ZXIgbmFtZSBmb3IgdGhlIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dIHRvIGJlIHVzZWQgd2l0aCB0aGlzIHNlcnZpY2UuICAqKi9cclxuICBhZGFwdGVyTmFtZT86IHN0cmluZztcclxuICAvKiogVGhlIGFkYXB0ZXIgbmFtZSBmb3IgdGhlIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0gdG8gYmUgdXNlZCB3aXRoIHRoaXMgc2VydmljZS4gICoqL1xyXG4gIHVyaUJ1aWxkZXJOYW1lPzogc3RyaW5nO1xyXG4gIC8qKiBXaGV0aGVyIHRoZSBzZXJ2ZXIgY2FuIHByb3ZpZGUgbWV0YWRhdGEgZm9yIHRoaXMgc2VydmljZS4gICoqL1xyXG4gIGhhc1NlcnZlck1ldGFkYXRhPzogYm9vbGVhbjtcclxuICAvKiogVGhlIFtbSnNvblJlc3VsdHNBZGFwdGVyXV0gdXNlZCB0byBwcm9jZXNzIHRoZSByZXN1bHRzIG9mIGFueSBxdWVyeSBhZ2FpbnN0IHRoaXMgRGF0YVNlcnZpY2UuICAqKi9cclxuICBqc29uUmVzdWx0c0FkYXB0ZXI/OiBKc29uUmVzdWx0c0FkYXB0ZXI7XHJcbiAgLyoqIFdoZXRoZXIgdG8gdXNlIEpTT05QIHdoZW4gcGVyZm9ybWluZyBhICdHRVQnIHJlcXVlc3QgYWdhaW5zdCB0aGlzIHNlcnZpY2UuICAqKi9cclxuICB1c2VKc29ucD86IGJvb2xlYW47XHJcbn1cclxuLyoqXHJcbkEgRGF0YVNlcnZpY2UgaW5zdGFuY2UgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgZGV0YWlscyBvZiBhIHNpbmdsZSAnc2VydmljZSc7IHRoaXMgaW5jbHVkZXMgYSBzZXJ2aWNlTmFtZSwgYSBkYXRhU2VydmljZSBhZGFwdGVySW5zdGFuY2UsXHJcbmFuZCB3aGV0aGVyIHRoZSBzZXJ2aWNlIGhhcyBzZXJ2ZXIgc2lkZSBtZXRhZGF0YS5cclxuXHJcbllvdSBjYW4gY29uc3RydWN0IGFuIEVudGl0eU1hbmFnZXIgd2l0aCBlaXRoZXIgYSBzZXJ2aWNlTmFtZSBvciBhIERhdGFTZXJ2aWNlIGluc3RhbmNlLCBpZiB5b3UgdXNlIGEgc2VydmljZU5hbWUgdGhlbiBhIERhdGFTZXJ2aWNlXHJcbmlzIGNvbnN0cnVjdGVkIGZvciB5b3UuICAoSXQgY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgRW50aXR5TWFuYWdlci5zZXRQcm9wZXJ0aWVzIG1ldGhvZCkuXHJcblxyXG5UaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBNZXRhZGF0YVN0b3JlLmZldGNoTWV0YWRhdGEgbWV0aG9kLCBpLmUuIGl0IHRha2VzIGVpdGhlciBhIHNlcnZpY2VOYW1lIG9yIGEgRGF0YVNlcnZpY2UgaW5zdGFuY2UuXHJcblxyXG5FYWNoIG1ldGFkYXRhU3RvcmUgY29udGFpbnMgYSBsaXN0IG9mIERhdGFTZXJ2aWNlcywgZWFjaCBhY2Nlc3NpYmxlIHZpYSBpdHMg4oCYc2VydmljZU5hbWXigJkuXHJcbiggc2VlIE1ldGFkYXRhU3RvcmUuZ2V0RGF0YVNlcnZpY2UgYW5kIE1ldGFkYXRhU3RvcmUuYWRkRGF0YVNlcnZpY2UpLiAgVGhlIOKAmGFkZERhdGFTZXJ2aWNl4oCZIG1ldGhvZCBpcyBjYWxsZWQgaW50ZXJuYWxseVxyXG5hbnl0aW1lIGEgTWV0YWRhdGFTdG9yZS5mZXRjaE1ldGFkYXRhIGNhbGwgb2NjdXJzIHdpdGggYSBuZXcgZGF0YVNlcnZpY2UgKCBvciBzZXJ2aWNlIG5hbWUpLlxyXG5cclxuKiovXHJcbmV4cG9ydCBjbGFzcyBEYXRhU2VydmljZSB7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgZGVjbGFyZSBfJHR5cGVOYW1lOiBzdHJpbmc7IC8vIGFjdHVhbGx5IHB1dCBvbiBwcm90b3R5cGUuXHJcbiAgLyoqIFRoZSBzZXJ2aWNlTmFtZSBmb3IgdGhpcyBEYXRhU2VydmljZS4gX19SZWFkIE9ubHlfXyAqKi9cclxuICBkZWNsYXJlIHNlcnZpY2VOYW1lOiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBhZGFwdGVyIG5hbWUgZm9yIHRoZSBbW0lEYXRhU2VydmljZUFkYXB0ZXJdXSB0byBiZSB1c2VkIHdpdGggdGhpcyBzZXJ2aWNlLiBfX1JlYWQgT25seV9fICAqKi9cclxuICBkZWNsYXJlIGFkYXB0ZXJOYW1lOiBzdHJpbmc7XHJcbiAgLyoqICBUaGUgW1tJRGF0YVNlcnZpY2VBZGFwdGVyXV0gaW1wbGVtZW50YXRpb24gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5TWFuYWdlci4gX19SZWFkIE9ubHlfXyAgKiovXHJcbiAgZGVjbGFyZSBhZGFwdGVySW5zdGFuY2U/OiBEYXRhU2VydmljZUFkYXB0ZXI7XHJcbiAgLyoqIFRoZSBhZGFwdGVyIG5hbWUgZm9yIHRoZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dIHRvIGJlIHVzZWQgd2l0aCB0aGlzIHNlcnZpY2UuIF9fUmVhZCBPbmx5X18gICoqL1xyXG4gIGRlY2xhcmUgdXJpQnVpbGRlck5hbWU6IHN0cmluZztcclxuICAvKiogIFRoZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eU1hbmFnZXIuIF9fUmVhZCBPbmx5X18gICoqL1xyXG4gIGRlY2xhcmUgdXJpQnVpbGRlcj86IFVyaUJ1aWxkZXJBZGFwdGVyO1xyXG4gIC8qKiBXaGV0aGVyIHRoZSBzZXJ2ZXIgY2FuIHByb3ZpZGUgbWV0YWRhdGEgZm9yIHRoaXMgc2VydmljZS4gX19SZWFkIE9ubHlfXyAgICoqL1xyXG4gIGRlY2xhcmUgaGFzU2VydmVyTWV0YWRhdGE6IGJvb2xlYW47XHJcbiAgLyoqIFRoZSBbW0pzb25SZXN1bHRzQWRhcHRlcl1dIHVzZWQgdG8gcHJvY2VzcyB0aGUgcmVzdWx0cyBvZiBhbnkgcXVlcnkgYWdhaW5zdCB0aGlzIERhdGFTZXJ2aWNlLiBfX1JlYWQgT25seV9fICoqL1xyXG4gIGRlY2xhcmUganNvblJlc3VsdHNBZGFwdGVyOiBKc29uUmVzdWx0c0FkYXB0ZXI7XHJcbiAgLyoqIFdoZXRoZXIgdG8gdXNlIEpTT05QIHdoZW4gcGVyZm9ybWluZyBhICdHRVQnIHJlcXVlc3QgYWdhaW5zdCB0aGlzIHNlcnZpY2UuIF9fUmVhZCBPbmx5X18gICoqL1xyXG4gIGRlY2xhcmUgdXNlSnNvbnA6IGJvb2xlYW47XHJcblxyXG4gIC8qKiAgIERhdGFTZXJ2aWNlIGNvbnN0cnVjdG9yXHJcbiAgPiAgICAgdmFyIGRhdGFTZXJ2aWNlID0gbmV3IERhdGFTZXJ2aWNlKHtcclxuICA+ICAgICAgICAgc2VydmljZU5hbWU6IGFsdFNlcnZpY2VOYW1lLFxyXG4gID4gICAgICAgICBoYXNTZXJ2ZXJNZXRhZGF0YTogZmFsc2VcclxuICA+ICAgICB9KTtcclxuXHJcbiAgPiAgICAgdmFyIG1ldGFkYXRhU3RvcmUgPSBuZXcgTWV0YWRhdGFTdG9yZSh7XHJcbiAgPiAgICAgICAgIG5hbWluZ0NvbnZlbnRpb246IE5hbWluZ0NvbnZlbnRpb24uY2FtZWxDYXNlXHJcbiAgPiAgICAgfSk7XHJcblxyXG4gID4gICAgIHJldHVybiBuZXcgRW50aXR5TWFuYWdlcih7XHJcbiAgPiAgICAgICAgIGRhdGFTZXJ2aWNlOiBkYXRhU2VydmljZSxcclxuICA+ICAgICAgICAgbWV0YWRhdGFTdG9yZTogbWV0YWRhdGFTdG9yZVxyXG4gID4gICAgIH0pO1xyXG4gIEBwYXJhbSBjb25maWcgLSBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxyXG4gICoqL1xyXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IERhdGFTZXJ2aWNlQ29uZmlnKSB7XHJcbiAgICB1cGRhdGVXaXRoQ29uZmlnKHRoaXMsIGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBEYXRhU2VydmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcyBhcHBsaWVkLlxyXG4gIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgdG8gYXBwbHkgdG8gY3JlYXRlIGEgbmV3IERhdGFTZXJ2aWNlLlxyXG4gICoqL1xyXG4gIHVzaW5nKGNvbmZpZzogRGF0YVNlcnZpY2VDb25maWcpIHtcclxuICAgIGlmICghY29uZmlnKSByZXR1cm4gdGhpcztcclxuICAgIGxldCByZXN1bHQgPSBuZXcgRGF0YVNlcnZpY2UodGhpcyk7XHJcbiAgICByZXR1cm4gdXBkYXRlV2l0aENvbmZpZyhyZXN1bHQsIGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmVzb2x2ZShkYXRhU2VydmljZXM6IERhdGFTZXJ2aWNlW10pIHtcclxuICAgIC8vIGZpbmFsIGRlZmF1bHRzXHJcbiAgICAvLyBEZWxpYmVyYXRlIHVzZSBvZiAnYXMgYW55JyBiZWxvdy5cclxuICAgIChkYXRhU2VydmljZXMgYXMgYW55KS5wdXNoKHtcclxuICAgICAgaGFzU2VydmVyTWV0YWRhdGE6IHRydWUsXHJcbiAgICAgIHVzZUpzb25wOiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgICBsZXQgZHMgPSBuZXcgRGF0YVNlcnZpY2UoY29yZS5yZXNvbHZlUHJvcGVydGllcyhkYXRhU2VydmljZXMsXHJcbiAgICAgICAgW1wic2VydmljZU5hbWVcIiwgXCJhZGFwdGVyTmFtZVwiLCBcInVyaUJ1aWxkZXJOYW1lXCIsIFwiaGFzU2VydmVyTWV0YWRhdGFcIiwgXCJqc29uUmVzdWx0c0FkYXB0ZXJcIiwgXCJ1c2VKc29ucFwiXSkpO1xyXG5cclxuICAgIGlmICghZHMuc2VydmljZU5hbWUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHJlc29sdmUgYSAnc2VydmljZU5hbWUnIGZvciB0aGlzIGRhdGFTZXJ2aWNlXCIpO1xyXG4gICAgfVxyXG4gICAgZHMuYWRhcHRlckluc3RhbmNlID0gZHMuYWRhcHRlckluc3RhbmNlIHx8IGNvbmZpZy5nZXRBZGFwdGVySW5zdGFuY2U8RGF0YVNlcnZpY2VBZGFwdGVyPihcImRhdGFTZXJ2aWNlXCIsIGRzLmFkYXB0ZXJOYW1lKTtcclxuICAgIGRzLmpzb25SZXN1bHRzQWRhcHRlciA9IGRzLmpzb25SZXN1bHRzQWRhcHRlciB8fCBkcy5hZGFwdGVySW5zdGFuY2UhLmpzb25SZXN1bHRzQWRhcHRlcjtcclxuICAgIGRzLnVyaUJ1aWxkZXIgPSBkcy51cmlCdWlsZGVyIHx8IGNvbmZpZy5nZXRBZGFwdGVySW5zdGFuY2U8VXJpQnVpbGRlckFkYXB0ZXI+KFwidXJpQnVpbGRlclwiLCBkcy51cmlCdWlsZGVyTmFtZSk7XHJcbiAgICByZXR1cm4gZHM7XHJcbiAgfVxyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBzdGF0aWMgX25vcm1hbGl6ZVNlcnZpY2VOYW1lKHNlcnZpY2VOYW1lOiBzdHJpbmcpIHtcclxuICAgIHNlcnZpY2VOYW1lID0gc2VydmljZU5hbWUudHJpbSgpO1xyXG4gICAgaWYgKHNlcnZpY2VOYW1lLnN1YnN0cigtMSkgIT09IFwiL1wiKSB7XHJcbiAgICAgIHJldHVybiBzZXJ2aWNlTmFtZSArICcvJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiAgKi9cclxuICB0b0pTT04oKSB7XHJcbiAgICAvLyBkb24ndCB1c2UgZGVmYXVsdCB2YWx1ZSBoZXJlIC0gYmVjYXVzZSB3ZSB3YW50IHRvIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggdW5kZWZpbmVkIHByb3BzIGZvciBpbmhlcml0ZW5jZSBwdXJwb3Nlcy5cclxuICAgIHJldHVybiBjb3JlLnRvSnNvbih0aGlzLCB7XHJcbiAgICAgIHNlcnZpY2VOYW1lOiBudWxsLFxyXG4gICAgICBhZGFwdGVyTmFtZTogbnVsbCxcclxuICAgICAgdXJpQnVpbGRlck5hbWU6IG51bGwsXHJcbiAgICAgIGhhc1NlcnZlck1ldGFkYXRhOiBudWxsLFxyXG4gICAgICBqc29uUmVzdWx0c0FkYXB0ZXI6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdiAmJiB2Lm5hbWU7XHJcbiAgICAgIH0sXHJcbiAgICAgIHVzZUpzb25wOiBudWxsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uOiBhbnkpIHtcclxuICAgIGpzb24uanNvblJlc3VsdHNBZGFwdGVyID0gY29uZmlnLl9mZXRjaE9iamVjdChKc29uUmVzdWx0c0FkYXB0ZXIsIGpzb24uanNvblJlc3VsdHNBZGFwdGVyKTtcclxuICAgIHJldHVybiBuZXcgRGF0YVNlcnZpY2UoanNvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgUmV0dXJucyBhIHVybCBmb3IgdGhpcyBkYXRhU2VydmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LiBUaGlzIG1ldGhvZCBoYW5kbGVzIGRhdGFTZXJ2aWNlIG5hbWVzIGVpdGhlclxyXG4gICB3aXRoIG9yIHdpdGhvdXQgdHJhaWxpbmcgJy8ncy4gIElmIHRoZSBzdWZmaXggc3RhcnRzIHdpdGggXCJodHRwXCIgdGhlbiBpdCB3aWxsIGJlIHJldHVybmVkIGFzLWlzLlxyXG4gICBAbWV0aG9kIHF1YWxpZnlVcmxcclxuICAgQHBhcmFtIHN1ZmZpeCB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIHVybC5cclxuICAgQHJldHVybiB7YSBVcmwgc3RyaW5nfVxyXG4gICAqKi9cclxuICBxdWFsaWZ5VXJsKHN1ZmZpeDogc3RyaW5nKSB7XHJcbiAgICBpZiAoc3VmZml4ICYmIHN1ZmZpeC5zdGFydHNXaXRoKFwiaHR0cFwiKSkge1xyXG4gICAgICByZXR1cm4gc3VmZml4O1xyXG4gICAgfVxyXG4gICAgbGV0IHVybCA9IHRoaXMuc2VydmljZU5hbWU7XHJcbiAgICAvLyByZW1vdmUgYW55IHRyYWlsaW5nIFwiL1wiXHJcbiAgICBpZiAoY29yZS5zdHJpbmdFbmRzV2l0aCh1cmwsIFwiL1wiKSkge1xyXG4gICAgICB1cmwgPSB1cmwuc3Vic3RyKDAsIHVybC5sZW5ndGggLSAxKTtcclxuICAgIH1cclxuICAgIC8vIGVuc3VyZSB0aGF0IGl0IGVuZHMgd2l0aCBcIi9cIiArIHN1ZmZpeFxyXG4gICAgc3VmZml4ID0gXCIvXCIgKyBzdWZmaXg7XHJcbiAgICBpZiAoIWNvcmUuc3RyaW5nRW5kc1dpdGgodXJsLCBzdWZmaXgpKSB7XHJcbiAgICAgIHVybCA9IHVybCArIHN1ZmZpeDtcclxuICAgIH1cclxuICAgIHJldHVybiB1cmw7XHJcbiAgfVxyXG5cclxufVxyXG5EYXRhU2VydmljZS5wcm90b3R5cGUuXyR0eXBlTmFtZSA9IFwiRGF0YVNlcnZpY2VcIjtcclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVdpdGhDb25maWcob2JqOiBEYXRhU2VydmljZSwgZHNDb25maWc/OiBEYXRhU2VydmljZUNvbmZpZykge1xyXG4gIGlmIChkc0NvbmZpZykge1xyXG4gICAgYXNzZXJ0Q29uZmlnKGRzQ29uZmlnKVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwic2VydmljZU5hbWVcIikuaXNPcHRpb25hbCgpXHJcbiAgICAgICAgLndoZXJlUGFyYW0oXCJhZGFwdGVyTmFtZVwiKS5pc1N0cmluZygpLmlzT3B0aW9uYWwoKVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwidXJpQnVpbGRlck5hbWVcIikuaXNTdHJpbmcoKS5pc09wdGlvbmFsKClcclxuICAgICAgICAud2hlcmVQYXJhbShcImhhc1NlcnZlck1ldGFkYXRhXCIpLmlzQm9vbGVhbigpLmlzT3B0aW9uYWwoKVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwianNvblJlc3VsdHNBZGFwdGVyXCIpLmlzSW5zdGFuY2VPZihKc29uUmVzdWx0c0FkYXB0ZXIpLmlzT3B0aW9uYWwoKVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwidXNlSnNvbnBcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpXHJcbiAgICAgICAgLmFwcGx5QWxsKG9iaik7XHJcbiAgICBvYmouc2VydmljZU5hbWUgPSBvYmouc2VydmljZU5hbWUgJiYgRGF0YVNlcnZpY2UuX25vcm1hbGl6ZVNlcnZpY2VOYW1lKG9iai5zZXJ2aWNlTmFtZSk7XHJcbiAgICBvYmouYWRhcHRlckluc3RhbmNlID0gb2JqLmFkYXB0ZXJOYW1lID8gIGNvbmZpZy5nZXRBZGFwdGVySW5zdGFuY2U8RGF0YVNlcnZpY2VBZGFwdGVyPihcImRhdGFTZXJ2aWNlXCIsIG9iai5hZGFwdGVyTmFtZSkgOiB1bmRlZmluZWQ7XHJcbiAgICBvYmoudXJpQnVpbGRlciA9IG9iai51cmlCdWlsZGVyTmFtZSA/IGNvbmZpZy5nZXRBZGFwdGVySW5zdGFuY2U8VXJpQnVpbGRlckFkYXB0ZXI+KFwidXJpQnVpbGRlclwiLCBvYmoudXJpQnVpbGRlck5hbWUpIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuICByZXR1cm4gb2JqO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVNZXRhIHtcclxuICBlbnRpdHlUeXBlPzogRW50aXR5VHlwZTtcclxuICBub2RlSWQ/OiBzdHJpbmc7XHJcbiAgbm9kZVJlZklkPzogc3RyaW5nO1xyXG4gIGlnbm9yZT86IGJvb2xlYW47XHJcbiAgcGFzc1RocnU/OiBib29sZWFuO1xyXG4gIGV4dHJhTWV0YWRhdGE/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm9kZUNvbnRleHQge1xyXG4gIG5vZGVUeXBlOiBzdHJpbmc7XHJcbiAgcHJvcGVydHlOYW1lPzogc3RyaW5nO1xyXG4gIG5hdmlnYXRpb25Qcm9wZXJ0eT86IE5hdmlnYXRpb25Qcm9wZXJ0eTtcclxufVxyXG5cclxuLyoqIENvbmZpZ3VyYXRpb24gaW5mbyB0byBiZSBwYXNzZWQgdG8gdGhlIFtbSnNvblJlc3VsdHNBZGFwdGVyXV0gY29uc3RydWN0b3IgKi9cclxuZXhwb3J0IGludGVyZmFjZSBKc29uUmVzdWx0c0FkYXB0ZXJDb25maWcge1xyXG4gIC8qKiBUaGUgbmFtZSBvZiB0aGlzIGFkYXB0ZXIuICBUaGlzIG5hbWUgaXMgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSBhbmQgbG9jYXRlIHRoaXMgaW5zdGFuY2Ugd2hlbiBhbiAnZXhwb3J0ZWQnIEpzb25SZXN1bHRzQWRhcHRlciBpcyBsYXRlciBpbXBvcnRlZC4gKi9cclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgLyoqIEEgRnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgb25jZSBwZXIgcXVlcnkgb3BlcmF0aW9uIHRvIGV4dHJhY3QgdGhlICdwYXlsb2FkJyBmcm9tIGFueSBqc29uIHJlY2VpdmVkIG92ZXIgdGhlIHdpcmUuIFxyXG4gIFRoaXMgbWV0aG9kIGhhcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggdG8gc2ltcGx5IHJldHVybiB0aGUgXCJyZXN1bHRzXCIgcHJvcGVydHkgZnJvbSBhbnkganNvbiByZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIHF1ZXJ5LiBcclxuICAqL1xyXG4gIGV4dHJhY3RSZXN1bHRzPzogRnVuY3Rpb247XHJcbiAgLyoqIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgb25jZSBwZXIgc2F2ZSBvcGVyYXRpb24gdG8gZXh0cmFjdCB0aGUgZW50aXRpZXMgZnJvbSBhbnkganNvbiByZWNlaXZlZCBvdmVyIHRoZSB3aXJlLiAgTXVzdCByZXR1cm4gYW4gYXJyYXkuXHJcbiAgVGhpcyBtZXRob2QgaGFzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBzaW1wbHkgcmV0dXJucyB0aGUgXCJlbnRpdGllc1wiIHByb3BlcnR5IGZyb20gYW55IGpzb24gcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBzYXZlLiAqL1xyXG4gIGV4dHJhY3RTYXZlUmVzdWx0cz86IEZ1bmN0aW9uO1xyXG4gIC8qKiBBIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9uY2UgcGVyIHNhdmUgb3BlcmF0aW9uIHRvIGV4dHJhY3QgdGhlIGtleSBtYXBwaW5ncyBmcm9tIGFueSBqc29uIHJlY2VpdmVkIG92ZXIgdGhlIHdpcmUuICBNdXN0IHJldHVybiBhbiBhcnJheS5cclxuICBUaGlzIG1ldGhvZCBoYXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdoaWNoIHNpbXBseSByZXR1cm5zIHRoZSBcImtleU1hcHBpbmdzXCIgcHJvcGVydHkgZnJvbSBhbnkganNvbiByZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIHNhdmUuICovXHJcbiAgZXh0cmFjdEtleU1hcHBpbmdzPzogKGRhdGE6IHt9KSA9PiBLZXlNYXBwaW5nW107XHJcbiAgLyoqIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgb25jZSBwZXIgc2F2ZSBvcGVyYXRpb24gdG8gZXh0cmFjdCBhbnkgZGVsZXRlZCBrZXlzIGZyb20gYW55IGpzb24gcmVjZWl2ZWQgb3ZlciB0aGUgd2lyZS4gIE11c3QgcmV0dXJuIGFuIGFycmF5LlxyXG4gIFRoaXMgbWV0aG9kIGhhcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggc2ltcGx5IHJldHVybnMgYW4gZW1wdHkgYXJyYXkuICovXHJcbiAgZXh0cmFjdERlbGV0ZWRLZXlzPzogKGRhdGE6IHt9KSA9PiBhbnlbXTsgLy8gVE9ETzogcmVmaW5lXHJcbiAgLyoqIEEgdmlzaXRvciBtZXRob2QgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIG5vZGUgb2YgdGhlIHJldHVybmVkIHBheWxvYWQuICovXHJcbiAgdmlzaXROb2RlPzogKHY6IGFueSwgbWM/OiBNYXBwaW5nQ29udGV4dCwgbm9kZUNvbnRleHQ/OiBOb2RlQ29udGV4dCkgPT4gTm9kZU1ldGE7XHJcblxyXG59XHJcblxyXG4vKipcclxuQSBKc29uUmVzdWx0c0FkYXB0ZXIgaW5zdGFuY2UgaXMgdXNlZCB0byBwcm92aWRlIGN1c3RvbSBleHRyYWN0aW9uIGFuZCBwYXJzaW5nIGxvZ2ljIG9uIHRoZSBqc29uIHJlc3VsdHMgcmV0dXJuZWQgYnkgYW55IHdlYiBzZXJ2aWNlLlxyXG5UaGlzIGZhY2lsaXR5IG1ha2VzIGl0IHBvc3NpYmxlIGZvciBicmVlemUgdG8gdGFsayB0byB2aXJ0dWFsbHkgYW55IHdlYiBzZXJ2aWNlIGFuZCByZXR1cm4gb2JqZWN0cyB0aGF0IHdpbGwgYmUgZmlyc3QgY2xhc3MgJ2JyZWV6ZScgY2l0aXplbnMuXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgSnNvblJlc3VsdHNBZGFwdGVyIHtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfJHR5cGVOYW1lOiBzdHJpbmc7IC8vIGFjdHVhbGx5IHB1dCBvbiBwcm90b3R5cGUuXHJcbiAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgYWRhcHRlci4gIFRoaXMgbmFtZSBpcyB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuZCBsb2NhdGUgdGhpcyBpbnN0YW5jZSB3aGVuIGFuICdleHBvcnRlZCcgSnNvblJlc3VsdHNBZGFwdGVyIGlzIGxhdGVyIGltcG9ydGVkLiAqL1xyXG4gIG5hbWU6IHN0cmluZztcclxuICAvKiogQSBGdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBvbmNlIHBlciBxdWVyeSBvcGVyYXRpb24gdG8gZXh0cmFjdCB0aGUgJ3BheWxvYWQnIGZyb20gYW55IGpzb24gcmVjZWl2ZWQgb3ZlciB0aGUgd2lyZS4gXHJcbiAgVGhpcyBtZXRob2QgaGFzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBzaW1wbHkgcmV0dXJucyB0aGUgXCJyZXN1bHRzXCIgcHJvcGVydHkgZnJvbSBhbnkganNvbiByZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIHF1ZXJ5LiAqL1xyXG4gIGV4dHJhY3RSZXN1bHRzOiBGdW5jdGlvbjsgLy8gVE9ETyAtIHJlZmluZVxyXG4gIC8qKiBBIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9uY2UgcGVyIHNhdmUgb3BlcmF0aW9uIHRvIGV4dHJhY3QgdGhlIGVudGl0aWVzIGZyb20gYW55IGpzb24gcmVjZWl2ZWQgb3ZlciB0aGUgd2lyZS4gIE11c3QgcmV0dXJuIGFuIGFycmF5LlxyXG4gIFRoaXMgbWV0aG9kIGhhcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggc2ltcGx5IHJldHVybnMgdGhlIFwiZW50aXRpZXNcIiBwcm9wZXJ0eSBmcm9tIGFueSBqc29uIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGV4ZWN1dGluZyB0aGUgc2F2ZS4gKi9cclxuICBleHRyYWN0U2F2ZVJlc3VsdHM6IEZ1bmN0aW9uO1xyXG4gICAgLyoqIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgb25jZSBwZXIgc2F2ZSBvcGVyYXRpb24gdG8gZXh0cmFjdCB0aGUga2V5IG1hcHBpbmdzIGZyb20gYW55IGpzb24gcmVjZWl2ZWQgb3ZlciB0aGUgd2lyZS4gIE11c3QgcmV0dXJuIGFuIGFycmF5LlxyXG4gIFRoaXMgbWV0aG9kIGhhcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2hpY2ggc2ltcGx5IHJldHVybnMgdGhlIFwia2V5TWFwcGluZ3NcIiBwcm9wZXJ0eSBmcm9tIGFueSBqc29uIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGV4ZWN1dGluZyB0aGUgc2F2ZS4gKi9cclxuICBleHRyYWN0S2V5TWFwcGluZ3M6ICAoZGF0YToge30pID0+IEtleU1hcHBpbmdbXTtcclxuICAvKiogQSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBvbmNlIHBlciBzYXZlIG9wZXJhdGlvbiB0byBleHRyYWN0IGFueSBkZWxldGVkIGtleXMgZnJvbSBhbnkganNvbiByZWNlaXZlZCBvdmVyIHRoZSB3aXJlLiAgTXVzdCByZXR1cm4gYW4gYXJyYXkuXHJcbiAgVGhpcyBtZXRob2QgaGFzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCBpcyB0byBzaW1wbHkgcmV0dXJucyB0aGUgXCJkZWxldGVkS2V5c1wiIHByb3BlcnR5IGZyb20gYW55IGpzb24gcmV0dXJuZWQgYXMgYSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBzYXZlLiAqL1xyXG4gIGV4dHJhY3REZWxldGVkS2V5cz86IChkYXRhOiB7fSkgPT4gYW55W107IC8vIFRPRE86IHJlZmluZVxyXG4gIC8qKiBBIHZpc2l0b3IgbWV0aG9kIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBub2RlIG9mIHRoZSByZXR1cm5lZCBwYXlsb2FkLiAqL1xyXG4gIHZpc2l0Tm9kZTogRnVuY3Rpb247XHJcblxyXG4gIC8qKlxyXG4gIEpzb25SZXN1bHRzQWRhcHRlciBjb25zdHJ1Y3RvclxyXG5cclxuICBAZXhhbXBsZVxyXG4gICAgICAvL1xyXG4gICAgICB2YXIganNvblJlc3VsdHNBZGFwdGVyID0gbmV3IEpzb25SZXN1bHRzQWRhcHRlcih7XHJcbiAgICAgICAgICBuYW1lOiBcInRlc3QxZVwiLFxyXG4gICAgICAgICAgZXh0cmFjdFJlc3VsdHM6IGZ1bmN0aW9uKGpzb24pIHtcclxuICAgICAgICAgICAgICByZXR1cm4ganNvbi5yZXN1bHRzO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHZpc2l0Tm9kZTogZnVuY3Rpb24obm9kZSwgbWFwcGluZ0NvbnRleHQsIG5vZGVDb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgdmFyIGVudGl0eVR5cGUgPSBub3JtYWxpemVUeXBlTmFtZShub2RlLiR0eXBlKTtcclxuICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gbm9kZUNvbnRleHQucHJvcGVydHlOYW1lO1xyXG4gICAgICAgICAgICAgIHZhciBpZ25vcmUgPSBwcm9wZXJ0eU5hbWUgJiYgcHJvcGVydHlOYW1lLnN1YnN0cigwLCAxKSA9PT0gXCIkXCI7XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgIGVudGl0eVR5cGU6IGVudGl0eVR5cGUsXHJcbiAgICAgICAgICAgICAgICAgIG5vZGVJZDogbm9kZS4kaWQsXHJcbiAgICAgICAgICAgICAgICAgIG5vZGVSZWZJZDogbm9kZS4kcmVmLFxyXG4gICAgICAgICAgICAgICAgICBpZ25vcmU6IGlnbm9yZSxcclxuICAgICAgICAgICAgICAgICAgcGFzc1RocnU6IGZhbHNlIC8vIGRlZmF1bHRcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHZhciBkYXRhU2VydmljZSA9IG5ldyBEYXRhU2VydmljZSgge1xyXG4gICAgICAgICAgICAgIHNlcnZpY2VOYW1lOiBcImJyZWV6ZS9mb29cIixcclxuICAgICAgICAgICAgICBqc29uUmVzdWx0c0FkYXB0ZXI6IGpzb25SZXN1bHRzQWRhcHRlclxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHZhciBlbnRpdHlNYW5hZ2VyID0gbmV3IEVudGl0eU1hbmFnZXIoIHtcclxuICAgICAgICAgIGRhdGFTZXJ2aWNlOiBkYXRhU2VydmljZVxyXG4gICAgICB9KTtcclxuXHJcbiAgQHBhcmFtIGNvbmZpZyAtIEEgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcblxyXG4gICoqL1xyXG4gIGNvbnN0cnVjdG9yKGpzQ29uZmlnOiBKc29uUmVzdWx0c0FkYXB0ZXJDb25maWcpIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAxKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBKc29uUmVzdWx0c0FkYXB0ZXIgY3RvciBzaG91bGQgYmUgY2FsbGVkIHdpdGggYSBzaW5nbGUgYXJndW1lbnQgdGhhdCBpcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3NlcnRDb25maWcoanNDb25maWcpXHJcbiAgICAgICAgLndoZXJlUGFyYW0oXCJuYW1lXCIpLmlzTm9uRW1wdHlTdHJpbmcoKVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwiZXh0cmFjdFJlc3VsdHNcIikuaXNGdW5jdGlvbigpLmlzT3B0aW9uYWwoKS53aXRoRGVmYXVsdChleHRyYWN0UmVzdWx0c0RlZmF1bHQpXHJcbiAgICAgICAgLndoZXJlUGFyYW0oXCJleHRyYWN0U2F2ZVJlc3VsdHNcIikuaXNGdW5jdGlvbigpLmlzT3B0aW9uYWwoKS53aXRoRGVmYXVsdChleHRyYWN0U2F2ZVJlc3VsdHNEZWZhdWx0KVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwiZXh0cmFjdEtleU1hcHBpbmdzXCIpLmlzRnVuY3Rpb24oKS5pc09wdGlvbmFsKCkud2l0aERlZmF1bHQoZXh0cmFjdEtleU1hcHBpbmdzRGVmYXVsdClcclxuICAgICAgICAud2hlcmVQYXJhbShcImV4dHJhY3REZWxldGVkS2V5c1wiKS5pc0Z1bmN0aW9uKCkuaXNPcHRpb25hbCgpLndpdGhEZWZhdWx0KGV4dHJhY3REZWxldGVkS2V5c0RlZmF1bHQpXHJcbiAgICAgICAgLndoZXJlUGFyYW0oXCJ2aXNpdE5vZGVcIikuaXNGdW5jdGlvbigpXHJcbiAgICAgICAgLmFwcGx5QWxsKHRoaXMpO1xyXG4gICAgY29uZmlnLl9zdG9yZU9iamVjdCh0aGlzLCBcIkpzb25SZXN1bHRzQWRhcHRlclwiLCB0aGlzLm5hbWUpO1xyXG4gIH1cclxuXHJcbn1cclxuSnNvblJlc3VsdHNBZGFwdGVyLnByb3RvdHlwZS5fJHR5cGVOYW1lID0gXCJKc29uUmVzdWx0c0FkYXB0ZXJcIjtcclxuXHJcbmZ1bmN0aW9uIGV4dHJhY3RSZXN1bHRzRGVmYXVsdChkYXRhOiBhbnkpIHtcclxuICByZXR1cm4gZGF0YS5yZXN1bHRzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBleHRyYWN0U2F2ZVJlc3VsdHNEZWZhdWx0KGRhdGE6IGFueSkge1xyXG4gIHJldHVybiBkYXRhLmVudGl0aWVzIHx8IGRhdGEuRW50aXRpZXMgfHwgW107XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4dHJhY3RLZXlNYXBwaW5nc0RlZmF1bHQoZGF0YTogYW55KSB7XHJcbiAgcmV0dXJuIGRhdGEua2V5TWFwcGluZ3MgfHwgZGF0YS5LZXlNYXBwaW5ncyB8fCBbXTtcclxufVxyXG5cclxuZnVuY3Rpb24gZXh0cmFjdERlbGV0ZWRLZXlzRGVmYXVsdChkYXRhOiBhbnkpIHtcclxuICByZXR1cm4gZGF0YS5kZWxldGVkS2V5cyB8fCBkYXRhLkRlbGV0ZWRLZXlzIHx8IFtdO1xyXG59XHJcblxyXG4iXX0=