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.
- package/adapter-ajax-angularjs/{index.d.ts → breeze-client-adapter-ajax-angularjs.d.ts} +0 -1
- package/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.metadata.json +1 -0
- package/adapter-ajax-angularjs/package.json +13 -0
- package/adapter-ajax-fetch/{index.d.ts → breeze-client-adapter-ajax-fetch.d.ts} +0 -1
- package/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.metadata.json +1 -0
- package/adapter-ajax-fetch/package.json +13 -0
- package/adapter-ajax-httpclient/{index.d.ts → breeze-client-adapter-ajax-httpclient.d.ts} +0 -1
- package/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.metadata.json +1 -0
- package/adapter-ajax-httpclient/package.json +13 -0
- package/adapter-ajax-jquery/{index.d.ts → breeze-client-adapter-ajax-jquery.d.ts} +0 -1
- package/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.metadata.json +1 -0
- package/adapter-ajax-jquery/package.json +13 -0
- package/adapter-ajax-post/{index.d.ts → breeze-client-adapter-ajax-post.d.ts} +0 -1
- package/adapter-ajax-post/breeze-client-adapter-ajax-post.metadata.json +1 -0
- package/adapter-ajax-post/package.json +13 -0
- package/adapter-data-service-odata/{index.d.ts → breeze-client-adapter-data-service-odata.d.ts} +0 -1
- package/adapter-data-service-odata/breeze-client-adapter-data-service-odata.metadata.json +1 -0
- package/adapter-data-service-odata/package.json +13 -0
- package/adapter-data-service-webapi/{index.d.ts → breeze-client-adapter-data-service-webapi.d.ts} +0 -1
- package/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.metadata.json +1 -0
- package/adapter-data-service-webapi/package.json +13 -0
- package/adapter-model-library-backing-store/{index.d.ts → breeze-client-adapter-model-library-backing-store.d.ts} +0 -1
- package/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.metadata.json +1 -0
- package/adapter-model-library-backing-store/package.json +13 -0
- package/adapter-model-library-ko/{index.d.ts → breeze-client-adapter-model-library-ko.d.ts} +0 -1
- package/adapter-model-library-ko/breeze-client-adapter-model-library-ko.metadata.json +1 -0
- package/adapter-model-library-ko/package.json +13 -0
- package/adapter-uri-builder-json/{index.d.ts → breeze-client-adapter-uri-builder-json.d.ts} +0 -1
- package/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.metadata.json +1 -0
- package/adapter-uri-builder-json/package.json +13 -0
- package/adapter-uri-builder-odata/{index.d.ts → breeze-client-adapter-uri-builder-odata.d.ts} +0 -1
- package/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.metadata.json +1 -0
- package/adapter-uri-builder-odata/package.json +13 -0
- package/breeze-client.d.ts +8 -0
- package/breeze-client.metadata.json +1 -0
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.js +190 -0
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-fetch.umd.js +190 -0
- package/bundles/breeze-client-adapter-ajax-fetch.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.js +195 -0
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-jquery.umd.js +115 -0
- package/bundles/breeze-client-adapter-ajax-jquery.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-post.umd.js +92 -0
- package/bundles/breeze-client-adapter-ajax-post.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-ajax-post.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-ajax-post.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-data-service-odata.umd.js +747 -0
- package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +16 -0
- package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js +333 -0
- package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +16 -0
- package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.js +280 -0
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-model-library-ko.umd.js +252 -0
- package/bundles/breeze-client-adapter-model-library-ko.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-model-library-ko.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-model-library-ko.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-uri-builder-json.umd.js +96 -0
- package/bundles/breeze-client-adapter-uri-builder-json.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js.map +1 -0
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.js +262 -0
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.js.map +1 -0
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js +2 -0
- package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js.map +1 -0
- package/bundles/breeze-client-mixin-get-entity-graph.umd.js +258 -0
- package/bundles/breeze-client-mixin-get-entity-graph.umd.js.map +1 -0
- package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js +2 -0
- package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js.map +1 -0
- package/bundles/breeze-client-mixin-save-queuing.umd.js +579 -0
- package/bundles/breeze-client-mixin-save-queuing.umd.js.map +1 -0
- package/bundles/breeze-client-mixin-save-queuing.umd.min.js +16 -0
- package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +1 -0
- package/bundles/breeze-client.umd.js +14234 -0
- package/bundles/breeze-client.umd.js.map +1 -0
- package/bundles/breeze-client.umd.min.js +16 -0
- package/bundles/breeze-client.umd.min.js.map +1 -0
- package/esm2015/adapter-ajax-angularjs/adapter-ajax-angularjs.js +130 -0
- package/esm2015/adapter-ajax-angularjs/adapter-core.js +49 -0
- package/esm2015/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +5 -0
- package/esm2015/adapter-ajax-fetch/adapter-ajax-fetch.js +130 -0
- package/esm2015/adapter-ajax-fetch/adapter-core.js +49 -0
- package/esm2015/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +5 -0
- package/esm2015/adapter-ajax-httpclient/adapter-ajax-httpclient.js +137 -0
- package/esm2015/adapter-ajax-httpclient/adapter-core.js +49 -0
- package/esm2015/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +5 -0
- package/esm2015/adapter-ajax-jquery/adapter-ajax-jquery.js +103 -0
- package/esm2015/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +5 -0
- package/esm2015/adapter-ajax-post/adapter-ajax-post.js +77 -0
- package/esm2015/adapter-ajax-post/breeze-client-adapter-ajax-post.js +5 -0
- package/esm2015/adapter-data-service-odata/adapter-core.js +49 -0
- package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +463 -0
- package/esm2015/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +5 -0
- package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +100 -0
- package/esm2015/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +5 -0
- package/esm2015/adapter-model-library-backing-store/adapter-model-library-backing-store.js +268 -0
- package/esm2015/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +5 -0
- package/esm2015/adapter-model-library-ko/adapter-model-library-ko.js +240 -0
- package/esm2015/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +5 -0
- package/esm2015/adapter-uri-builder-json/adapter-core.js +49 -0
- package/esm2015/adapter-uri-builder-json/adapter-uri-builder-json.js +36 -0
- package/esm2015/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +5 -0
- package/esm2015/adapter-uri-builder-odata/adapter-core.js +49 -0
- package/esm2015/adapter-uri-builder-odata/adapter-uri-builder-odata.js +192 -0
- package/esm2015/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +5 -0
- package/esm2015/breeze-client.js +9 -0
- package/esm2015/index.js +2 -0
- package/esm2015/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +5 -0
- package/esm2015/mixin-get-entity-graph/mixin-get-entity-graph.js +269 -0
- package/esm2015/mixin-save-queuing/breeze-client-mixin-save-queuing.js +5 -0
- package/esm2015/mixin-save-queuing/mixin-save-queuing.js +400 -0
- package/esm2015/src/abstract-data-service-adapter.js +327 -0
- package/esm2015/src/array.js +4 -0
- package/esm2015/src/assert-param.js +312 -0
- package/esm2015/src/breeze.js +85 -0
- package/esm2015/src/complex-array.js +119 -0
- package/esm2015/src/config.js +223 -0
- package/esm2015/src/core.js +714 -0
- package/esm2015/src/csdl-metadata-parser.js +385 -0
- package/esm2015/src/data-service.js +203 -0
- package/esm2015/src/data-type.js +506 -0
- package/esm2015/src/default-property-interceptor.js +460 -0
- package/{esm2022/src/entity-action.mjs → esm2015/src/entity-action.js} +25 -25
- package/esm2015/src/entity-aspect.js +804 -0
- package/esm2015/src/entity-group.js +187 -0
- package/esm2015/src/entity-key.js +116 -0
- package/esm2015/src/entity-manager.js +2094 -0
- package/esm2015/src/entity-metadata.js +2109 -0
- package/esm2015/src/entity-query.js +1015 -0
- package/esm2015/src/entity-state.js +107 -0
- package/esm2015/src/enum.js +141 -0
- package/esm2015/src/event.js +256 -0
- package/esm2015/src/interface-registry.js +41 -0
- package/esm2015/src/key-generator.js +108 -0
- package/esm2015/src/local-query-comparison-options.js +65 -0
- package/esm2015/src/mapping-context.js +411 -0
- package/esm2015/src/naming-convention.js +88 -0
- package/esm2015/src/observable-array.js +185 -0
- package/esm2015/src/predicate.js +1242 -0
- package/esm2015/src/primitive-array.js +87 -0
- package/esm2015/src/query-options.js +152 -0
- package/esm2015/src/relation-array.js +175 -0
- package/esm2015/src/save-options.js +41 -0
- package/esm2015/src/unattached-children-map.js +58 -0
- package/esm2015/src/validate.js +991 -0
- package/esm2015/src/validation-options.js +64 -0
- package/esm5/adapter-ajax-angularjs/adapter-ajax-angularjs.js +132 -0
- package/esm5/adapter-ajax-angularjs/adapter-core.js +49 -0
- package/esm5/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +5 -0
- package/esm5/adapter-ajax-fetch/adapter-ajax-fetch.js +132 -0
- package/esm5/adapter-ajax-fetch/adapter-core.js +49 -0
- package/esm5/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +5 -0
- package/esm5/adapter-ajax-httpclient/adapter-ajax-httpclient.js +139 -0
- package/esm5/adapter-ajax-httpclient/adapter-core.js +49 -0
- package/esm5/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +5 -0
- package/esm5/adapter-ajax-jquery/adapter-ajax-jquery.js +105 -0
- package/esm5/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +5 -0
- package/esm5/adapter-ajax-post/adapter-ajax-post.js +81 -0
- package/esm5/adapter-ajax-post/breeze-client-adapter-ajax-post.js +5 -0
- package/esm5/adapter-data-service-odata/adapter-core.js +49 -0
- package/{esm2022/adapter-data-service-odata/adapter-data-service-odata.mjs → esm5/adapter-data-service-odata/adapter-data-service-odata.js} +147 -138
- package/esm5/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +5 -0
- package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +105 -0
- package/esm5/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +5 -0
- package/esm5/adapter-model-library-backing-store/adapter-model-library-backing-store.js +270 -0
- package/esm5/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +5 -0
- package/esm5/adapter-model-library-ko/adapter-model-library-ko.js +242 -0
- package/esm5/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +5 -0
- package/esm5/adapter-uri-builder-json/adapter-core.js +49 -0
- package/esm5/adapter-uri-builder-json/adapter-uri-builder-json.js +38 -0
- package/esm5/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +5 -0
- package/esm5/adapter-uri-builder-odata/adapter-core.js +49 -0
- package/esm5/adapter-uri-builder-odata/adapter-uri-builder-odata.js +197 -0
- package/esm5/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +5 -0
- package/esm5/breeze-client.js +9 -0
- package/esm5/index.js +2 -0
- package/esm5/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +5 -0
- package/esm5/mixin-get-entity-graph/mixin-get-entity-graph.js +269 -0
- package/esm5/mixin-save-queuing/breeze-client-mixin-save-queuing.js +5 -0
- package/esm5/mixin-save-queuing/mixin-save-queuing.js +412 -0
- package/esm5/src/abstract-data-service-adapter.js +333 -0
- package/esm5/src/array.js +4 -0
- package/esm5/src/assert-param.js +317 -0
- package/esm5/src/breeze.js +85 -0
- package/esm5/src/complex-array.js +119 -0
- package/esm5/src/config.js +228 -0
- package/esm5/src/core.js +722 -0
- package/esm5/src/csdl-metadata-parser.js +385 -0
- package/esm5/src/data-service.js +207 -0
- package/esm5/src/data-type.js +513 -0
- package/esm5/src/default-property-interceptor.js +460 -0
- package/esm5/src/entity-action.js +52 -0
- package/esm5/src/entity-aspect.js +810 -0
- package/esm5/src/entity-group.js +189 -0
- package/esm5/src/entity-key.js +118 -0
- package/esm5/src/entity-manager.js +2112 -0
- package/esm5/src/entity-metadata.js +2144 -0
- package/esm5/src/entity-query.js +1042 -0
- package/esm5/src/entity-state.js +114 -0
- package/esm5/src/enum.js +144 -0
- package/esm5/src/event.js +259 -0
- package/esm5/src/interface-registry.js +43 -0
- package/esm5/src/key-generator.js +111 -0
- package/esm5/src/local-query-comparison-options.js +67 -0
- package/esm5/src/mapping-context.js +413 -0
- package/esm5/src/naming-convention.js +90 -0
- package/esm5/src/observable-array.js +201 -0
- package/esm5/src/predicate.js +1307 -0
- package/esm5/src/primitive-array.js +87 -0
- package/esm5/src/query-options.js +167 -0
- package/esm5/src/relation-array.js +175 -0
- package/esm5/src/save-options.js +43 -0
- package/esm5/src/unattached-children-map.js +60 -0
- package/{esm2022/src/validate.mjs → esm5/src/validate.js} +110 -116
- package/esm5/src/validation-options.js +66 -0
- package/{fesm2022/breeze-client-adapter-ajax-angularjs.mjs → fesm2015/breeze-client-adapter-ajax-angularjs.js} +1 -6
- package/fesm2015/breeze-client-adapter-ajax-angularjs.js.map +1 -0
- package/{fesm2022/breeze-client-adapter-ajax-fetch.mjs → fesm2015/breeze-client-adapter-ajax-fetch.js} +4 -9
- package/fesm2015/breeze-client-adapter-ajax-fetch.js.map +1 -0
- package/{fesm2022/breeze-client-adapter-ajax-httpclient.mjs → fesm2015/breeze-client-adapter-ajax-httpclient.js} +4 -6
- package/fesm2015/breeze-client-adapter-ajax-httpclient.js.map +1 -0
- package/{fesm2022/breeze-client-adapter-ajax-jquery.mjs → fesm2015/breeze-client-adapter-ajax-jquery.js} +2 -6
- package/fesm2015/breeze-client-adapter-ajax-jquery.js.map +1 -0
- package/{fesm2022/breeze-client-adapter-ajax-post.mjs → fesm2015/breeze-client-adapter-ajax-post.js} +1 -1
- package/fesm2015/breeze-client-adapter-ajax-post.js.map +1 -0
- package/{fesm2022/breeze-client-adapter-data-service-odata.mjs → fesm2015/breeze-client-adapter-data-service-odata.js} +69 -68
- package/fesm2015/breeze-client-adapter-data-service-odata.js.map +1 -0
- package/{fesm2022/breeze-client-adapter-data-service-webapi.mjs → fesm2015/breeze-client-adapter-data-service-webapi.js} +30 -30
- package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +1 -0
- package/{fesm2022/breeze-client-adapter-model-library-backing-store.mjs → fesm2015/breeze-client-adapter-model-library-backing-store.js} +13 -14
- package/fesm2015/breeze-client-adapter-model-library-backing-store.js.map +1 -0
- package/{fesm2022/breeze-client-adapter-model-library-ko.mjs → fesm2015/breeze-client-adapter-model-library-ko.js} +13 -14
- package/fesm2015/breeze-client-adapter-model-library-ko.js.map +1 -0
- package/{fesm2022/breeze-client-adapter-uri-builder-json.mjs → fesm2015/breeze-client-adapter-uri-builder-json.js} +8 -9
- package/fesm2015/breeze-client-adapter-uri-builder-json.js.map +1 -0
- package/{fesm2022/breeze-client-adapter-uri-builder-odata.mjs → fesm2015/breeze-client-adapter-uri-builder-odata.js} +86 -86
- package/fesm2015/breeze-client-adapter-uri-builder-odata.js.map +1 -0
- package/{fesm2022/breeze-client-mixin-get-entity-graph.mjs → fesm2015/breeze-client-mixin-get-entity-graph.js} +1 -1
- package/fesm2015/breeze-client-mixin-get-entity-graph.js.map +1 -0
- package/{fesm2022/breeze-client-mixin-save-queuing.mjs → fesm2015/breeze-client-mixin-save-queuing.js} +2 -23
- package/fesm2015/breeze-client-mixin-save-queuing.js.map +1 -0
- package/{fesm2022/breeze-client.mjs → fesm2015/breeze-client.js} +1543 -2042
- package/fesm2015/breeze-client.js.map +1 -0
- package/fesm5/breeze-client-adapter-ajax-angularjs.js +186 -0
- package/fesm5/breeze-client-adapter-ajax-angularjs.js.map +1 -0
- package/fesm5/breeze-client-adapter-ajax-fetch.js +186 -0
- package/fesm5/breeze-client-adapter-ajax-fetch.js.map +1 -0
- package/fesm5/breeze-client-adapter-ajax-httpclient.js +193 -0
- package/fesm5/breeze-client-adapter-ajax-httpclient.js.map +1 -0
- package/fesm5/breeze-client-adapter-ajax-jquery.js +111 -0
- package/fesm5/breeze-client-adapter-ajax-jquery.js.map +1 -0
- package/fesm5/breeze-client-adapter-ajax-post.js +86 -0
- package/fesm5/breeze-client-adapter-ajax-post.js.map +1 -0
- package/fesm5/breeze-client-adapter-data-service-odata.js +523 -0
- package/fesm5/breeze-client-adapter-data-service-odata.js.map +1 -0
- package/fesm5/breeze-client-adapter-data-service-webapi.js +111 -0
- package/fesm5/breeze-client-adapter-data-service-webapi.js.map +1 -0
- package/fesm5/breeze-client-adapter-model-library-backing-store.js +276 -0
- package/fesm5/breeze-client-adapter-model-library-backing-store.js.map +1 -0
- package/fesm5/breeze-client-adapter-model-library-ko.js +248 -0
- package/fesm5/breeze-client-adapter-model-library-ko.js.map +1 -0
- package/fesm5/breeze-client-adapter-uri-builder-json.js +92 -0
- package/fesm5/breeze-client-adapter-uri-builder-json.js.map +1 -0
- package/fesm5/breeze-client-adapter-uri-builder-odata.js +250 -0
- package/fesm5/breeze-client-adapter-uri-builder-odata.js.map +1 -0
- package/fesm5/breeze-client-mixin-get-entity-graph.js +254 -0
- package/fesm5/breeze-client-mixin-get-entity-graph.js.map +1 -0
- package/fesm5/breeze-client-mixin-save-queuing.js +356 -0
- package/fesm5/breeze-client-mixin-save-queuing.js.map +1 -0
- package/fesm5/breeze-client.js +13956 -0
- package/fesm5/breeze-client.js.map +1 -0
- package/mixin-get-entity-graph/{index.d.ts → breeze-client-mixin-get-entity-graph.d.ts} +0 -1
- package/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.metadata.json +1 -0
- package/mixin-get-entity-graph/package.json +13 -0
- package/mixin-save-queuing/{index.d.ts → breeze-client-mixin-save-queuing.d.ts} +0 -1
- package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +1 -0
- package/mixin-save-queuing/package.json +13 -0
- package/package.json +12 -94
- package/src/config.d.ts +1 -1
- package/src/core.d.ts +1 -1
- package/src/entity-aspect.d.ts +1 -1
- package/src/entity-metadata.d.ts +6 -8
- package/src/entity-query.d.ts +1 -1
- package/esm2022/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +0 -135
- package/esm2022/adapter-ajax-angularjs/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +0 -5
- package/esm2022/adapter-ajax-fetch/adapter-ajax-fetch.mjs +0 -135
- package/esm2022/adapter-ajax-fetch/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +0 -5
- package/esm2022/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +0 -139
- package/esm2022/adapter-ajax-httpclient/adapter-core.mjs +0 -49
- package/esm2022/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +0 -5
- package/esm2022/adapter-ajax-jquery/adapter-ajax-jquery.mjs +0 -107
- package/esm2022/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +0 -5
- package/esm2022/adapter-ajax-post/adapter-ajax-post.mjs +0 -77
- package/esm2022/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +0 -5
- package/esm2022/adapter-data-service-odata/adapter-core.mjs +0 -49
- package/esm2022/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +0 -5
- package/esm2022/adapter-data-service-webapi/adapter-data-service-webapi.mjs +0 -100
- package/esm2022/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +0 -5
- package/esm2022/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +0 -269
- package/esm2022/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +0 -5
- package/esm2022/adapter-model-library-ko/adapter-model-library-ko.mjs +0 -241
- package/esm2022/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +0 -5
- package/esm2022/adapter-uri-builder-json/adapter-core.mjs +0 -49
- package/esm2022/adapter-uri-builder-json/adapter-uri-builder-json.mjs +0 -37
- package/esm2022/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +0 -5
- package/esm2022/adapter-uri-builder-odata/adapter-core.mjs +0 -49
- package/esm2022/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +0 -191
- package/esm2022/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +0 -5
- package/esm2022/breeze-client.mjs +0 -5
- package/esm2022/index.mjs +0 -2
- package/esm2022/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +0 -5
- package/esm2022/mixin-get-entity-graph/mixin-get-entity-graph.mjs +0 -269
- package/esm2022/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +0 -5
- package/esm2022/mixin-save-queuing/mixin-save-queuing.mjs +0 -421
- package/esm2022/src/abstract-data-service-adapter.mjs +0 -325
- package/esm2022/src/array.mjs +0 -4
- package/esm2022/src/assert-param.mjs +0 -330
- package/esm2022/src/breeze.mjs +0 -85
- package/esm2022/src/complex-array.mjs +0 -117
- package/esm2022/src/config.mjs +0 -232
- package/esm2022/src/core.mjs +0 -712
- package/esm2022/src/csdl-metadata-parser.mjs +0 -385
- package/esm2022/src/data-service.mjs +0 -239
- package/esm2022/src/data-type.mjs +0 -510
- package/esm2022/src/default-property-interceptor.mjs +0 -460
- package/esm2022/src/entity-aspect.mjs +0 -897
- package/esm2022/src/entity-group.mjs +0 -192
- package/esm2022/src/entity-key.mjs +0 -127
- package/esm2022/src/entity-manager.mjs +0 -2183
- package/esm2022/src/entity-metadata.mjs +0 -2242
- package/esm2022/src/entity-query.mjs +0 -1024
- package/esm2022/src/entity-state.mjs +0 -107
- package/esm2022/src/enum.mjs +0 -143
- package/esm2022/src/event.mjs +0 -264
- package/esm2022/src/interface-registry.mjs +0 -39
- package/esm2022/src/key-generator.mjs +0 -110
- package/esm2022/src/local-query-comparison-options.mjs +0 -75
- package/esm2022/src/mapping-context.mjs +0 -422
- package/esm2022/src/naming-convention.mjs +0 -96
- package/esm2022/src/observable-array.mjs +0 -183
- package/esm2022/src/predicate.mjs +0 -1259
- package/esm2022/src/primitive-array.mjs +0 -85
- package/esm2022/src/query-options.mjs +0 -160
- package/esm2022/src/relation-array.mjs +0 -173
- package/esm2022/src/save-options.mjs +0 -51
- package/esm2022/src/unattached-children-map.mjs +0 -56
- package/esm2022/src/validation-options.mjs +0 -78
- package/fesm2022/breeze-client-adapter-ajax-angularjs.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-fetch.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-httpclient.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-jquery.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-ajax-post.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-data-service-odata.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-model-library-backing-store.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-model-library-ko.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-uri-builder-json.mjs.map +0 -1
- package/fesm2022/breeze-client-adapter-uri-builder-odata.mjs.map +0 -1
- package/fesm2022/breeze-client-mixin-get-entity-graph.mjs.map +0 -1
- package/fesm2022/breeze-client-mixin-save-queuing.mjs.map +0 -1
- package/fesm2022/breeze-client.mjs.map +0 -1
|
@@ -1,460 +0,0 @@
|
|
|
1
|
-
import { core } from './core';
|
|
2
|
-
import { EntityKey } from './entity-key';
|
|
3
|
-
import { EntityAspect } from './entity-aspect';
|
|
4
|
-
import { EntityState } from './entity-state';
|
|
5
|
-
import { EntityAction } from './entity-action';
|
|
6
|
-
import { EntityQuery } from './entity-query';
|
|
7
|
-
/** @hidden @internal */
|
|
8
|
-
export function defaultPropertyInterceptor(property, newValue, rawAccessorFn) {
|
|
9
|
-
// 'this' is the entity itself in this context.
|
|
10
|
-
if (newValue === undefined)
|
|
11
|
-
newValue = null; // remove? to allow assignment to undefined in Babel constructors?
|
|
12
|
-
let oldValue = rawAccessorFn();
|
|
13
|
-
let dataType = property.dataType;
|
|
14
|
-
if (dataType && dataType.parse) {
|
|
15
|
-
// attempts to coerce a value to the correct type - if this fails return the value unchanged
|
|
16
|
-
if (Array.isArray(newValue) && !property.isScalar) {
|
|
17
|
-
newValue = newValue.map(function (nv) {
|
|
18
|
-
return dataType.parse(nv, typeof nv);
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
newValue = dataType.parse(newValue, typeof newValue);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
// exit if no change - extra cruft is because dateTimes don't compare cleanly.
|
|
26
|
-
if (newValue === oldValue || (newValue === null && oldValue === undefined) ||
|
|
27
|
-
(dataType && dataType.normalize && newValue && oldValue && dataType.normalize(newValue) === dataType.normalize(oldValue))) {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
// CANNOT DO NEXT LINE because it has the possibility of creating a new property
|
|
31
|
-
// 'entityAspect' on 'this'. - Not permitted by IE inside of a defined property on a prototype.
|
|
32
|
-
// let entityAspect = new EntityAspect(this);
|
|
33
|
-
let propertyName;
|
|
34
|
-
let entityAspect = this.entityAspect;
|
|
35
|
-
if (entityAspect) {
|
|
36
|
-
propertyName = property.name;
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
let localAspect = this.complexAspect;
|
|
40
|
-
if (localAspect) {
|
|
41
|
-
entityAspect = localAspect.getEntityAspect();
|
|
42
|
-
propertyName = localAspect.getPropertyPath(property.name);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
// does not yet have an EntityAspect so just set the prop
|
|
46
|
-
rawAccessorFn(newValue);
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
// Note that we need to handle multiple properties in process, not just one in order to avoid recursion.
|
|
51
|
-
// ( except in the case of null propagation with fks where null -> 0 in some cases.)
|
|
52
|
-
// (this may not be needed because of the newValue === oldValue test above)
|
|
53
|
-
let inProcess = entityAspect._inProcess = entityAspect._inProcess || [];
|
|
54
|
-
// check for recursion
|
|
55
|
-
if (inProcess.indexOf(property) >= 0)
|
|
56
|
-
return;
|
|
57
|
-
inProcess.push(property);
|
|
58
|
-
try {
|
|
59
|
-
let context = {
|
|
60
|
-
parent: this,
|
|
61
|
-
property: property,
|
|
62
|
-
newValue: newValue,
|
|
63
|
-
oldValue: oldValue,
|
|
64
|
-
propertyName: propertyName,
|
|
65
|
-
entityAspect: entityAspect
|
|
66
|
-
};
|
|
67
|
-
if (property.isComplexProperty) {
|
|
68
|
-
setDpValueComplex(context, rawAccessorFn);
|
|
69
|
-
}
|
|
70
|
-
else if (property.isDataProperty) {
|
|
71
|
-
setDpValueSimple(context, rawAccessorFn);
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
setNpValue(context, rawAccessorFn);
|
|
75
|
-
}
|
|
76
|
-
postChangeEvents(context);
|
|
77
|
-
}
|
|
78
|
-
finally {
|
|
79
|
-
inProcess.pop();
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
function setDpValueSimple(context, rawAccessorFn) {
|
|
83
|
-
let parent = context.parent;
|
|
84
|
-
let property = context.property;
|
|
85
|
-
let entityAspect = context.entityAspect;
|
|
86
|
-
let oldValue = context.oldValue;
|
|
87
|
-
let newValue = context.newValue;
|
|
88
|
-
let entityManager = entityAspect.entityManager;
|
|
89
|
-
if (!property.isScalar) {
|
|
90
|
-
throw new Error("Nonscalar data properties are readonly - items may be added or removed but the collection may not be changed.");
|
|
91
|
-
}
|
|
92
|
-
// store an original value for this property if not already set
|
|
93
|
-
if (entityAspect.entityState.isUnchangedOrModified()) {
|
|
94
|
-
let propName = property.name;
|
|
95
|
-
// localAspect is not the same as entityAspect for complex props
|
|
96
|
-
let localAspect = EntityAspect.isEntity(parent) ? parent.entityAspect : parent.complexAspect;
|
|
97
|
-
if (localAspect.originalValues[propName] === undefined) {
|
|
98
|
-
// otherwise this entry will be skipped during serialization
|
|
99
|
-
localAspect.originalValues[propName] = oldValue !== undefined ? oldValue : property.defaultValue;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
// if we are changing the key update our internal entityGroup indexes.
|
|
103
|
-
if (property.isPartOfKey && entityManager && !entityManager.isLoading) {
|
|
104
|
-
// 'entityType' on the next line be null for complex properties but it will only be ref'd within this
|
|
105
|
-
// fn when the property is part of the key
|
|
106
|
-
let entityType = parent.entityType;
|
|
107
|
-
let keyProps = entityType.keyProperties;
|
|
108
|
-
let values = keyProps.map(function (p) {
|
|
109
|
-
if (p === property) {
|
|
110
|
-
return newValue;
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
return parent.getProperty(p.name);
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
let newKey = new EntityKey(entityType, values);
|
|
117
|
-
if (entityManager.getEntityByKey(newKey)) {
|
|
118
|
-
throw new Error("An entity with this key is already in the cache: " + newKey.toString());
|
|
119
|
-
}
|
|
120
|
-
let oldKey = parent.entityAspect.getKey();
|
|
121
|
-
let eg = entityManager._findEntityGroup(entityType);
|
|
122
|
-
eg._replaceKey(oldKey, newKey);
|
|
123
|
-
}
|
|
124
|
-
// process related updates ( the inverse relationship) first so that collection dups check works properly.
|
|
125
|
-
// update inverse relationship
|
|
126
|
-
let relatedNavProp = property.relatedNavigationProperty;
|
|
127
|
-
if (relatedNavProp && entityManager) {
|
|
128
|
-
// Example: bidirectional fkDataProperty: 1->n: order -> orderDetails
|
|
129
|
-
// orderDetail.orderId <- newOrderId || null
|
|
130
|
-
// ==> orderDetail.order = lookupOrder(newOrderId)
|
|
131
|
-
// ==> (see set navProp above)
|
|
132
|
-
// and
|
|
133
|
-
// Example: bidirectional fkDataProperty: 1->1: order -> internationalOrder
|
|
134
|
-
// internationalOrder.orderId <- newOrderId || null
|
|
135
|
-
// ==> internationalOrder.order = lookupOrder(newOrderId)
|
|
136
|
-
// ==> (see set navProp above)
|
|
137
|
-
if (newValue != null) {
|
|
138
|
-
let relatedEntity;
|
|
139
|
-
let key;
|
|
140
|
-
if (relatedNavProp.invForeignKeyNames.length) {
|
|
141
|
-
// property is related by field which is not the PK
|
|
142
|
-
const query = new EntityQuery(relatedNavProp.entityType.defaultResourceName).where(relatedNavProp.invForeignKeyNames[0], 'eq', newValue);
|
|
143
|
-
const qresult = entityManager.executeQueryLocally(query);
|
|
144
|
-
if (qresult.length === 1) {
|
|
145
|
-
relatedEntity = qresult[0];
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
// property is related by the PK
|
|
150
|
-
key = new EntityKey(relatedNavProp.entityType, [newValue]);
|
|
151
|
-
relatedEntity = entityManager.getEntityByKey(key);
|
|
152
|
-
}
|
|
153
|
-
if (relatedEntity) {
|
|
154
|
-
parent.setProperty(relatedNavProp.name, relatedEntity);
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
// it may not have been fetched yet in which case we want to add it as an unattachedChild.
|
|
158
|
-
if (key) {
|
|
159
|
-
// TODO currently _linkRelatedentities only works with PK relations, so we only add those.
|
|
160
|
-
entityManager._unattachedChildrenMap.addChild(key, relatedNavProp, parent);
|
|
161
|
-
}
|
|
162
|
-
parent.setProperty(relatedNavProp.name, null);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
parent.setProperty(relatedNavProp.name, null);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
else if (property.inverseNavigationProperty && entityManager && !entityManager._inKeyFixup) {
|
|
170
|
-
// Example: unidirectional fkDataProperty: 1->n: region -> territories
|
|
171
|
-
// territory.regionId <- newRegionId
|
|
172
|
-
// ==> lookupRegion(newRegionId).territories.push(territory)
|
|
173
|
-
// and
|
|
174
|
-
// Example: unidirectional fkDataProperty: 1->1: order -> internationalOrder
|
|
175
|
-
// internationalOrder.orderId <- newOrderId
|
|
176
|
-
// ==> lookupOrder(newOrderId).internationalOrder = internationalOrder
|
|
177
|
-
// and
|
|
178
|
-
// Example: unidirectional fkDataProperty: 1->n: region -> territories
|
|
179
|
-
// territory.regionId <- null
|
|
180
|
-
// ==> lookupRegion(territory.oldRegionId).territories.remove(oldTerritory);
|
|
181
|
-
// and
|
|
182
|
-
// Example: unidirectional fkDataProperty: 1->1: order -> internationalOrder
|
|
183
|
-
// internationalOrder.orderId <- null
|
|
184
|
-
// ==> lookupOrder(internationalOrder.oldOrderId).internationalOrder = null;
|
|
185
|
-
let invNavProp = property.inverseNavigationProperty;
|
|
186
|
-
if (oldValue != null) {
|
|
187
|
-
let key = new EntityKey(invNavProp.parentType, [oldValue]);
|
|
188
|
-
let relatedEntity = entityManager.getEntityByKey(key);
|
|
189
|
-
if (relatedEntity) {
|
|
190
|
-
if (invNavProp.isScalar) {
|
|
191
|
-
relatedEntity.setProperty(invNavProp.name, null);
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
// remove 'this' from old related nav prop
|
|
195
|
-
let relatedArray = relatedEntity.getProperty(invNavProp.name);
|
|
196
|
-
// arr.splice(arr.indexOf(value_to_remove), 1);
|
|
197
|
-
relatedArray.splice(relatedArray.indexOf(parent), 1);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
if (newValue != null) {
|
|
202
|
-
let key = new EntityKey(invNavProp.parentType, [newValue]);
|
|
203
|
-
let relatedEntity = entityManager.getEntityByKey(key);
|
|
204
|
-
if (relatedEntity) {
|
|
205
|
-
if (invNavProp.isScalar) {
|
|
206
|
-
relatedEntity.setProperty(invNavProp.name, parent);
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
relatedEntity.getProperty(invNavProp.name).push(parent);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
else {
|
|
213
|
-
// it may not have been fetched yet in which case we want to add it as an unattachedChild.
|
|
214
|
-
entityManager._unattachedChildrenMap.addChild(key, invNavProp, parent);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
rawAccessorFn(newValue);
|
|
219
|
-
updateStateAndValidate(context);
|
|
220
|
-
// if (property.isPartOfKey && (!this.complexAspect)) {
|
|
221
|
-
if (property.isPartOfKey) {
|
|
222
|
-
// propogate pk change to all related entities;
|
|
223
|
-
let entityType = parent.entityType;
|
|
224
|
-
let propertyIx = entityType.keyProperties.indexOf(property);
|
|
225
|
-
// this part handles order.orderId => orderDetail.orderId
|
|
226
|
-
// but won't handle product.productId => orderDetail.productId because product
|
|
227
|
-
// doesn't have an orderDetails property.
|
|
228
|
-
entityType.navigationProperties.forEach(function (np) {
|
|
229
|
-
let inverseNp = np.inverse;
|
|
230
|
-
let fkNames = inverseNp ? inverseNp.foreignKeyNames : np.invForeignKeyNames;
|
|
231
|
-
if (fkNames.length === 0)
|
|
232
|
-
return;
|
|
233
|
-
let npValue = parent.getProperty(np.name);
|
|
234
|
-
if (!npValue)
|
|
235
|
-
return;
|
|
236
|
-
let fkName = fkNames[propertyIx];
|
|
237
|
-
if (np.isScalar) {
|
|
238
|
-
npValue.setProperty(fkName, newValue);
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
npValue.slice(0).forEach(function (iv) {
|
|
242
|
-
iv.setProperty(fkName, newValue);
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
});
|
|
246
|
-
// this handles unidirectional problems not covered above.
|
|
247
|
-
if (entityManager) {
|
|
248
|
-
let inverseForeignKeyProperties = entityType.inverseForeignKeyProperties;
|
|
249
|
-
let baseEntityType = entityType.baseEntityType;
|
|
250
|
-
while (baseEntityType) {
|
|
251
|
-
inverseForeignKeyProperties = inverseForeignKeyProperties.concat(baseEntityType.inverseForeignKeyProperties);
|
|
252
|
-
baseEntityType = baseEntityType.baseEntityType;
|
|
253
|
-
}
|
|
254
|
-
inverseForeignKeyProperties.forEach((invFkProp) => {
|
|
255
|
-
if (invFkProp.relatedNavigationProperty.inverse == null) {
|
|
256
|
-
// this next step may be slow - it iterates over all of the entities in a group;
|
|
257
|
-
// hopefully it doesn't happen often.
|
|
258
|
-
entityManager._updateFkVal(invFkProp, oldValue, newValue);
|
|
259
|
-
}
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
// insure that cached key is updated.
|
|
263
|
-
entityAspect.getKey(true);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
function setDpValueComplex(context, rawAccessorFn) {
|
|
267
|
-
let property = context.property;
|
|
268
|
-
let oldValue = context.oldValue;
|
|
269
|
-
let newValue = context.newValue;
|
|
270
|
-
// To get here it must be a ComplexProperty
|
|
271
|
-
// 'dataType' will be a complexType
|
|
272
|
-
let dataType = property.dataType;
|
|
273
|
-
if (property.isScalar) {
|
|
274
|
-
if (!newValue) {
|
|
275
|
-
throw new Error(core.formatString("You cannot set the '%1' property to null because its datatype is the ComplexType: '%2'", property.name, property.dataType.name));
|
|
276
|
-
}
|
|
277
|
-
if (!oldValue) {
|
|
278
|
-
let ctor = dataType.getCtor();
|
|
279
|
-
oldValue = new ctor();
|
|
280
|
-
rawAccessorFn(oldValue);
|
|
281
|
-
}
|
|
282
|
-
dataType.dataProperties.forEach(function (dp) {
|
|
283
|
-
let pn = dp.name;
|
|
284
|
-
let nv = newValue.getProperty(pn);
|
|
285
|
-
oldValue.setProperty(pn, nv);
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
else {
|
|
289
|
-
throw new Error(core.formatString("You cannot set the non-scalar complex property: '%1' on the type: '%2'." +
|
|
290
|
-
"Instead get the property and use array functions like 'push' or 'splice' to change its contents.", property.name, property.parentType.name));
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
function setNpValue(context, rawAccessorFn) {
|
|
294
|
-
let parent = context.parent;
|
|
295
|
-
let property = context.property;
|
|
296
|
-
let entityAspect = context.entityAspect;
|
|
297
|
-
let oldValue = context.oldValue;
|
|
298
|
-
let newValue = context.newValue;
|
|
299
|
-
if (!property.isScalar) {
|
|
300
|
-
throw new Error("Nonscalar navigation properties are readonly - entities can be added or removed but the collection may not be changed.");
|
|
301
|
-
}
|
|
302
|
-
let entityManager = entityAspect.entityManager;
|
|
303
|
-
let inverseProp = property.inverse;
|
|
304
|
-
// manage attachment -
|
|
305
|
-
if (newValue != null) {
|
|
306
|
-
if (!newValue.entityAspect) {
|
|
307
|
-
return;
|
|
308
|
-
}
|
|
309
|
-
let newAspect = newValue.entityAspect;
|
|
310
|
-
if (entityManager) {
|
|
311
|
-
if (newAspect.entityState.isDetached()) {
|
|
312
|
-
if (!entityManager.isLoading) {
|
|
313
|
-
entityManager.attachEntity(newValue, EntityState.Added);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
else {
|
|
317
|
-
if (newAspect.entityManager !== entityManager) {
|
|
318
|
-
throw new Error("An Entity cannot be attached to an entity in another EntityManager. One of the two entities must be detached first.");
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
else {
|
|
323
|
-
if (newAspect && newAspect.entityManager) {
|
|
324
|
-
entityManager = newAspect.entityManager;
|
|
325
|
-
if (!entityManager.isLoading) {
|
|
326
|
-
entityManager.attachEntity(entityAspect.entity, EntityState.Added);
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
// process related updates ( the inverse relationship) first so that collection dups check works properly.
|
|
332
|
-
// update inverse relationship
|
|
333
|
-
if (inverseProp) {
|
|
334
|
-
///
|
|
335
|
-
if (inverseProp.isScalar) {
|
|
336
|
-
// Example: bidirectional navProperty: 1->1: order -> internationalOrder
|
|
337
|
-
// order.internationalOrder <- internationalOrder || null
|
|
338
|
-
// ==> (oldInternationalOrder.order = null)
|
|
339
|
-
// ==> internationalOrder.order = order
|
|
340
|
-
if (oldValue != null) {
|
|
341
|
-
// TODO: null -> NullEntity later
|
|
342
|
-
oldValue.setProperty(inverseProp.name, null);
|
|
343
|
-
}
|
|
344
|
-
if (newValue != null) {
|
|
345
|
-
newValue.setProperty(inverseProp.name, parent);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
// Example: bidirectional navProperty: 1->n: order -> orderDetails
|
|
350
|
-
// orderDetail.order <- newOrder || null
|
|
351
|
-
// ==> (oldOrder).orderDetails.remove(orderDetail)
|
|
352
|
-
// ==> order.orderDetails.push(newOrder)
|
|
353
|
-
if (oldValue != null) {
|
|
354
|
-
let oldSiblings = oldValue.getProperty(inverseProp.name);
|
|
355
|
-
let ix = oldSiblings.indexOf(parent);
|
|
356
|
-
if (ix !== -1) {
|
|
357
|
-
oldSiblings.splice(ix, 1);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
if (newValue != null) {
|
|
361
|
-
let siblings = newValue.getProperty(inverseProp.name);
|
|
362
|
-
// recursion check if already in the collection is performed by the relationArray
|
|
363
|
-
siblings.push(parent);
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
else if (property.invForeignKeyNames && entityManager && !entityManager._inKeyFixup) {
|
|
368
|
-
let invForeignKeyNames = property.invForeignKeyNames;
|
|
369
|
-
if (newValue != null) {
|
|
370
|
-
// Example: unidirectional navProperty: 1->1: order -> internationalOrder
|
|
371
|
-
// order.InternationalOrder <- internationalOrder
|
|
372
|
-
// ==> internationalOrder.orderId = orderId
|
|
373
|
-
// and
|
|
374
|
-
// Example: unidirectional navProperty: 1->n: order -> orderDetails
|
|
375
|
-
// orderDetail.order <-xxx newOrder
|
|
376
|
-
// ==> CAN'T HAPPEN because if unidirectional because orderDetail will not have an order prop
|
|
377
|
-
let pkValues = parent.entityAspect.getKey().values;
|
|
378
|
-
invForeignKeyNames.forEach((fkName, i) => {
|
|
379
|
-
newValue.setProperty(fkName, pkValues[i]);
|
|
380
|
-
});
|
|
381
|
-
}
|
|
382
|
-
else {
|
|
383
|
-
// Example: unidirectional navProperty: 1->1: order -> internationalOrder
|
|
384
|
-
// order.internationalOrder <- null
|
|
385
|
-
// ==> (old internationalOrder).orderId = null
|
|
386
|
-
// and
|
|
387
|
-
// Example: unidirectional navProperty: 1->n: order -> orderDetails
|
|
388
|
-
// orderDetail.order <-xxx newOrder
|
|
389
|
-
// ==> CAN'T HAPPEN because if unidirectional because orderDetail will not have an order prop
|
|
390
|
-
if (oldValue != null) {
|
|
391
|
-
invForeignKeyNames.forEach((fkName) => {
|
|
392
|
-
let fkProp = oldValue.entityType.getProperty(fkName);
|
|
393
|
-
if (!fkProp.isPartOfKey) {
|
|
394
|
-
// don't update with null if fk is part of the key
|
|
395
|
-
oldValue.setProperty(fkName, null);
|
|
396
|
-
}
|
|
397
|
-
});
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
rawAccessorFn(newValue);
|
|
402
|
-
updateStateAndValidate(context);
|
|
403
|
-
// update fk data property - this can only occur if this navProperty has
|
|
404
|
-
// a corresponding fk on this entity.
|
|
405
|
-
if (property.relatedDataProperties) {
|
|
406
|
-
let entityState = entityAspect.entityState;
|
|
407
|
-
// if either side of nav prop is detached don't clear fks. Note: oldValue in next line cannot be null so no check is needed.
|
|
408
|
-
if (newValue == null && (entityState.isDetached() || oldValue.entityAspect.entityState.isDetached()))
|
|
409
|
-
return;
|
|
410
|
-
if (entityState.isDeleted())
|
|
411
|
-
return;
|
|
412
|
-
// we may have inverse props indicating the related prop on the other entity, if it is not the other entity's PK
|
|
413
|
-
let inverseKeyProps = property.invForeignKeyNames;
|
|
414
|
-
if (!(inverseKeyProps && inverseKeyProps.length)) {
|
|
415
|
-
// otherwise, this prop is related to the other entity's PK
|
|
416
|
-
inverseKeyProps = property.entityType.keyProperties.map(k => k.name);
|
|
417
|
-
}
|
|
418
|
-
inverseKeyProps.forEach(function (keyProp, i) {
|
|
419
|
-
let relatedDataProp = property.relatedDataProperties[i];
|
|
420
|
-
// Do not trash related property if it is part of that entity's key
|
|
421
|
-
if (newValue || !relatedDataProp.isPartOfKey) {
|
|
422
|
-
let relatedValue = newValue ? newValue.getProperty(keyProp) : relatedDataProp.defaultValue;
|
|
423
|
-
parent.setProperty(relatedDataProp.name, relatedValue);
|
|
424
|
-
}
|
|
425
|
-
});
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
function postChangeEvents(context) {
|
|
429
|
-
let entityAspect = context.entityAspect;
|
|
430
|
-
let entityManager = entityAspect.entityManager;
|
|
431
|
-
let entity = entityAspect.entity;
|
|
432
|
-
let propChangedArgs = { entity: entity, parent: context.parent, property: context.property, propertyName: context.propertyName, oldValue: context.oldValue, newValue: context.newValue };
|
|
433
|
-
if (entityManager) {
|
|
434
|
-
// propertyChanged will be fired during loading but we only want to fire it once per entity, not once per property.
|
|
435
|
-
// so propertyChanged is fired in the entityManager mergeEntity method if not fired here.
|
|
436
|
-
if ((!entityManager.isLoading) && (!entityManager.isRejectingChanges)) {
|
|
437
|
-
entityAspect.propertyChanged.publish(propChangedArgs);
|
|
438
|
-
// don't fire entityChanged event if propertyChanged is suppressed.
|
|
439
|
-
entityManager.entityChanged.publish({ entityAction: EntityAction.PropertyChange, entity: entity, args: propChangedArgs });
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
else {
|
|
443
|
-
entityAspect.propertyChanged.publish(propChangedArgs);
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
function updateStateAndValidate(context) {
|
|
447
|
-
let entityAspect = context.entityAspect;
|
|
448
|
-
let entityManager = entityAspect.entityManager;
|
|
449
|
-
if (entityManager == null || entityManager.isLoading)
|
|
450
|
-
return;
|
|
451
|
-
let property = context.property;
|
|
452
|
-
if (entityAspect.entityState.isUnchanged() && !property.isUnmapped) {
|
|
453
|
-
entityAspect.setModified();
|
|
454
|
-
}
|
|
455
|
-
if (entityManager.validationOptions.validateOnPropertyChange) {
|
|
456
|
-
// entityAspect.entity is NOT the same as parent in the code below. It's use is deliberate.
|
|
457
|
-
entityAspect._validateProperty(context.newValue, { entity: entityAspect.entity, property: property, propertyName: context.propertyName, oldValue: context.oldValue });
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1wcm9wZXJ0eS1pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWZhdWx0LXByb3BlcnR5LWludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUEyQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLHdCQUF3QjtBQUN4QixNQUFNLFVBQVUsMEJBQTBCLENBQXlCLFFBQXdCLEVBQUUsUUFBYSxFQUFFLGFBQXVCO0lBQ2pJLCtDQUErQztJQUUvQyxJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLGtFQUFrRTtJQUMvRyxJQUFJLFFBQVEsR0FBRyxhQUFhLEVBQUUsQ0FBQztJQUUvQixJQUFJLFFBQVEsR0FBSSxRQUFnQixDQUFDLFFBQVEsQ0FBQztJQUMxQyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFO1FBQzlCLDRGQUE0RjtRQUM1RixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFO1lBQ2pELFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRTtnQkFDbEMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLFFB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LEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7S0FDMUg7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29yZSB9IGZyb20gJy4vY29yZSc7XHJcbmltcG9ydCB7IENvbXBsZXhUeXBlLCBEYXRhUHJvcGVydHksIE5hdmlnYXRpb25Qcm9wZXJ0eSwgRW50aXR5UHJvcGVydHkgfSBmcm9tICcuL2VudGl0eS1tZXRhZGF0YSc7XHJcbmltcG9ydCB7IEVudGl0eUtleSB9IGZyb20gJy4vZW50aXR5LWtleSc7XHJcbmltcG9ydCB7IEVudGl0eUFzcGVjdCwgQ29tcGxleEFzcGVjdCwgRW50aXR5LCBTdHJ1Y3R1cmFsT2JqZWN0IH0gZnJvbSAnLi9lbnRpdHktYXNwZWN0JztcclxuaW1wb3J0IHsgRW50aXR5U3RhdGUgfSBmcm9tICcuL2VudGl0eS1zdGF0ZSc7XHJcbmltcG9ydCB7IEVudGl0eUFjdGlvbiB9IGZyb20gJy4vZW50aXR5LWFjdGlvbic7XHJcbmltcG9ydCB7IEVudGl0eVF1ZXJ5IH0gZnJvbSAnLi9lbnRpdHktcXVlcnknO1xyXG5cclxuLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0UHJvcGVydHlJbnRlcmNlcHRvcih0aGlzOiBTdHJ1Y3R1cmFsT2JqZWN0LCBwcm9wZXJ0eTogRW50aXR5UHJvcGVydHksIG5ld1ZhbHVlOiBhbnksIHJhd0FjY2Vzc29yRm46IEZ1bmN0aW9uKSB7XHJcbiAgLy8gJ3RoaXMnIGlzIHRoZSBlbnRpdHkgaXRzZWxmIGluIHRoaXMgY29udGV4dC5cclxuXHJcbiAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIG5ld1ZhbHVlID0gbnVsbDsgLy8gcmVtb3ZlPyB0byBhbGxvdyBhc3NpZ25tZW50IHRvIHVuZGVmaW5lZCBpbiBCYWJlbCBjb25zdHJ1Y3RvcnM/XHJcbiAgbGV0IG9sZFZhbHVlID0gcmF3QWNjZXNzb3JGbigpO1xyXG5cclxuICBsZXQgZGF0YVR5cGUgPSAocHJvcGVydHkgYXMgYW55KS5kYXRhVHlwZTtcclxuICBpZiAoZGF0YVR5cGUgJiYgZGF0YVR5cGUucGFyc2UpIHtcclxuICAgIC8vIGF0dGVtcHRzIHRvIGNvZXJjZSBhIHZhbHVlIHRvIHRoZSBjb3JyZWN0IHR5cGUgLSBpZiB0aGlzIGZhaWxzIHJldHVybiB0aGUgdmFsdWUgdW5jaGFuZ2VkXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkgJiYgIXByb3BlcnR5LmlzU2NhbGFyKSB7XHJcbiAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUubWFwKGZ1bmN0aW9uIChudikge1xyXG4gICAgICAgIHJldHVybiBkYXRhVHlwZS5wYXJzZShudiwgdHlwZW9mIG52KTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBuZXdWYWx1ZSA9IGRhdGFUeXBlLnBhcnNlKG5ld1ZhbHVlLCB0eXBlb2YgbmV3VmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZXhpdCBpZiBubyBjaGFuZ2UgLSBleHRyYSBjcnVmdCBpcyBiZWNhdXNlIGRhdGVUaW1lcyBkb24ndCBjb21wYXJlIGNsZWFubHkuXHJcbiAgaWYgKG5ld1ZhbHVlID09PSBvbGRWYWx1ZSB8fCAobmV3VmFsdWUgPT09IG51bGwgJiYgb2xkVmFsdWUgPT09IHVuZGVmaW5lZCkgfHwgXHJcbiAgICAoZGF0YVR5cGUgJiYgZGF0YVR5cGUubm9ybWFsaXplICYmIG5ld1ZhbHVlICYmIG9sZFZhbHVlICYmIGRhdGFUeXBlLm5vcm1hbGl6ZShuZXdWYWx1ZSkgPT09IGRhdGFUeXBlLm5vcm1hbGl6ZShvbGRWYWx1ZSkpKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICAvLyBDQU5OT1QgRE8gTkVYVCBMSU5FIGJlY2F1c2UgaXQgaGFzIHRoZSBwb3NzaWJpbGl0eSBvZiBjcmVhdGluZyBhIG5ldyBwcm9wZXJ0eVxyXG4gIC8vICdlbnRpdHlBc3BlY3QnIG9uICd0aGlzJy4gIC0gTm90IHBlcm1pdHRlZCBieSBJRSBpbnNpZGUgb2YgYSBkZWZpbmVkIHByb3BlcnR5IG9uIGEgcHJvdG90eXBlLlxyXG4gIC8vIGxldCBlbnRpdHlBc3BlY3QgPSBuZXcgRW50aXR5QXNwZWN0KHRoaXMpO1xyXG5cclxuICBsZXQgcHJvcGVydHlOYW1lOiBzdHJpbmc7XHJcbiAgbGV0IGVudGl0eUFzcGVjdCA9ICh0aGlzIGFzIGFueSkuZW50aXR5QXNwZWN0IGFzIEVudGl0eUFzcGVjdDtcclxuICBpZiAoZW50aXR5QXNwZWN0KSB7XHJcbiAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eS5uYW1lO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBsZXQgbG9jYWxBc3BlY3QgPSAodGhpcyBhcyBhbnkpLmNvbXBsZXhBc3BlY3QgYXMgQ29tcGxleEFzcGVjdDtcclxuICAgIGlmIChsb2NhbEFzcGVjdCkge1xyXG4gICAgICBlbnRpdHlBc3BlY3QgPSBsb2NhbEFzcGVjdC5nZXRFbnRpdHlBc3BlY3QoKTtcclxuICAgICAgcHJvcGVydHlOYW1lID0gbG9jYWxBc3BlY3QuZ2V0UHJvcGVydHlQYXRoKHByb3BlcnR5Lm5hbWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gZG9lcyBub3QgeWV0IGhhdmUgYW4gRW50aXR5QXNwZWN0IHNvIGp1c3Qgc2V0IHRoZSBwcm9wXHJcbiAgICAgIHJhd0FjY2Vzc29yRm4obmV3VmFsdWUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBOb3RlIHRoYXQgd2UgbmVlZCB0byBoYW5kbGUgbXVsdGlwbGUgcHJvcGVydGllcyBpbiBwcm9jZXNzLCBub3QganVzdCBvbmUgaW4gb3JkZXIgdG8gYXZvaWQgcmVjdXJzaW9uLlxyXG4gIC8vICggZXhjZXB0IGluIHRoZSBjYXNlIG9mIG51bGwgcHJvcGFnYXRpb24gd2l0aCBma3Mgd2hlcmUgbnVsbCAtPiAwIGluIHNvbWUgY2FzZXMuKVxyXG4gIC8vICh0aGlzIG1heSBub3QgYmUgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIG5ld1ZhbHVlID09PSBvbGRWYWx1ZSB0ZXN0IGFib3ZlKVxyXG4gIGxldCBpblByb2Nlc3MgPSBlbnRpdHlBc3BlY3QuX2luUHJvY2VzcyA9IGVudGl0eUFzcGVjdC5faW5Qcm9jZXNzIHx8IFtdO1xyXG4gIC8vIGNoZWNrIGZvciByZWN1cnNpb25cclxuICBpZiAoaW5Qcm9jZXNzLmluZGV4T2YocHJvcGVydHkpID49IDApIHJldHVybjtcclxuICBpblByb2Nlc3MucHVzaChwcm9wZXJ0eSk7XHJcblxyXG4gIHRyeSB7XHJcblxyXG4gICAgbGV0IGNvbnRleHQ6IElDb250ZXh0ID0ge1xyXG4gICAgICBwYXJlbnQ6IHRoaXMsXHJcbiAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eSxcclxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlLFxyXG4gICAgICBvbGRWYWx1ZTogb2xkVmFsdWUsXHJcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxyXG4gICAgICBlbnRpdHlBc3BlY3Q6IGVudGl0eUFzcGVjdFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoKHByb3BlcnR5IGFzIGFueSkuaXNDb21wbGV4UHJvcGVydHkpIHtcclxuICAgICAgc2V0RHBWYWx1ZUNvbXBsZXgoY29udGV4dCwgcmF3QWNjZXNzb3JGbik7XHJcbiAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmlzRGF0YVByb3BlcnR5KSB7XHJcbiAgICAgIHNldERwVmFsdWVTaW1wbGUoY29udGV4dCwgcmF3QWNjZXNzb3JGbik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZXROcFZhbHVlKGNvbnRleHQsIHJhd0FjY2Vzc29yRm4pO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RDaGFuZ2VFdmVudHMoY29udGV4dCk7XHJcblxyXG4gIH0gZmluYWxseSB7XHJcbiAgICBpblByb2Nlc3MucG9wKCk7XHJcbiAgfVxyXG59XHJcblxyXG5pbnRlcmZhY2UgSUNvbnRleHQge1xyXG4gIHBhcmVudDogU3RydWN0dXJhbE9iamVjdDtcclxuICBwcm9wZXJ0eTogRW50aXR5UHJvcGVydHk7XHJcbiAgcHJvcGVydHlOYW1lOiBzdHJpbmc7XHJcbiAgZW50aXR5QXNwZWN0OiBFbnRpdHlBc3BlY3Q7XHJcbiAgb2xkVmFsdWU6IGFueTtcclxuICBuZXdWYWx1ZTogYW55O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZXREcFZhbHVlU2ltcGxlKGNvbnRleHQ6IElDb250ZXh0LCByYXdBY2Nlc3NvckZuOiBhbnkpIHtcclxuICBsZXQgcGFyZW50ID0gY29udGV4dC5wYXJlbnQ7XHJcbiAgbGV0IHByb3BlcnR5ID0gY29udGV4dC5wcm9wZXJ0eSBhcyBEYXRhUHJvcGVydHk7XHJcbiAgbGV0IGVudGl0eUFzcGVjdCA9IGNvbnRleHQuZW50aXR5QXNwZWN0O1xyXG4gIGxldCBvbGRWYWx1ZSA9IGNvbnRleHQub2xkVmFsdWU7XHJcbiAgbGV0IG5ld1ZhbHVlID0gY29udGV4dC5uZXdWYWx1ZTtcclxuXHJcbiAgbGV0IGVudGl0eU1hbmFnZXIgPSBlbnRpdHlBc3BlY3QuZW50aXR5TWFuYWdlcjtcclxuXHJcbiAgaWYgKCFwcm9wZXJ0eS5pc1NjYWxhcikge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm9uc2NhbGFyIGRhdGEgcHJvcGVydGllcyBhcmUgcmVhZG9ubHkgLSBpdGVtcyBtYXkgYmUgYWRkZWQgb3IgcmVtb3ZlZCBidXQgdGhlIGNvbGxlY3Rpb24gbWF5IG5vdCBiZSBjaGFuZ2VkLlwiKTtcclxuICB9XHJcblxyXG4gIC8vIHN0b3JlIGFuIG9yaWdpbmFsIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5IGlmIG5vdCBhbHJlYWR5IHNldFxyXG4gIGlmIChlbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUuaXNVbmNoYW5nZWRPck1vZGlmaWVkKCkpIHtcclxuICAgIGxldCBwcm9wTmFtZSA9IHByb3BlcnR5Lm5hbWU7XHJcbiAgICAvLyBsb2NhbEFzcGVjdCBpcyBub3QgdGhlIHNhbWUgYXMgZW50aXR5QXNwZWN0IGZvciBjb21wbGV4IHByb3BzXHJcbiAgICBsZXQgbG9jYWxBc3BlY3QgPSBFbnRpdHlBc3BlY3QuaXNFbnRpdHkocGFyZW50KSA/IHBhcmVudC5lbnRpdHlBc3BlY3QgOiBwYXJlbnQuY29tcGxleEFzcGVjdDtcclxuICAgIGlmIChsb2NhbEFzcGVjdC5vcmlnaW5hbFZhbHVlc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyBvdGhlcndpc2UgdGhpcyBlbnRyeSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHNlcmlhbGl6YXRpb25cclxuICAgICAgbG9jYWxBc3BlY3Qub3JpZ2luYWxWYWx1ZXNbcHJvcE5hbWVdID0gb2xkVmFsdWUgIT09IHVuZGVmaW5lZCA/IG9sZFZhbHVlIDogcHJvcGVydHkuZGVmYXVsdFZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gaWYgd2UgYXJlIGNoYW5naW5nIHRoZSBrZXkgdXBkYXRlIG91ciBpbnRlcm5hbCBlbnRpdHlHcm91cCBpbmRleGVzLlxyXG4gIGlmIChwcm9wZXJ0eS5pc1BhcnRPZktleSAmJiBlbnRpdHlNYW5hZ2VyICYmICFlbnRpdHlNYW5hZ2VyLmlzTG9hZGluZykge1xyXG4gICAgLy8gJ2VudGl0eVR5cGUnIG9uIHRoZSBuZXh0IGxpbmUgYmUgbnVsbCBmb3IgY29tcGxleCBwcm9wZXJ0aWVzIGJ1dCBpdCB3aWxsIG9ubHkgYmUgcmVmJ2Qgd2l0aGluIHRoaXNcclxuICAgIC8vIGZuIHdoZW4gdGhlIHByb3BlcnR5IGlzIHBhcnQgb2YgdGhlIGtleVxyXG4gICAgbGV0IGVudGl0eVR5cGUgPSAocGFyZW50IGFzIEVudGl0eSkuZW50aXR5VHlwZTtcclxuICAgIGxldCBrZXlQcm9wcyA9IGVudGl0eVR5cGUua2V5UHJvcGVydGllcztcclxuICAgIGxldCB2YWx1ZXMgPSBrZXlQcm9wcy5tYXAoZnVuY3Rpb24gKHApIHtcclxuICAgICAgaWYgKHAgPT09IHByb3BlcnR5KSB7XHJcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBwYXJlbnQuZ2V0UHJvcGVydHkocC5uYW1lKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBsZXQgbmV3S2V5ID0gbmV3IEVudGl0eUtleShlbnRpdHlUeXBlLCB2YWx1ZXMpO1xyXG4gICAgaWYgKGVudGl0eU1hbmFnZXIuZ2V0RW50aXR5QnlLZXkobmV3S2V5KSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbiBlbnRpdHkgd2l0aCB0aGlzIGtleSBpcyBhbHJlYWR5IGluIHRoZSBjYWNoZTogXCIgKyBuZXdLZXkudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICBsZXQgb2xkS2V5ID0gKHBhcmVudCBhcyBFbnRpdHkpLmVudGl0eUFzcGVjdC5nZXRLZXkoKTtcclxuICAgIGxldCBlZyA9IGVudGl0eU1hbmFnZXIuX2ZpbmRFbnRpdHlHcm91cChlbnRpdHlUeXBlKTtcclxuICAgIGVnLl9yZXBsYWNlS2V5KG9sZEtleSwgbmV3S2V5KTtcclxuICB9XHJcblxyXG4gIC8vIHByb2Nlc3MgcmVsYXRlZCB1cGRhdGVzICggdGhlIGludmVyc2UgcmVsYXRpb25zaGlwKSBmaXJzdCBzbyB0aGF0IGNvbGxlY3Rpb24gZHVwcyBjaGVjayB3b3JrcyBwcm9wZXJseS5cclxuICAvLyB1cGRhdGUgaW52ZXJzZSByZWxhdGlvbnNoaXBcclxuXHJcbiAgbGV0IHJlbGF0ZWROYXZQcm9wID0gcHJvcGVydHkucmVsYXRlZE5hdmlnYXRpb25Qcm9wZXJ0eTtcclxuICBpZiAocmVsYXRlZE5hdlByb3AgJiYgZW50aXR5TWFuYWdlcikge1xyXG4gICAgLy8gRXhhbXBsZTogYmlkaXJlY3Rpb25hbCBma0RhdGFQcm9wZXJ0eTogMS0+bjogb3JkZXIgLT4gb3JkZXJEZXRhaWxzXHJcbiAgICAvLyBvcmRlckRldGFpbC5vcmRlcklkIDwtIG5ld09yZGVySWQgfHwgbnVsbFxyXG4gICAgLy8gICAgPT0+IG9yZGVyRGV0YWlsLm9yZGVyID0gbG9va3VwT3JkZXIobmV3T3JkZXJJZClcclxuICAgIC8vICAgID09PiAoc2VlIHNldCBuYXZQcm9wIGFib3ZlKVxyXG4gICAgLy8gICAgICAgYW5kXHJcbiAgICAvLyBFeGFtcGxlOiBiaWRpcmVjdGlvbmFsIGZrRGF0YVByb3BlcnR5OiAxLT4xOiBvcmRlciAtPiBpbnRlcm5hdGlvbmFsT3JkZXJcclxuICAgIC8vIGludGVybmF0aW9uYWxPcmRlci5vcmRlcklkIDwtIG5ld09yZGVySWQgfHwgbnVsbFxyXG4gICAgLy8gICAgPT0+IGludGVybmF0aW9uYWxPcmRlci5vcmRlciA9IGxvb2t1cE9yZGVyKG5ld09yZGVySWQpXHJcbiAgICAvLyAgICA9PT4gKHNlZSBzZXQgbmF2UHJvcCBhYm92ZSlcclxuXHJcbiAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICBsZXQgcmVsYXRlZEVudGl0eTogRW50aXR5O1xyXG4gICAgICBsZXQga2V5OiBFbnRpdHlLZXk7XHJcbiAgICAgIGlmIChyZWxhdGVkTmF2UHJvcC5pbnZGb3JlaWduS2V5TmFtZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gcHJvcGVydHkgaXMgcmVsYXRlZCBieSBmaWVsZCB3aGljaCBpcyBub3QgdGhlIFBLXHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkocmVsYXRlZE5hdlByb3AuZW50aXR5VHlwZS5kZWZhdWx0UmVzb3VyY2VOYW1lKS53aGVyZShyZWxhdGVkTmF2UHJvcC5pbnZGb3JlaWduS2V5TmFtZXNbMF0sICdlcScsIG5ld1ZhbHVlKTtcclxuICAgICAgICBjb25zdCBxcmVzdWx0ID0gZW50aXR5TWFuYWdlci5leGVjdXRlUXVlcnlMb2NhbGx5KHF1ZXJ5KTtcclxuICAgICAgICBpZiAocXJlc3VsdC5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgIHJlbGF0ZWRFbnRpdHkgPSBxcmVzdWx0WzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBwcm9wZXJ0eSBpcyByZWxhdGVkIGJ5IHRoZSBQS1xyXG4gICAgICAgIGtleSA9IG5ldyBFbnRpdHlLZXkocmVsYXRlZE5hdlByb3AuZW50aXR5VHlwZSwgW25ld1ZhbHVlXSk7XHJcbiAgICAgICAgcmVsYXRlZEVudGl0eSA9IGVudGl0eU1hbmFnZXIuZ2V0RW50aXR5QnlLZXkoa2V5KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlbGF0ZWRFbnRpdHkpIHtcclxuICAgICAgICBwYXJlbnQuc2V0UHJvcGVydHkocmVsYXRlZE5hdlByb3AubmFtZSwgcmVsYXRlZEVudGl0eSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gaXQgbWF5IG5vdCBoYXZlIGJlZW4gZmV0Y2hlZCB5ZXQgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGFkZCBpdCBhcyBhbiB1bmF0dGFjaGVkQ2hpbGQuXHJcbiAgICAgICAgaWYgKGtleSkge1xyXG4gICAgICAgICAgLy8gVE9ETyBjdXJyZW50bHkgX2xpbmtSZWxhdGVkZW50aXRpZXMgb25seSB3b3JrcyB3aXRoIFBLIHJlbGF0aW9ucywgc28gd2Ugb25seSBhZGQgdGhvc2UuXHJcbiAgICAgICAgICBlbnRpdHlNYW5hZ2VyLl91bmF0dGFjaGVkQ2hpbGRyZW5NYXAuYWRkQ2hpbGQoa2V5LCByZWxhdGVkTmF2UHJvcCwgcGFyZW50IGFzIEVudGl0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhcmVudC5zZXRQcm9wZXJ0eShyZWxhdGVkTmF2UHJvcC5uYW1lLCBudWxsKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcGFyZW50LnNldFByb3BlcnR5KHJlbGF0ZWROYXZQcm9wLm5hbWUsIG51bGwpO1xyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAocHJvcGVydHkuaW52ZXJzZU5hdmlnYXRpb25Qcm9wZXJ0eSAmJiBlbnRpdHlNYW5hZ2VyICYmICFlbnRpdHlNYW5hZ2VyLl9pbktleUZpeHVwKSB7XHJcbiAgICAvLyBFeGFtcGxlOiB1bmlkaXJlY3Rpb25hbCBma0RhdGFQcm9wZXJ0eTogMS0+bjogcmVnaW9uIC0+IHRlcnJpdG9yaWVzXHJcbiAgICAvLyB0ZXJyaXRvcnkucmVnaW9uSWQgPC0gbmV3UmVnaW9uSWRcclxuICAgIC8vICAgID09PiBsb29rdXBSZWdpb24obmV3UmVnaW9uSWQpLnRlcnJpdG9yaWVzLnB1c2godGVycml0b3J5KVxyXG4gICAgLy8gICAgICAgICAgICAgICAgYW5kXHJcbiAgICAvLyBFeGFtcGxlOiB1bmlkaXJlY3Rpb25hbCBma0RhdGFQcm9wZXJ0eTogMS0+MTogb3JkZXIgLT4gaW50ZXJuYXRpb25hbE9yZGVyXHJcbiAgICAvLyBpbnRlcm5hdGlvbmFsT3JkZXIub3JkZXJJZCA8LSBuZXdPcmRlcklkXHJcbiAgICAvLyAgICA9PT4gbG9va3VwT3JkZXIobmV3T3JkZXJJZCkuaW50ZXJuYXRpb25hbE9yZGVyID0gaW50ZXJuYXRpb25hbE9yZGVyXHJcbiAgICAvLyAgICAgICAgICAgICAgICBhbmRcclxuICAgIC8vIEV4YW1wbGU6IHVuaWRpcmVjdGlvbmFsIGZrRGF0YVByb3BlcnR5OiAxLT5uOiByZWdpb24gLT4gdGVycml0b3JpZXNcclxuICAgIC8vIHRlcnJpdG9yeS5yZWdpb25JZCA8LSBudWxsXHJcbiAgICAvLyAgICA9PT4gbG9va3VwUmVnaW9uKHRlcnJpdG9yeS5vbGRSZWdpb25JZCkudGVycml0b3JpZXMucmVtb3ZlKG9sZFRlcnJpdG9yeSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICBhbmRcclxuICAgIC8vIEV4YW1wbGU6IHVuaWRpcmVjdGlvbmFsIGZrRGF0YVByb3BlcnR5OiAxLT4xOiBvcmRlciAtPiBpbnRlcm5hdGlvbmFsT3JkZXJcclxuICAgIC8vIGludGVybmF0aW9uYWxPcmRlci5vcmRlcklkIDwtIG51bGxcclxuICAgIC8vICAgID09PiBsb29rdXBPcmRlcihpbnRlcm5hdGlvbmFsT3JkZXIub2xkT3JkZXJJZCkuaW50ZXJuYXRpb25hbE9yZGVyID0gbnVsbDtcclxuXHJcbiAgICBsZXQgaW52TmF2UHJvcCA9IHByb3BlcnR5LmludmVyc2VOYXZpZ2F0aW9uUHJvcGVydHk7XHJcblxyXG4gICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHtcclxuICAgICAgbGV0IGtleSA9IG5ldyBFbnRpdHlLZXkoaW52TmF2UHJvcC5wYXJlbnRUeXBlLCBbb2xkVmFsdWVdKTtcclxuICAgICAgbGV0IHJlbGF0ZWRFbnRpdHkgPSBlbnRpdHlNYW5hZ2VyLmdldEVudGl0eUJ5S2V5KGtleSk7XHJcbiAgICAgIGlmIChyZWxhdGVkRW50aXR5KSB7XHJcbiAgICAgICAgaWYgKGludk5hdlByb3AuaXNTY2FsYXIpIHtcclxuICAgICAgICAgIHJlbGF0ZWRFbnRpdHkuc2V0UHJvcGVydHkoaW52TmF2UHJvcC5uYW1lLCBudWxsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gcmVtb3ZlICd0aGlzJyBmcm9tIG9sZCByZWxhdGVkIG5hdiBwcm9wXHJcbiAgICAgICAgICBsZXQgcmVsYXRlZEFycmF5ID0gcmVsYXRlZEVudGl0eS5nZXRQcm9wZXJ0eShpbnZOYXZQcm9wLm5hbWUpO1xyXG4gICAgICAgICAgLy8gYXJyLnNwbGljZShhcnIuaW5kZXhPZih2YWx1ZV90b19yZW1vdmUpLCAxKTtcclxuICAgICAgICAgIHJlbGF0ZWRBcnJheS5zcGxpY2UocmVsYXRlZEFycmF5LmluZGV4T2YocGFyZW50KSwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHtcclxuICAgICAgbGV0IGtleSA9IG5ldyBFbnRpdHlLZXkoaW52TmF2UHJvcC5wYXJlbnRUeXBlLCBbbmV3VmFsdWVdKTtcclxuICAgICAgbGV0IHJlbGF0ZWRFbnRpdHkgPSBlbnRpdHlNYW5hZ2VyLmdldEVudGl0eUJ5S2V5KGtleSk7XHJcblxyXG4gICAgICBpZiAocmVsYXRlZEVudGl0eSkge1xyXG4gICAgICAgIGlmIChpbnZOYXZQcm9wLmlzU2NhbGFyKSB7XHJcbiAgICAgICAgICByZWxhdGVkRW50aXR5LnNldFByb3BlcnR5KGludk5hdlByb3AubmFtZSwgcGFyZW50KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVsYXRlZEVudGl0eS5nZXRQcm9wZXJ0eShpbnZOYXZQcm9wLm5hbWUpLnB1c2gocGFyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gaXQgbWF5IG5vdCBoYXZlIGJlZW4gZmV0Y2hlZCB5ZXQgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGFkZCBpdCBhcyBhbiB1bmF0dGFjaGVkQ2hpbGQuXHJcbiAgICAgICAgZW50aXR5TWFuYWdlci5fdW5hdHRhY2hlZENoaWxkcmVuTWFwLmFkZENoaWxkKGtleSwgaW52TmF2UHJvcCwgcGFyZW50IGFzIEVudGl0eSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICByYXdBY2Nlc3NvckZuKG5ld1ZhbHVlKTtcclxuXHJcbiAgdXBkYXRlU3RhdGVBbmRWYWxpZGF0ZShjb250ZXh0KTtcclxuXHJcbiAgLy8gaWYgKHByb3BlcnR5LmlzUGFydE9mS2V5ICYmICghdGhpcy5jb21wbGV4QXNwZWN0KSkge1xyXG4gIGlmIChwcm9wZXJ0eS5pc1BhcnRPZktleSkge1xyXG4gICAgLy8gcHJvcG9nYXRlIHBrIGNoYW5nZSB0byBhbGwgcmVsYXRlZCBlbnRpdGllcztcclxuICAgIGxldCBlbnRpdHlUeXBlID0gKHBhcmVudCBhcyBFbnRpdHkpLmVudGl0eVR5cGU7XHJcbiAgICBsZXQgcHJvcGVydHlJeCA9IGVudGl0eVR5cGUua2V5UHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5KTtcclxuICAgIC8vIHRoaXMgcGFydCBoYW5kbGVzIG9yZGVyLm9yZGVySWQgPT4gb3JkZXJEZXRhaWwub3JkZXJJZFxyXG4gICAgLy8gYnV0IHdvbid0IGhhbmRsZSBwcm9kdWN0LnByb2R1Y3RJZCA9PiBvcmRlckRldGFpbC5wcm9kdWN0SWQgYmVjYXVzZSBwcm9kdWN0XHJcbiAgICAvLyBkb2Vzbid0IGhhdmUgYW4gb3JkZXJEZXRhaWxzIHByb3BlcnR5LlxyXG4gICAgZW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChucCkge1xyXG4gICAgICBsZXQgaW52ZXJzZU5wID0gbnAuaW52ZXJzZTtcclxuICAgICAgbGV0IGZrTmFtZXMgPSBpbnZlcnNlTnAgPyBpbnZlcnNlTnAuZm9yZWlnbktleU5hbWVzIDogbnAuaW52Rm9yZWlnbktleU5hbWVzO1xyXG5cclxuICAgICAgaWYgKGZrTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcbiAgICAgIGxldCBucFZhbHVlID0gcGFyZW50LmdldFByb3BlcnR5KG5wLm5hbWUpO1xyXG4gICAgICBpZiAoIW5wVmFsdWUpIHJldHVybjtcclxuICAgICAgbGV0IGZrTmFtZSA9IGZrTmFtZXNbcHJvcGVydHlJeF07XHJcbiAgICAgIGlmIChucC5pc1NjYWxhcikge1xyXG4gICAgICAgIG5wVmFsdWUuc2V0UHJvcGVydHkoZmtOYW1lLCBuZXdWYWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbnBWYWx1ZS5zbGljZSgwKS5mb3JFYWNoKGZ1bmN0aW9uIChpdjogYW55KSB7XHJcbiAgICAgICAgICBpdi5zZXRQcm9wZXJ0eShma05hbWUsIG5ld1ZhbHVlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyB0aGlzIGhhbmRsZXMgdW5pZGlyZWN0aW9uYWwgcHJvYmxlbXMgbm90IGNvdmVyZWQgYWJvdmUuXHJcbiAgICBpZiAoZW50aXR5TWFuYWdlcikge1xyXG4gICAgICBsZXQgaW52ZXJzZUZvcmVpZ25LZXlQcm9wZXJ0aWVzID0gZW50aXR5VHlwZS5pbnZlcnNlRm9yZWlnbktleVByb3BlcnRpZXM7XHJcbiAgICAgIGxldCBiYXNlRW50aXR5VHlwZSA9IGVudGl0eVR5cGUuYmFzZUVudGl0eVR5cGU7XHJcbiAgICAgIHdoaWxlIChiYXNlRW50aXR5VHlwZSkge1xyXG4gICAgICAgIGludmVyc2VGb3JlaWduS2V5UHJvcGVydGllcyA9IGludmVyc2VGb3JlaWduS2V5UHJvcGVydGllcy5jb25jYXQoYmFzZUVudGl0eVR5cGUuaW52ZXJzZUZvcmVpZ25LZXlQcm9wZXJ0aWVzKTtcclxuICAgICAgICBiYXNlRW50aXR5VHlwZSA9IGJhc2VFbnRpdHlUeXBlLmJhc2VFbnRpdHlUeXBlO1xyXG4gICAgICB9XHJcbiAgICAgIGludmVyc2VGb3JlaWduS2V5UHJvcGVydGllcy5mb3JFYWNoKChpbnZGa1Byb3ApID0+IHtcclxuICAgICAgICBpZiAoaW52RmtQcm9wLnJlbGF0ZWROYXZpZ2F0aW9uUHJvcGVydHkhLmludmVyc2UgPT0gbnVsbCkge1xyXG4gICAgICAgICAgLy8gdGhpcyBuZXh0IHN0ZXAgbWF5IGJlIHNsb3cgLSBpdCBpdGVyYXRlcyBvdmVyIGFsbCBvZiB0aGUgZW50aXRpZXMgaW4gYSBncm91cDtcclxuICAgICAgICAgIC8vIGhvcGVmdWxseSBpdCBkb2Vzbid0IGhhcHBlbiBvZnRlbi5cclxuICAgICAgICAgIGVudGl0eU1hbmFnZXIhLl91cGRhdGVGa1ZhbChpbnZGa1Byb3AsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpbnN1cmUgdGhhdCBjYWNoZWQga2V5IGlzIHVwZGF0ZWQuXHJcbiAgICBlbnRpdHlBc3BlY3QuZ2V0S2V5KHRydWUpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0RHBWYWx1ZUNvbXBsZXgoY29udGV4dDogSUNvbnRleHQsIHJhd0FjY2Vzc29yRm46IEZ1bmN0aW9uKSB7XHJcbiAgbGV0IHByb3BlcnR5ID0gY29udGV4dC5wcm9wZXJ0eSBhcyBEYXRhUHJvcGVydHk7XHJcbiAgbGV0IG9sZFZhbHVlID0gY29udGV4dC5vbGRWYWx1ZTtcclxuICBsZXQgbmV3VmFsdWUgPSBjb250ZXh0Lm5ld1ZhbHVlO1xyXG5cclxuICAvLyBUbyBnZXQgaGVyZSBpdCBtdXN0IGJlIGEgQ29tcGxleFByb3BlcnR5XHJcbiAgLy8gJ2RhdGFUeXBlJyB3aWxsIGJlIGEgY29tcGxleFR5cGVcclxuICBsZXQgZGF0YVR5cGUgPSBwcm9wZXJ0eS5kYXRhVHlwZSBhcyBDb21wbGV4VHlwZTtcclxuICBpZiAocHJvcGVydHkuaXNTY2FsYXIpIHtcclxuICAgIGlmICghbmV3VmFsdWUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGNvcmUuZm9ybWF0U3RyaW5nKFwiWW91IGNhbm5vdCBzZXQgdGhlICclMScgcHJvcGVydHkgdG8gbnVsbCBiZWNhdXNlIGl0cyBkYXRhdHlwZSBpcyB0aGUgQ29tcGxleFR5cGU6ICclMidcIiwgcHJvcGVydHkubmFtZSwgcHJvcGVydHkuZGF0YVR5cGUubmFtZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghb2xkVmFsdWUpIHtcclxuICAgICAgbGV0IGN0b3IgPSBkYXRhVHlwZS5nZXRDdG9yKCk7XHJcbiAgICAgIG9sZFZhbHVlID0gbmV3IGN0b3IoKTtcclxuICAgICAgcmF3QWNjZXNzb3JGbihvbGRWYWx1ZSk7XHJcbiAgICB9XHJcbiAgICBkYXRhVHlwZS5kYXRhUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChkcCkge1xyXG4gICAgICBsZXQgcG4gPSBkcC5uYW1lO1xyXG4gICAgICBsZXQgbnYgPSBuZXdWYWx1ZS5nZXRQcm9wZXJ0eShwbik7XHJcbiAgICAgIG9sZFZhbHVlLnNldFByb3BlcnR5KHBuLCBudik7XHJcbiAgICB9KTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKGNvcmUuZm9ybWF0U3RyaW5nKFwiWW91IGNhbm5vdCBzZXQgdGhlIG5vbi1zY2FsYXIgY29tcGxleCBwcm9wZXJ0eTogJyUxJyBvbiB0aGUgdHlwZTogJyUyJy5cIiArXHJcbiAgICAgICAgICAgIFwiSW5zdGVhZCBnZXQgdGhlIHByb3BlcnR5IGFuZCB1c2UgYXJyYXkgZnVuY3Rpb25zIGxpa2UgJ3B1c2gnIG9yICdzcGxpY2UnIHRvIGNoYW5nZSBpdHMgY29udGVudHMuXCIsXHJcbiAgICAgICAgcHJvcGVydHkubmFtZSwgcHJvcGVydHkucGFyZW50VHlwZS5uYW1lKSk7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gc2V0TnBWYWx1ZShjb250ZXh0OiBJQ29udGV4dCwgcmF3QWNjZXNzb3JGbjogRnVuY3Rpb24pIHtcclxuXHJcbiAgbGV0IHBhcmVudCA9IGNvbnRleHQucGFyZW50IGFzIEVudGl0eTtcclxuICBsZXQgcHJvcGVydHkgPSBjb250ZXh0LnByb3BlcnR5IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eTtcclxuICBsZXQgZW50aXR5QXNwZWN0ID0gY29udGV4dC5lbnRpdHlBc3BlY3Q7XHJcbiAgbGV0IG9sZFZhbHVlID0gY29udGV4dC5vbGRWYWx1ZTtcclxuICBsZXQgbmV3VmFsdWUgPSBjb250ZXh0Lm5ld1ZhbHVlO1xyXG5cclxuICBpZiAoIXByb3BlcnR5LmlzU2NhbGFyKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb25zY2FsYXIgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSByZWFkb25seSAtIGVudGl0aWVzIGNhbiBiZSBhZGRlZCBvciByZW1vdmVkIGJ1dCB0aGUgY29sbGVjdGlvbiBtYXkgbm90IGJlIGNoYW5nZWQuXCIpO1xyXG4gIH1cclxuXHJcbiAgbGV0IGVudGl0eU1hbmFnZXIgPSBlbnRpdHlBc3BlY3QuZW50aXR5TWFuYWdlcjtcclxuICBsZXQgaW52ZXJzZVByb3AgPSBwcm9wZXJ0eS5pbnZlcnNlO1xyXG5cclxuICAvLyBtYW5hZ2UgYXR0YWNobWVudCAtXHJcbiAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHtcclxuICAgIGlmICghbmV3VmFsdWUuZW50aXR5QXNwZWN0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBuZXdBc3BlY3QgPSBuZXdWYWx1ZS5lbnRpdHlBc3BlY3Q7XHJcbiAgICBpZiAoZW50aXR5TWFuYWdlcikge1xyXG4gICAgICBpZiAobmV3QXNwZWN0LmVudGl0eVN0YXRlLmlzRGV0YWNoZWQoKSkge1xyXG4gICAgICAgIGlmICghZW50aXR5TWFuYWdlci5pc0xvYWRpbmcpIHtcclxuICAgICAgICAgIGVudGl0eU1hbmFnZXIuYXR0YWNoRW50aXR5KG5ld1ZhbHVlLCBFbnRpdHlTdGF0ZS5BZGRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChuZXdBc3BlY3QuZW50aXR5TWFuYWdlciAhPT0gZW50aXR5TWFuYWdlcikge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW4gRW50aXR5IGNhbm5vdCBiZSBhdHRhY2hlZCB0byBhbiBlbnRpdHkgaW4gYW5vdGhlciBFbnRpdHlNYW5hZ2VyLiBPbmUgb2YgdGhlIHR3byBlbnRpdGllcyBtdXN0IGJlIGRldGFjaGVkIGZpcnN0LlwiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChuZXdBc3BlY3QgJiYgbmV3QXNwZWN0LmVudGl0eU1hbmFnZXIpIHtcclxuICAgICAgICBlbnRpdHlNYW5hZ2VyID0gbmV3QXNwZWN0LmVudGl0eU1hbmFnZXI7XHJcbiAgICAgICAgaWYgKCFlbnRpdHlNYW5hZ2VyIS5pc0xvYWRpbmcpIHtcclxuICAgICAgICAgIGVudGl0eU1hbmFnZXIhLmF0dGFjaEVudGl0eShlbnRpdHlBc3BlY3QuZW50aXR5ISwgRW50aXR5U3RhdGUuQWRkZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gcHJvY2VzcyByZWxhdGVkIHVwZGF0ZXMgKCB0aGUgaW52ZXJzZSByZWxhdGlvbnNoaXApIGZpcnN0IHNvIHRoYXQgY29sbGVjdGlvbiBkdXBzIGNoZWNrIHdvcmtzIHByb3Blcmx5LlxyXG4gIC8vIHVwZGF0ZSBpbnZlcnNlIHJlbGF0aW9uc2hpcFxyXG4gIGlmIChpbnZlcnNlUHJvcCkge1xyXG4gICAgLy8vXHJcbiAgICBpZiAoaW52ZXJzZVByb3AuaXNTY2FsYXIpIHtcclxuICAgICAgLy8gRXhhbXBsZTogYmlkaXJlY3Rpb25hbCBuYXZQcm9wZXJ0eTogMS0+MTogb3JkZXIgLT4gaW50ZXJuYXRpb25hbE9yZGVyXHJcbiAgICAgIC8vIG9yZGVyLmludGVybmF0aW9uYWxPcmRlciA8LSBpbnRlcm5hdGlvbmFsT3JkZXIgfHwgbnVsbFxyXG4gICAgICAvLyAgICA9PT4gKG9sZEludGVybmF0aW9uYWxPcmRlci5vcmRlciA9IG51bGwpXHJcbiAgICAgIC8vICAgID09PiBpbnRlcm5hdGlvbmFsT3JkZXIub3JkZXIgPSBvcmRlclxyXG4gICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgIC8vIFRPRE86IG51bGwgLT4gTnVsbEVudGl0eSBsYXRlclxyXG4gICAgICAgIG9sZFZhbHVlLnNldFByb3BlcnR5KGludmVyc2VQcm9wLm5hbWUsIG51bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgbmV3VmFsdWUuc2V0UHJvcGVydHkoaW52ZXJzZVByb3AubmFtZSwgcGFyZW50KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRXhhbXBsZTogYmlkaXJlY3Rpb25hbCBuYXZQcm9wZXJ0eTogMS0+bjogb3JkZXIgLT4gb3JkZXJEZXRhaWxzXHJcbiAgICAgIC8vIG9yZGVyRGV0YWlsLm9yZGVyIDwtIG5ld09yZGVyIHx8IG51bGxcclxuICAgICAgLy8gICAgPT0+IChvbGRPcmRlcikub3JkZXJEZXRhaWxzLnJlbW92ZShvcmRlckRldGFpbClcclxuICAgICAgLy8gICAgPT0+IG9yZGVyLm9yZGVyRGV0YWlscy5wdXNoKG5ld09yZGVyKVxyXG4gICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBvbGRTaWJsaW5ncyA9IG9sZFZhbHVlLmdldFByb3BlcnR5KGludmVyc2VQcm9wLm5hbWUpO1xyXG4gICAgICAgIGxldCBpeCA9IG9sZFNpYmxpbmdzLmluZGV4T2YocGFyZW50KTtcclxuICAgICAgICBpZiAoaXggIT09IC0xKSB7XHJcbiAgICAgICAgICBvbGRTaWJsaW5ncy5zcGxpY2UoaXgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBzaWJsaW5ncyA9IG5ld1ZhbHVlLmdldFByb3BlcnR5KGludmVyc2VQcm9wLm5hbWUpO1xyXG4gICAgICAgIC8vIHJlY3Vyc2lvbiBjaGVjayBpZiBhbHJlYWR5IGluIHRoZSBjb2xsZWN0aW9uIGlzIHBlcmZvcm1lZCBieSB0aGUgcmVsYXRpb25BcnJheVxyXG4gICAgICAgIHNpYmxpbmdzLnB1c2gocGFyZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAocHJvcGVydHkuaW52Rm9yZWlnbktleU5hbWVzICYmIGVudGl0eU1hbmFnZXIgJiYgIWVudGl0eU1hbmFnZXIuX2luS2V5Rml4dXApIHtcclxuICAgIGxldCBpbnZGb3JlaWduS2V5TmFtZXMgPSBwcm9wZXJ0eS5pbnZGb3JlaWduS2V5TmFtZXM7XHJcbiAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAvLyBFeGFtcGxlOiB1bmlkaXJlY3Rpb25hbCBuYXZQcm9wZXJ0eTogMS0+MTogb3JkZXIgLT4gaW50ZXJuYXRpb25hbE9yZGVyXHJcbiAgICAgIC8vIG9yZGVyLkludGVybmF0aW9uYWxPcmRlciA8LSBpbnRlcm5hdGlvbmFsT3JkZXJcclxuICAgICAgLy8gICAgPT0+IGludGVybmF0aW9uYWxPcmRlci5vcmRlcklkID0gb3JkZXJJZFxyXG4gICAgICAvLyAgICAgIGFuZFxyXG4gICAgICAvLyBFeGFtcGxlOiB1bmlkaXJlY3Rpb25hbCBuYXZQcm9wZXJ0eTogMS0+bjogb3JkZXIgLT4gb3JkZXJEZXRhaWxzXHJcbiAgICAgIC8vIG9yZGVyRGV0YWlsLm9yZGVyIDwteHh4IG5ld09yZGVyXHJcbiAgICAgIC8vICAgID09PiBDQU4nVCBIQVBQRU4gYmVjYXVzZSBpZiB1bmlkaXJlY3Rpb25hbCBiZWNhdXNlIG9yZGVyRGV0YWlsIHdpbGwgbm90IGhhdmUgYW4gb3JkZXIgcHJvcFxyXG4gICAgICBsZXQgcGtWYWx1ZXMgPSBwYXJlbnQuZW50aXR5QXNwZWN0LmdldEtleSgpLnZhbHVlcztcclxuICAgICAgaW52Rm9yZWlnbktleU5hbWVzLmZvckVhY2goIChma05hbWUsIGkpID0+IHtcclxuICAgICAgICBuZXdWYWx1ZSEuc2V0UHJvcGVydHkoZmtOYW1lLCBwa1ZhbHVlc1tpXSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRXhhbXBsZTogdW5pZGlyZWN0aW9uYWwgbmF2UHJvcGVydHk6IDEtPjE6IG9yZGVyIC0+IGludGVybmF0aW9uYWxPcmRlclxyXG4gICAgICAvLyBvcmRlci5pbnRlcm5hdGlvbmFsT3JkZXIgPC0gbnVsbFxyXG4gICAgICAvLyAgICA9PT4gKG9sZCBpbnRlcm5hdGlvbmFsT3JkZXIpLm9yZGVySWQgPSBudWxsXHJcbiAgICAgIC8vICAgICAgICBhbmRcclxuICAgICAgLy8gRXhhbXBsZTogdW5pZGlyZWN0aW9uYWwgbmF2UHJvcGVydHk6IDEtPm46IG9yZGVyIC0+IG9yZGVyRGV0YWlsc1xyXG4gICAgICAvLyBvcmRlckRldGFpbC5vcmRlciA8LXh4eCBuZXdPcmRlclxyXG4gICAgICAvLyAgICA9PT4gQ0FOJ1QgSEFQUEVOIGJlY2F1c2UgaWYgdW5pZGlyZWN0aW9uYWwgYmVjYXVzZSBvcmRlckRldGFpbCB3aWxsIG5vdCBoYXZlIGFuIG9yZGVyIHByb3BcclxuICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICBpbnZGb3JlaWduS2V5TmFtZXMuZm9yRWFjaCggKGZrTmFtZSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGZrUHJvcCA9IG9sZFZhbHVlLmVudGl0eVR5cGUuZ2V0UHJvcGVydHkoZmtOYW1lKTtcclxuICAgICAgICAgIGlmICghZmtQcm9wLmlzUGFydE9mS2V5KSB7XHJcbiAgICAgICAgICAgIC8vIGRvbid0IHVwZGF0ZSB3aXRoIG51bGwgaWYgZmsgaXMgcGFydCBvZiB0aGUga2V5XHJcbiAgICAgICAgICAgIG9sZFZhbHVlLnNldFByb3BlcnR5KGZrTmFtZSwgbnVsbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJhd0FjY2Vzc29yRm4obmV3VmFsdWUpO1xyXG5cclxuICB1cGRhdGVTdGF0ZUFuZFZhbGlkYXRlKGNvbnRleHQpO1xyXG5cclxuICAvLyB1cGRhdGUgZmsgZGF0YSBwcm9wZXJ0eSAtIHRoaXMgY2FuIG9ubHkgb2NjdXIgaWYgdGhpcyBuYXZQcm9wZXJ0eSBoYXNcclxuICAvLyBhIGNvcnJlc3BvbmRpbmcgZmsgb24gdGhpcyBlbnRpdHkuXHJcbiAgaWYgKHByb3BlcnR5LnJlbGF0ZWREYXRhUHJvcGVydGllcykge1xyXG4gICAgbGV0IGVudGl0eVN0YXRlID0gZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlO1xyXG4gICAgLy8gaWYgZWl0aGVyIHNpZGUgb2YgbmF2IHByb3AgaXMgZGV0YWNoZWQgZG9uJ3QgY2xlYXIgZmtzLiBOb3RlOiBvbGRWYWx1ZSBpbiBuZXh0IGxpbmUgY2Fubm90IGJlIG51bGwgc28gbm8gY2hlY2sgaXMgbmVlZGVkLlxyXG4gICAgaWYgKG5ld1ZhbHVlID09IG51bGwgJiYgKGVudGl0eVN0YXRlLmlzRGV0YWNoZWQoKSB8fCBvbGRWYWx1ZS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUuaXNEZXRhY2hlZCgpKSkgcmV0dXJuO1xyXG4gICAgaWYgKGVudGl0eVN0YXRlLmlzRGVsZXRlZCgpKSByZXR1cm47XHJcblxyXG4gICAgLy8gd2UgbWF5IGhhdmUgaW52ZXJzZSBwcm9wcyBpbmRpY2F0aW5nIHRoZSByZWxhdGVkIHByb3Agb24gdGhlIG90aGVyIGVudGl0eSwgaWYgaXQgaXMgbm90IHRoZSBvdGhlciBlbnRpdHkncyBQS1xyXG4gICAgbGV0IGludmVyc2VLZXlQcm9wcyA9IHByb3BlcnR5LmludkZvcmVpZ25LZXlOYW1lcztcclxuICAgIGlmICghKGludmVyc2VLZXlQcm9wcyAmJiBpbnZlcnNlS2V5UHJvcHMubGVuZ3RoKSkge1xyXG4gICAgICAvLyBvdGhlcndpc2UsIHRoaXMgcHJvcCBpcyByZWxhdGVkIHRvIHRoZSBvdGhlciBlbnRpdHkncyBQS1xyXG4gICAgICBpbnZlcnNlS2V5UHJvcHMgPSBwcm9wZXJ0eS5lbnRpdHlUeXBlLmtleVByb3BlcnRpZXMubWFwKGsgPT4gay5uYW1lKTtcclxuICAgIH1cclxuICAgIGludmVyc2VLZXlQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChrZXlQcm9wLCBpKSB7XHJcbiAgICAgIGxldCByZWxhdGVkRGF0YVByb3AgPSBwcm9wZXJ0eS5yZWxhdGVkRGF0YVByb3BlcnRpZXNbaV07XHJcbiAgICAgIC8vIERvIG5vdCB0cmFzaCByZWxhdGVkIHByb3BlcnR5IGlmIGl0IGlzIHBhcnQgb2YgdGhhdCBlbnRpdHkncyBrZXlcclxuICAgICAgaWYgKG5ld1ZhbHVlIHx8ICFyZWxhdGVkRGF0YVByb3AuaXNQYXJ0T2ZLZXkpIHtcclxuICAgICAgICBsZXQgcmVsYXRlZFZhbHVlID0gbmV3VmFsdWUgPyBuZXdWYWx1ZS5nZXRQcm9wZXJ0eShrZXlQcm9wKSA6IHJlbGF0ZWREYXRhUHJvcC5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgcGFyZW50LnNldFByb3BlcnR5KHJlbGF0ZWREYXRhUHJvcC5uYW1lLCByZWxhdGVkVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBvc3RDaGFuZ2VFdmVudHMoY29udGV4dDogSUNvbnRleHQpIHtcclxuICBsZXQgZW50aXR5QXNwZWN0ID0gY29udGV4dC5lbnRpdHlBc3BlY3Q7XHJcblxyXG4gIGxldCBlbnRpdHlNYW5hZ2VyID0gZW50aXR5QXNwZWN0LmVudGl0eU1hbmFnZXI7XHJcbiAgbGV0IGVudGl0eSA9IGVudGl0eUFzcGVjdC5lbnRpdHk7XHJcblxyXG4gIGxldCBwcm9wQ2hhbmdlZEFyZ3MgPSB7IGVudGl0eTogZW50aXR5ISwgcGFyZW50OiBjb250ZXh0LnBhcmVudCwgcHJvcGVydHk6IGNvbnRleHQucHJvcGVydHksIHByb3BlcnR5TmFtZTogY29udGV4dC5wcm9wZXJ0eU5hbWUsIG9sZFZhbHVlOiBjb250ZXh0Lm9sZFZhbHVlLCBuZXdWYWx1ZTogY29udGV4dC5uZXdWYWx1ZSB9O1xyXG4gIGlmIChlbnRpdHlNYW5hZ2VyKSB7XHJcbiAgICAvLyBwcm9wZXJ0eUNoYW5nZWQgd2lsbCBiZSBmaXJlZCBkdXJpbmcgbG9hZGluZyBidXQgd2Ugb25seSB3YW50IHRvIGZpcmUgaXQgb25jZSBwZXIgZW50aXR5LCBub3Qgb25jZSBwZXIgcHJvcGVydHkuXHJcbiAgICAvLyBzbyBwcm9wZXJ0eUNoYW5nZWQgaXMgZmlyZWQgaW4gdGhlIGVudGl0eU1hbmFnZXIgbWVyZ2VFbnRpdHkgbWV0aG9kIGlmIG5vdCBmaXJlZCBoZXJlLlxyXG4gICAgaWYgKCghZW50aXR5TWFuYWdlci5pc0xvYWRpbmcpICYmICghZW50aXR5TWFuYWdlci5pc1JlamVjdGluZ0NoYW5nZXMpKSB7XHJcbiAgICAgIGVudGl0eUFzcGVjdC5wcm9wZXJ0eUNoYW5nZWQucHVibGlzaChwcm9wQ2hhbmdlZEFyZ3MpO1xyXG4gICAgICAvLyBkb24ndCBmaXJlIGVudGl0eUNoYW5nZWQgZXZlbnQgaWYgcHJvcGVydHlDaGFuZ2VkIGlzIHN1cHByZXNzZWQuXHJcbiAgICAgIGVudGl0eU1hbmFnZXIuZW50aXR5Q2hhbmdlZC5wdWJsaXNoKHsgZW50aXR5QWN0aW9uOiBFbnRpdHlBY3Rpb24uUHJvcGVydHlDaGFuZ2UsIGVudGl0eTogZW50aXR5LCBhcmdzOiBwcm9wQ2hhbmdlZEFyZ3MgfSk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGVudGl0eUFzcGVjdC5wcm9wZXJ0eUNoYW5nZWQucHVibGlzaChwcm9wQ2hhbmdlZEFyZ3MpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlU3RhdGVBbmRWYWxpZGF0ZShjb250ZXh0OiBJQ29udGV4dCkge1xyXG4gIGxldCBlbnRpdHlBc3BlY3QgPSBjb250ZXh0LmVudGl0eUFzcGVjdDtcclxuICBsZXQgZW50aXR5TWFuYWdlciA9IGVudGl0eUFzcGVjdC5lbnRpdHlNYW5hZ2VyO1xyXG4gIGlmIChlbnRpdHlNYW5hZ2VyID09IG51bGwgfHwgZW50aXR5TWFuYWdlci5pc0xvYWRpbmcpIHJldHVybjtcclxuICBsZXQgcHJvcGVydHkgPSBjb250ZXh0LnByb3BlcnR5O1xyXG5cclxuICBpZiAoZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlLmlzVW5jaGFuZ2VkKCkgJiYgIXByb3BlcnR5LmlzVW5tYXBwZWQpIHtcclxuICAgIGVudGl0eUFzcGVjdC5zZXRNb2RpZmllZCgpO1xyXG4gIH1cclxuXHJcbiAgaWYgKGVudGl0eU1hbmFnZXIudmFsaWRhdGlvbk9wdGlvbnMudmFsaWRhdGVPblByb3BlcnR5Q2hhbmdlKSB7XHJcbiAgICAvLyBlbnRpdHlBc3BlY3QuZW50aXR5IGlzIE5PVCB0aGUgc2FtZSBhcyBwYXJlbnQgaW4gdGhlIGNvZGUgYmVsb3cuIEl0J3MgdXNlIGlzIGRlbGliZXJhdGUuXHJcbiAgICBlbnRpdHlBc3BlY3QuX3ZhbGlkYXRlUHJvcGVydHkoY29udGV4dC5uZXdWYWx1ZSxcclxuICAgICAgICB7IGVudGl0eTogZW50aXR5QXNwZWN0LmVudGl0eSwgcHJvcGVydHk6IHByb3BlcnR5LCBwcm9wZXJ0eU5hbWU6IGNvbnRleHQucHJvcGVydHlOYW1lLCBvbGRWYWx1ZTogY29udGV4dC5vbGRWYWx1ZSB9KTtcclxuICB9XHJcbn1cclxuIl19
|