@decaf-ts/integrations 0.4.0 → 0.4.1-0

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 (1068) hide show
  1. package/README.md +11 -3
  2. package/dist/integrations.cjs +2087 -2
  3. package/dist/integrations.js +2356 -2
  4. package/jest.config.cjs +1 -1
  5. package/lib/cjs/blob/azure/AzureBlobStoreService.cjs +2 -2
  6. package/lib/cjs/blob/azure/index.cjs +2 -2
  7. package/lib/cjs/blob/core/BlobErrors.cjs +2 -2
  8. package/lib/cjs/blob/core/BlobKey.cjs +2 -2
  9. package/lib/cjs/blob/core/BlobStoreFactory.cjs +2 -2
  10. package/lib/cjs/blob/core/BlobStoreService.cjs +2 -2
  11. package/lib/cjs/blob/core/BlobTypes.cjs +2 -2
  12. package/lib/cjs/blob/core/BlobValue.cjs +2 -2
  13. package/lib/cjs/blob/core/index.cjs +2 -2
  14. package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs +2 -2
  15. package/lib/cjs/blob/gcp/index.cjs +2 -2
  16. package/lib/cjs/blob/index.cjs +2 -2
  17. package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs +2 -2
  18. package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs +2 -2
  19. package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs +2 -2
  20. package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs +2 -2
  21. package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs +2 -2
  22. package/lib/cjs/blob/ipfs/index.cjs +2 -2
  23. package/lib/cjs/blob/local/LocalBlobStoreService.cjs +2 -2
  24. package/lib/cjs/blob/local/index.cjs +2 -2
  25. package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs +2 -2
  26. package/lib/cjs/blob/memory/index.cjs +2 -2
  27. package/lib/cjs/blob/s3/MinioBlobStoreService.cjs +2 -2
  28. package/lib/cjs/blob/s3/R2BlobStoreService.cjs +2 -2
  29. package/lib/cjs/blob/s3/S3BlobStoreService.cjs +2 -2
  30. package/lib/cjs/blob/s3/index.cjs +2 -2
  31. package/lib/cjs/docker/DockerComposeService.cjs +2 -2
  32. package/lib/cjs/docker/index.cjs +2 -2
  33. package/lib/cjs/feature-flags/constants.cjs +16 -0
  34. package/lib/cjs/feature-flags/decorators.cjs +65 -0
  35. package/lib/cjs/feature-flags/environment.cjs +26 -0
  36. package/lib/cjs/feature-flags/index.cjs +31 -0
  37. package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs +81 -0
  38. package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs +78 -0
  39. package/lib/cjs/feature-flags/readers/FeatureFlagReader.cjs +25 -0
  40. package/lib/cjs/feature-flags/readers/index.cjs +19 -0
  41. package/lib/cjs/feature-flags/services/FeatureFlag.service.cjs +259 -0
  42. package/lib/cjs/feature-flags/types.cjs +4 -0
  43. package/lib/cjs/feature-flags/utils.cjs +141 -0
  44. package/lib/cjs/graph/engine/constants.cjs +2 -2
  45. package/lib/cjs/graph/engine/decorators.cjs +2 -2
  46. package/lib/cjs/graph/engine/errors/GraphCycleError.cjs +2 -2
  47. package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs +2 -2
  48. package/lib/cjs/graph/engine/errors/GraphInputError.cjs +2 -2
  49. package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs +2 -2
  50. package/lib/cjs/graph/engine/errors/GraphPinningError.cjs +2 -2
  51. package/lib/cjs/graph/engine/errors/GraphPortError.cjs +2 -2
  52. package/lib/cjs/graph/engine/errors/GraphStoreError.cjs +2 -2
  53. package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs +2 -2
  54. package/lib/cjs/graph/engine/errors/index.cjs +2 -2
  55. package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs +2 -2
  56. package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs +2 -2
  57. package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs +2 -2
  58. package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs +2 -2
  59. package/lib/cjs/graph/engine/events/index.cjs +2 -2
  60. package/lib/cjs/graph/engine/execution/CodeGraphNodeExecutor.cjs +2 -2
  61. package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs +2 -2
  62. package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs +2 -2
  63. package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs +2 -2
  64. package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs +2 -2
  65. package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs +2 -2
  66. package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs +2 -2
  67. package/lib/cjs/graph/engine/execution/IsolatedVmCodeSandboxEvaluator.cjs +2 -2
  68. package/lib/cjs/graph/engine/execution/LogGraphNodeExecutor.cjs +2 -2
  69. package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs +2 -2
  70. package/lib/cjs/graph/engine/execution/index.cjs +2 -2
  71. package/lib/cjs/graph/engine/index.cjs +2 -2
  72. package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs +2 -2
  73. package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs +2 -2
  74. package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs +2 -2
  75. package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs +2 -2
  76. package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs +2 -2
  77. package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs +2 -2
  78. package/lib/cjs/graph/engine/loops/index.cjs +2 -2
  79. package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs +2 -2
  80. package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs +2 -2
  81. package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs +2 -2
  82. package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs +2 -2
  83. package/lib/cjs/graph/engine/pinning/index.cjs +2 -2
  84. package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs +2 -2
  85. package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs +2 -2
  86. package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs +2 -2
  87. package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs +2 -2
  88. package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs +2 -2
  89. package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs +2 -2
  90. package/lib/cjs/graph/engine/planning/GraphTopology.cjs +2 -2
  91. package/lib/cjs/graph/engine/planning/index.cjs +2 -2
  92. package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs +2 -2
  93. package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs +2 -2
  94. package/lib/cjs/graph/engine/registry/index.cjs +2 -2
  95. package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs +2 -2
  96. package/lib/cjs/graph/engine/snapshots/index.cjs +2 -2
  97. package/lib/cjs/graph/engine/store/GraphCachedValue.cjs +2 -2
  98. package/lib/cjs/graph/engine/store/GraphValueKey.cjs +2 -2
  99. package/lib/cjs/graph/engine/store/GraphValueStore.cjs +2 -2
  100. package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs +2 -2
  101. package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs +2 -2
  102. package/lib/cjs/graph/engine/store/index.cjs +2 -2
  103. package/lib/cjs/graph/engine/types.cjs +2 -2
  104. package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs +2 -2
  105. package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs +2 -2
  106. package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs +2 -2
  107. package/lib/cjs/graph/engine/validation/index.cjs +2 -2
  108. package/lib/cjs/graph/index.cjs +2 -2
  109. package/lib/cjs/graph/shared/constants.cjs +2 -2
  110. package/lib/cjs/graph/shared/index.cjs +2 -2
  111. package/lib/cjs/graph/shared/nodes/agent.cjs +2 -2
  112. package/lib/cjs/graph/shared/nodes/base.cjs +2 -2
  113. package/lib/cjs/graph/shared/nodes/category-styles.cjs +2 -2
  114. package/lib/cjs/graph/shared/nodes/flow-control.cjs +2 -2
  115. package/lib/cjs/graph/shared/nodes/index.cjs +2 -2
  116. package/lib/cjs/graph/shared/nodes/triggers.cjs +2 -2
  117. package/lib/cjs/graph/shared/types.cjs +2 -2
  118. package/lib/cjs/index.cjs +6 -5
  119. package/lib/cjs/keycloak/index.cjs +2 -2
  120. package/lib/cjs/keycloak/services/KeycloakAuthService.cjs +2 -2
  121. package/lib/cjs/keycloak/services/KeycloakClientService.cjs +2 -2
  122. package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs +2 -2
  123. package/lib/cjs/keycloak/services/KeycloakRealmService.cjs +2 -2
  124. package/lib/cjs/keycloak/services/KeycloakRoleService.cjs +2 -2
  125. package/lib/cjs/keycloak/services/KeycloakService.cjs +2 -2
  126. package/lib/cjs/keycloak/services/KeycloakUserService.cjs +2 -2
  127. package/lib/cjs/keycloak/services/index.cjs +2 -2
  128. package/lib/cjs/keycloak/services/runtime.cjs +2 -2
  129. package/lib/cjs/keycloak/types.cjs +2 -2
  130. package/lib/cjs/kibana/builders/KibanaIndexBuilder.cjs +329 -0
  131. package/lib/cjs/kibana/builders/KibanaIndexBuilderCollection.cjs +37 -0
  132. package/lib/cjs/kibana/builders/index.cjs +20 -0
  133. package/lib/cjs/kibana/helpers.cjs +20 -16
  134. package/lib/cjs/kibana/index.cjs +3 -2
  135. package/lib/cjs/kibana/services/KibanaAuthService.cjs +2 -2
  136. package/lib/cjs/kibana/services/KibanaDashboardService.cjs +2 -2
  137. package/lib/cjs/kibana/services/KibanaDataViewService.cjs +2 -2
  138. package/lib/cjs/kibana/services/KibanaRoleService.cjs +2 -2
  139. package/lib/cjs/kibana/services/KibanaService.cjs +2 -2
  140. package/lib/cjs/kibana/services/KibanaSpaceService.cjs +2 -2
  141. package/lib/cjs/kibana/services/KibanaUserService.cjs +2 -2
  142. package/lib/cjs/kibana/services/index.cjs +2 -2
  143. package/lib/cjs/kibana/services/runtime.cjs +2 -2
  144. package/lib/cjs/kibana/types.cjs +11 -2
  145. package/lib/cjs/loader/ObjectLoader.cjs +154 -0
  146. package/lib/cjs/loader/families.cjs +78 -0
  147. package/lib/cjs/loader/index.cjs +28 -0
  148. package/lib/cjs/loader/types.cjs +4 -0
  149. package/lib/cjs/namespaces/index.cjs +2 -2
  150. package/lib/cjs/namespaces/models/authorization-model.cjs +2 -2
  151. package/lib/cjs/namespaces/models/effective-permission.model.cjs +2 -2
  152. package/lib/cjs/namespaces/models/group-membership.model.cjs +2 -2
  153. package/lib/cjs/namespaces/models/group.model.cjs +2 -2
  154. package/lib/cjs/namespaces/models/index.cjs +2 -2
  155. package/lib/cjs/namespaces/models/inheritance-block.model.cjs +2 -2
  156. package/lib/cjs/namespaces/models/org-unit-closure.model.cjs +2 -2
  157. package/lib/cjs/namespaces/models/org-unit-membership.model.cjs +2 -2
  158. package/lib/cjs/namespaces/models/org-unit-profile.model.cjs +2 -2
  159. package/lib/cjs/namespaces/models/org-unit.model.cjs +2 -2
  160. package/lib/cjs/namespaces/models/permission.model.cjs +2 -2
  161. package/lib/cjs/namespaces/models/principal.model.cjs +2 -2
  162. package/lib/cjs/namespaces/models/protected-resource.model.cjs +2 -2
  163. package/lib/cjs/namespaces/models/resource-grant.model.cjs +2 -2
  164. package/lib/cjs/namespaces/models/role-assignment.model.cjs +2 -2
  165. package/lib/cjs/namespaces/models/role-permission.model.cjs +2 -2
  166. package/lib/cjs/namespaces/models/role.model.cjs +2 -2
  167. package/lib/cjs/namespaces/models/storage-binding.model.cjs +2 -2
  168. package/lib/cjs/namespaces/models/tenant-membership.model.cjs +2 -2
  169. package/lib/cjs/namespaces/models/tenant-profile.model.cjs +2 -2
  170. package/lib/cjs/namespaces/models/tenant.model.cjs +2 -2
  171. package/lib/cjs/namespaces/models/user.model.cjs +2 -2
  172. package/lib/cjs/namespaces/org-based-authorization-system.cjs +2 -2
  173. package/lib/cjs/namespaces/org-based-authorization-system.models.cjs +2 -2
  174. package/lib/cjs/namespaces/org-based-authorization-system.services.cjs +2 -2
  175. package/lib/cjs/namespaces/services/authz.service.cjs +2 -2
  176. package/lib/cjs/namespaces/services/bootstrap.service.cjs +2 -2
  177. package/lib/cjs/namespaces/services/effective-permission.service.cjs +2 -2
  178. package/lib/cjs/namespaces/services/group-membership.service.cjs +2 -2
  179. package/lib/cjs/namespaces/services/group.service.cjs +2 -2
  180. package/lib/cjs/namespaces/services/index.cjs +2 -2
  181. package/lib/cjs/namespaces/services/inheritance-block.service.cjs +2 -2
  182. package/lib/cjs/namespaces/services/org-unit-closure.service.cjs +2 -2
  183. package/lib/cjs/namespaces/services/org-unit-membership.service.cjs +2 -2
  184. package/lib/cjs/namespaces/services/org-unit-profile.service.cjs +2 -2
  185. package/lib/cjs/namespaces/services/org-unit.service.cjs +2 -2
  186. package/lib/cjs/namespaces/services/permission.service.cjs +2 -2
  187. package/lib/cjs/namespaces/services/principal.service.cjs +2 -2
  188. package/lib/cjs/namespaces/services/protected-resource.service.cjs +2 -2
  189. package/lib/cjs/namespaces/services/resource-grant.service.cjs +2 -2
  190. package/lib/cjs/namespaces/services/resource-lifecycle.service.cjs +2 -2
  191. package/lib/cjs/namespaces/services/role-assignment.service.cjs +2 -2
  192. package/lib/cjs/namespaces/services/role-permission.service.cjs +2 -2
  193. package/lib/cjs/namespaces/services/role.service.cjs +2 -2
  194. package/lib/cjs/namespaces/services/storage-binding.service.cjs +2 -2
  195. package/lib/cjs/namespaces/services/system-management.service.cjs +2 -2
  196. package/lib/cjs/namespaces/services/tenant-membership.service.cjs +2 -2
  197. package/lib/cjs/namespaces/services/tenant-profile.service.cjs +2 -2
  198. package/lib/cjs/namespaces/services/tenant.service.cjs +2 -2
  199. package/lib/cjs/namespaces/services/user.service.cjs +2 -2
  200. package/lib/cjs/namespaces/types.cjs +2 -2
  201. package/lib/cjs/namespaces/utils.cjs +2 -2
  202. package/lib/cjs/nest/decorators.cjs +17 -0
  203. package/lib/cjs/nest/graph/GraphExecutionController.cjs +2 -2
  204. package/lib/cjs/nest/graph/GraphExecutionModule.cjs +2 -2
  205. package/lib/cjs/nest/graph/GraphExecutionResultModel.cjs +2 -2
  206. package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.cjs +2 -2
  207. package/lib/cjs/nest/graph/GraphResultService.cjs +2 -2
  208. package/lib/cjs/nest/graph/GraphWorkflowModel.cjs +2 -2
  209. package/lib/cjs/nest/graph/GraphWorkflowService.cjs +2 -2
  210. package/lib/cjs/nest/graph/index.cjs +2 -2
  211. package/lib/cjs/nest/graph/main.cjs +2 -2
  212. package/lib/cjs/nest/index.cjs +3 -3
  213. package/lib/cjs/nest/keycloakAuthHandler.cjs +74 -35
  214. package/lib/cjs/nest/keycloakModule.cjs +7 -10
  215. package/lib/cjs/nest/logging.cjs +2 -2
  216. package/lib/cjs/nest/types.cjs +2 -2
  217. package/lib/cjs/nest/utils.cjs +58 -50
  218. package/lib/cjs/plugins/contract.cjs +76 -0
  219. package/lib/cjs/plugins/index.cjs +35 -0
  220. package/lib/cjs/plugins/kibana/host.cjs +24 -0
  221. package/lib/cjs/plugins/kibana/index.cjs +38 -0
  222. package/lib/cjs/plugins/kibana/installer.cjs +180 -0
  223. package/lib/cjs/plugins/kibana/manifest.cjs +33 -0
  224. package/lib/cjs/plugins/kibana/templates.cjs +503 -0
  225. package/lib/cjs/plugins/kibana/types.cjs +33 -0
  226. package/lib/cjs/plugins/superset/host.cjs +26 -0
  227. package/lib/cjs/plugins/superset/index.cjs +40 -0
  228. package/lib/cjs/plugins/superset/installer.cjs +232 -0
  229. package/lib/cjs/plugins/superset/manifest.cjs +35 -0
  230. package/lib/cjs/plugins/superset/templates.cjs +844 -0
  231. package/lib/cjs/plugins/superset/types.cjs +39 -0
  232. package/lib/cjs/secrets/aws/AwsSecretService.cjs +2 -2
  233. package/lib/cjs/secrets/aws/AwsSecretServiceConfig.cjs +2 -2
  234. package/lib/cjs/secrets/aws/index.cjs +2 -2
  235. package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs +2 -2
  236. package/lib/cjs/secrets/azure/AzureKeyVaultSecretServiceConfig.cjs +2 -2
  237. package/lib/cjs/secrets/azure/index.cjs +2 -2
  238. package/lib/cjs/secrets/core/SecretErrors.cjs +2 -2
  239. package/lib/cjs/secrets/core/SecretName.cjs +2 -2
  240. package/lib/cjs/secrets/core/SecretReference.cjs +2 -2
  241. package/lib/cjs/secrets/core/SecretSerialization.cjs +2 -2
  242. package/lib/cjs/secrets/core/SecretService.cjs +2 -2
  243. package/lib/cjs/secrets/core/SecretTypes.cjs +2 -2
  244. package/lib/cjs/secrets/core/index.cjs +2 -2
  245. package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs +2 -2
  246. package/lib/cjs/secrets/gcp/GcpSecretManagerServiceConfig.cjs +2 -2
  247. package/lib/cjs/secrets/gcp/index.cjs +2 -2
  248. package/lib/cjs/secrets/index.cjs +2 -2
  249. package/lib/cjs/secrets/model/ModelSecretCrypto.cjs +2 -2
  250. package/lib/cjs/secrets/model/ModelSecretService.cjs +2 -2
  251. package/lib/cjs/secrets/model/ModelSecretServiceConfig.cjs +2 -2
  252. package/lib/cjs/secrets/model/Secret.cjs +2 -2
  253. package/lib/cjs/secrets/model/index.cjs +2 -2
  254. package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs +2 -2
  255. package/lib/cjs/secrets/onepassword/OnePasswordSecretServiceConfig.cjs +2 -2
  256. package/lib/cjs/secrets/onepassword/index.cjs +2 -2
  257. package/lib/cjs/secrets/vault/VaultSecretService.cjs +2 -2
  258. package/lib/cjs/secrets/vault/VaultSecretServiceConfig.cjs +2 -2
  259. package/lib/cjs/secrets/vault/index.cjs +2 -2
  260. package/lib/cjs/shared/runtime.cjs +2 -2
  261. package/lib/cjs/utils.cjs +2 -2
  262. package/lib/esm/blob/azure/AzureBlobStoreService.js +1 -1
  263. package/lib/esm/blob/azure/index.js +1 -1
  264. package/lib/esm/blob/core/BlobErrors.js +1 -1
  265. package/lib/esm/blob/core/BlobKey.js +1 -1
  266. package/lib/esm/blob/core/BlobStoreFactory.js +1 -1
  267. package/lib/esm/blob/core/BlobStoreService.js +1 -1
  268. package/lib/esm/blob/core/BlobTypes.js +1 -1
  269. package/lib/esm/blob/core/BlobValue.js +1 -1
  270. package/lib/esm/blob/core/index.js +1 -1
  271. package/lib/esm/blob/gcp/GcsBlobStoreService.js +1 -1
  272. package/lib/esm/blob/gcp/index.js +1 -1
  273. package/lib/esm/blob/index.js +1 -1
  274. package/lib/esm/blob/ipfs/IpfsBlobStoreService.js +1 -1
  275. package/lib/esm/blob/ipfs/IpfsKeyIndex.js +1 -1
  276. package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js +1 -1
  277. package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js +1 -1
  278. package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js +1 -1
  279. package/lib/esm/blob/ipfs/index.js +1 -1
  280. package/lib/esm/blob/local/LocalBlobStoreService.js +1 -1
  281. package/lib/esm/blob/local/index.js +1 -1
  282. package/lib/esm/blob/memory/MemoryBlobStoreService.js +1 -1
  283. package/lib/esm/blob/memory/index.js +1 -1
  284. package/lib/esm/blob/s3/MinioBlobStoreService.js +1 -1
  285. package/lib/esm/blob/s3/R2BlobStoreService.js +1 -1
  286. package/lib/esm/blob/s3/S3BlobStoreService.js +1 -1
  287. package/lib/esm/blob/s3/index.js +1 -1
  288. package/lib/esm/docker/DockerComposeService.js +1 -1
  289. package/lib/esm/docker/index.js +1 -1
  290. package/lib/esm/feature-flags/constants.js +12 -0
  291. package/lib/esm/feature-flags/decorators.js +49 -0
  292. package/lib/esm/feature-flags/environment.js +18 -0
  293. package/lib/esm/feature-flags/index.js +14 -0
  294. package/lib/esm/feature-flags/models/FeatureFlag.model.js +72 -0
  295. package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js +69 -0
  296. package/lib/esm/feature-flags/readers/FeatureFlagReader.js +19 -0
  297. package/lib/esm/feature-flags/readers/index.js +2 -0
  298. package/lib/esm/feature-flags/services/FeatureFlag.service.js +250 -0
  299. package/lib/esm/feature-flags/types.js +2 -0
  300. package/lib/esm/feature-flags/utils.js +126 -0
  301. package/lib/esm/graph/engine/constants.js +1 -1
  302. package/lib/esm/graph/engine/decorators.js +1 -1
  303. package/lib/esm/graph/engine/errors/GraphCycleError.js +1 -1
  304. package/lib/esm/graph/engine/errors/GraphExecutionError.js +1 -1
  305. package/lib/esm/graph/engine/errors/GraphInputError.js +1 -1
  306. package/lib/esm/graph/engine/errors/GraphLoopLimitError.js +1 -1
  307. package/lib/esm/graph/engine/errors/GraphPinningError.js +1 -1
  308. package/lib/esm/graph/engine/errors/GraphPortError.js +1 -1
  309. package/lib/esm/graph/engine/errors/GraphStoreError.js +1 -1
  310. package/lib/esm/graph/engine/errors/GraphTopologyError.js +1 -1
  311. package/lib/esm/graph/engine/errors/index.js +1 -1
  312. package/lib/esm/graph/engine/events/GraphExecutionEvent.js +1 -1
  313. package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js +1 -1
  314. package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js +1 -1
  315. package/lib/esm/graph/engine/events/GraphExecutionObserver.js +1 -1
  316. package/lib/esm/graph/engine/events/index.js +1 -1
  317. package/lib/esm/graph/engine/execution/CodeGraphNodeExecutor.js +1 -1
  318. package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js +1 -1
  319. package/lib/esm/graph/engine/execution/GraphExecutionContext.js +1 -1
  320. package/lib/esm/graph/engine/execution/GraphExecutionEngine.js +1 -1
  321. package/lib/esm/graph/engine/execution/GraphExecutionFrame.js +1 -1
  322. package/lib/esm/graph/engine/execution/GraphExecutionResult.js +1 -1
  323. package/lib/esm/graph/engine/execution/GraphNodeExecutor.js +1 -1
  324. package/lib/esm/graph/engine/execution/IsolatedVmCodeSandboxEvaluator.js +1 -1
  325. package/lib/esm/graph/engine/execution/LogGraphNodeExecutor.js +1 -1
  326. package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +1 -1
  327. package/lib/esm/graph/engine/execution/index.js +1 -1
  328. package/lib/esm/graph/engine/index.js +1 -1
  329. package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js +1 -1
  330. package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js +1 -1
  331. package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js +1 -1
  332. package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js +1 -1
  333. package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js +1 -1
  334. package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js +1 -1
  335. package/lib/esm/graph/engine/loops/index.js +1 -1
  336. package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js +1 -1
  337. package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js +1 -1
  338. package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js +1 -1
  339. package/lib/esm/graph/engine/pinning/GraphPinningService.js +1 -1
  340. package/lib/esm/graph/engine/pinning/index.js +1 -1
  341. package/lib/esm/graph/engine/planning/GraphExecutionPlan.js +1 -1
  342. package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js +1 -1
  343. package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js +1 -1
  344. package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js +1 -1
  345. package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js +1 -1
  346. package/lib/esm/graph/engine/planning/GraphRelationResolver.js +1 -1
  347. package/lib/esm/graph/engine/planning/GraphTopology.js +1 -1
  348. package/lib/esm/graph/engine/planning/index.js +1 -1
  349. package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js +1 -1
  350. package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js +1 -1
  351. package/lib/esm/graph/engine/registry/index.js +1 -1
  352. package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js +1 -1
  353. package/lib/esm/graph/engine/snapshots/index.js +1 -1
  354. package/lib/esm/graph/engine/store/GraphCachedValue.js +1 -1
  355. package/lib/esm/graph/engine/store/GraphValueKey.js +1 -1
  356. package/lib/esm/graph/engine/store/GraphValueStore.js +1 -1
  357. package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js +1 -1
  358. package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js +1 -1
  359. package/lib/esm/graph/engine/store/index.js +1 -1
  360. package/lib/esm/graph/engine/types.js +1 -1
  361. package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js +1 -1
  362. package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js +1 -1
  363. package/lib/esm/graph/engine/validation/GraphValueValidator.js +1 -1
  364. package/lib/esm/graph/engine/validation/index.js +1 -1
  365. package/lib/esm/graph/index.js +1 -1
  366. package/lib/esm/graph/shared/constants.js +1 -1
  367. package/lib/esm/graph/shared/index.js +1 -1
  368. package/lib/esm/graph/shared/nodes/agent.js +1 -1
  369. package/lib/esm/graph/shared/nodes/base.js +1 -1
  370. package/lib/esm/graph/shared/nodes/category-styles.js +1 -1
  371. package/lib/esm/graph/shared/nodes/flow-control.js +1 -1
  372. package/lib/esm/graph/shared/nodes/index.js +1 -1
  373. package/lib/esm/graph/shared/nodes/triggers.js +1 -1
  374. package/lib/esm/graph/shared/types.js +1 -1
  375. package/lib/esm/index.js +5 -4
  376. package/lib/esm/keycloak/index.js +1 -1
  377. package/lib/esm/keycloak/services/KeycloakAuthService.js +1 -1
  378. package/lib/esm/keycloak/services/KeycloakClientService.js +1 -1
  379. package/lib/esm/keycloak/services/KeycloakIdentityProviderService.js +1 -1
  380. package/lib/esm/keycloak/services/KeycloakRealmService.js +1 -1
  381. package/lib/esm/keycloak/services/KeycloakRoleService.js +1 -1
  382. package/lib/esm/keycloak/services/KeycloakService.js +1 -1
  383. package/lib/esm/keycloak/services/KeycloakUserService.js +1 -1
  384. package/lib/esm/keycloak/services/index.js +1 -1
  385. package/lib/esm/keycloak/services/runtime.js +1 -1
  386. package/lib/esm/keycloak/types.js +1 -1
  387. package/lib/esm/kibana/builders/KibanaIndexBuilder.js +319 -0
  388. package/lib/esm/kibana/builders/KibanaIndexBuilderCollection.js +32 -0
  389. package/lib/esm/kibana/builders/index.js +3 -0
  390. package/lib/esm/kibana/helpers.js +19 -15
  391. package/lib/esm/kibana/index.js +2 -1
  392. package/lib/esm/kibana/services/KibanaAuthService.js +1 -1
  393. package/lib/esm/kibana/services/KibanaDashboardService.js +1 -1
  394. package/lib/esm/kibana/services/KibanaDataViewService.js +1 -1
  395. package/lib/esm/kibana/services/KibanaRoleService.js +1 -1
  396. package/lib/esm/kibana/services/KibanaService.js +1 -1
  397. package/lib/esm/kibana/services/KibanaSpaceService.js +1 -1
  398. package/lib/esm/kibana/services/KibanaUserService.js +1 -1
  399. package/lib/esm/kibana/services/index.js +1 -1
  400. package/lib/esm/kibana/services/runtime.js +1 -1
  401. package/lib/esm/kibana/types.js +13 -2
  402. package/lib/esm/loader/ObjectLoader.js +115 -0
  403. package/lib/esm/loader/families.js +66 -0
  404. package/lib/esm/loader/index.js +11 -0
  405. package/lib/esm/loader/types.js +2 -0
  406. package/lib/esm/namespaces/index.js +1 -1
  407. package/lib/esm/namespaces/models/authorization-model.js +1 -1
  408. package/lib/esm/namespaces/models/effective-permission.model.js +1 -1
  409. package/lib/esm/namespaces/models/group-membership.model.js +1 -1
  410. package/lib/esm/namespaces/models/group.model.js +1 -1
  411. package/lib/esm/namespaces/models/index.js +1 -1
  412. package/lib/esm/namespaces/models/inheritance-block.model.js +1 -1
  413. package/lib/esm/namespaces/models/org-unit-closure.model.js +1 -1
  414. package/lib/esm/namespaces/models/org-unit-membership.model.js +1 -1
  415. package/lib/esm/namespaces/models/org-unit-profile.model.js +1 -1
  416. package/lib/esm/namespaces/models/org-unit.model.js +1 -1
  417. package/lib/esm/namespaces/models/permission.model.js +1 -1
  418. package/lib/esm/namespaces/models/principal.model.js +1 -1
  419. package/lib/esm/namespaces/models/protected-resource.model.js +1 -1
  420. package/lib/esm/namespaces/models/resource-grant.model.js +1 -1
  421. package/lib/esm/namespaces/models/role-assignment.model.js +1 -1
  422. package/lib/esm/namespaces/models/role-permission.model.js +1 -1
  423. package/lib/esm/namespaces/models/role.model.js +1 -1
  424. package/lib/esm/namespaces/models/storage-binding.model.js +1 -1
  425. package/lib/esm/namespaces/models/tenant-membership.model.js +1 -1
  426. package/lib/esm/namespaces/models/tenant-profile.model.js +1 -1
  427. package/lib/esm/namespaces/models/tenant.model.js +1 -1
  428. package/lib/esm/namespaces/models/user.model.js +1 -1
  429. package/lib/esm/namespaces/org-based-authorization-system.js +1 -1
  430. package/lib/esm/namespaces/org-based-authorization-system.models.js +1 -1
  431. package/lib/esm/namespaces/org-based-authorization-system.services.js +1 -1
  432. package/lib/esm/namespaces/services/authz.service.js +1 -1
  433. package/lib/esm/namespaces/services/bootstrap.service.js +1 -1
  434. package/lib/esm/namespaces/services/effective-permission.service.js +1 -1
  435. package/lib/esm/namespaces/services/group-membership.service.js +1 -1
  436. package/lib/esm/namespaces/services/group.service.js +1 -1
  437. package/lib/esm/namespaces/services/index.js +1 -1
  438. package/lib/esm/namespaces/services/inheritance-block.service.js +1 -1
  439. package/lib/esm/namespaces/services/org-unit-closure.service.js +1 -1
  440. package/lib/esm/namespaces/services/org-unit-membership.service.js +1 -1
  441. package/lib/esm/namespaces/services/org-unit-profile.service.js +1 -1
  442. package/lib/esm/namespaces/services/org-unit.service.js +1 -1
  443. package/lib/esm/namespaces/services/permission.service.js +1 -1
  444. package/lib/esm/namespaces/services/principal.service.js +1 -1
  445. package/lib/esm/namespaces/services/protected-resource.service.js +1 -1
  446. package/lib/esm/namespaces/services/resource-grant.service.js +1 -1
  447. package/lib/esm/namespaces/services/resource-lifecycle.service.js +1 -1
  448. package/lib/esm/namespaces/services/role-assignment.service.js +1 -1
  449. package/lib/esm/namespaces/services/role-permission.service.js +1 -1
  450. package/lib/esm/namespaces/services/role.service.js +1 -1
  451. package/lib/esm/namespaces/services/storage-binding.service.js +1 -1
  452. package/lib/esm/namespaces/services/system-management.service.js +1 -1
  453. package/lib/esm/namespaces/services/tenant-membership.service.js +1 -1
  454. package/lib/esm/namespaces/services/tenant-profile.service.js +1 -1
  455. package/lib/esm/namespaces/services/tenant.service.js +1 -1
  456. package/lib/esm/namespaces/services/user.service.js +1 -1
  457. package/lib/esm/namespaces/types.js +1 -1
  458. package/lib/esm/namespaces/utils.js +1 -1
  459. package/lib/esm/nest/decorators.js +12 -0
  460. package/lib/esm/nest/graph/GraphExecutionController.js +1 -1
  461. package/lib/esm/nest/graph/GraphExecutionModule.js +1 -1
  462. package/lib/esm/nest/graph/GraphExecutionResultModel.js +1 -1
  463. package/lib/esm/nest/graph/GraphExecutorRegistryFactory.js +1 -1
  464. package/lib/esm/nest/graph/GraphResultService.js +1 -1
  465. package/lib/esm/nest/graph/GraphWorkflowModel.js +1 -1
  466. package/lib/esm/nest/graph/GraphWorkflowService.js +1 -1
  467. package/lib/esm/nest/graph/index.js +1 -1
  468. package/lib/esm/nest/graph/main.js +1 -1
  469. package/lib/esm/nest/index.js +2 -2
  470. package/lib/esm/nest/keycloakAuthHandler.js +67 -35
  471. package/lib/esm/nest/keycloakModule.js +7 -10
  472. package/lib/esm/nest/logging.js +1 -1
  473. package/lib/esm/nest/types.js +1 -1
  474. package/lib/esm/nest/utils.js +55 -46
  475. package/lib/esm/plugins/contract.js +68 -0
  476. package/lib/esm/plugins/index.js +18 -0
  477. package/lib/esm/plugins/kibana/host.js +19 -0
  478. package/lib/esm/plugins/kibana/index.js +14 -0
  479. package/lib/esm/plugins/kibana/installer.js +140 -0
  480. package/lib/esm/plugins/kibana/manifest.js +32 -0
  481. package/lib/esm/plugins/kibana/templates.js +499 -0
  482. package/lib/esm/plugins/kibana/types.js +10 -0
  483. package/lib/esm/plugins/superset/host.js +21 -0
  484. package/lib/esm/plugins/superset/index.js +16 -0
  485. package/lib/esm/plugins/superset/installer.js +192 -0
  486. package/lib/esm/plugins/superset/manifest.js +30 -0
  487. package/lib/esm/plugins/superset/templates.js +840 -0
  488. package/lib/esm/plugins/superset/types.js +11 -0
  489. package/lib/esm/secrets/aws/AwsSecretService.js +1 -1
  490. package/lib/esm/secrets/aws/AwsSecretServiceConfig.js +1 -1
  491. package/lib/esm/secrets/aws/index.js +1 -1
  492. package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js +1 -1
  493. package/lib/esm/secrets/azure/AzureKeyVaultSecretServiceConfig.js +1 -1
  494. package/lib/esm/secrets/azure/index.js +1 -1
  495. package/lib/esm/secrets/core/SecretErrors.js +1 -1
  496. package/lib/esm/secrets/core/SecretName.js +1 -1
  497. package/lib/esm/secrets/core/SecretReference.js +1 -1
  498. package/lib/esm/secrets/core/SecretSerialization.js +1 -1
  499. package/lib/esm/secrets/core/SecretService.js +1 -1
  500. package/lib/esm/secrets/core/SecretTypes.js +1 -1
  501. package/lib/esm/secrets/core/index.js +1 -1
  502. package/lib/esm/secrets/gcp/GcpSecretManagerService.js +1 -1
  503. package/lib/esm/secrets/gcp/GcpSecretManagerServiceConfig.js +1 -1
  504. package/lib/esm/secrets/gcp/index.js +1 -1
  505. package/lib/esm/secrets/index.js +1 -1
  506. package/lib/esm/secrets/model/ModelSecretCrypto.js +1 -1
  507. package/lib/esm/secrets/model/ModelSecretService.js +1 -1
  508. package/lib/esm/secrets/model/ModelSecretServiceConfig.js +1 -1
  509. package/lib/esm/secrets/model/Secret.js +1 -1
  510. package/lib/esm/secrets/model/index.js +1 -1
  511. package/lib/esm/secrets/onepassword/OnePasswordSecretService.js +1 -1
  512. package/lib/esm/secrets/onepassword/OnePasswordSecretServiceConfig.js +1 -1
  513. package/lib/esm/secrets/onepassword/index.js +1 -1
  514. package/lib/esm/secrets/vault/VaultSecretService.js +1 -1
  515. package/lib/esm/secrets/vault/VaultSecretServiceConfig.js +1 -1
  516. package/lib/esm/secrets/vault/index.js +1 -1
  517. package/lib/esm/shared/runtime.js +1 -1
  518. package/lib/esm/utils.js +1 -1
  519. package/lib/types/feature-flags/constants.d.cts +11 -0
  520. package/lib/types/feature-flags/constants.d.mts +11 -0
  521. package/lib/types/feature-flags/decorators.d.cts +11 -0
  522. package/lib/types/feature-flags/decorators.d.mts +11 -0
  523. package/lib/types/feature-flags/environment.d.cts +11 -0
  524. package/lib/types/feature-flags/environment.d.mts +11 -0
  525. package/lib/types/feature-flags/index.d.cts +13 -0
  526. package/lib/types/feature-flags/index.d.mts +13 -0
  527. package/lib/types/feature-flags/models/FeatureFlag.model.d.cts +16 -0
  528. package/lib/types/feature-flags/models/FeatureFlag.model.d.mts +16 -0
  529. package/lib/types/feature-flags/models/FeatureFlagAccess.model.d.cts +15 -0
  530. package/lib/types/feature-flags/models/FeatureFlagAccess.model.d.mts +15 -0
  531. package/lib/types/feature-flags/readers/FeatureFlagReader.d.cts +10 -0
  532. package/lib/types/feature-flags/readers/FeatureFlagReader.d.mts +10 -0
  533. package/lib/types/feature-flags/readers/index.d.cts +1 -0
  534. package/lib/types/feature-flags/readers/index.d.mts +1 -0
  535. package/lib/types/feature-flags/services/FeatureFlag.service.d.cts +43 -0
  536. package/lib/types/feature-flags/services/FeatureFlag.service.d.mts +43 -0
  537. package/lib/types/feature-flags/types.d.cts +39 -0
  538. package/lib/types/feature-flags/types.d.mts +39 -0
  539. package/lib/types/feature-flags/utils.d.cts +13 -0
  540. package/lib/types/feature-flags/utils.d.mts +13 -0
  541. package/lib/types/index.d.cts +3 -2
  542. package/lib/types/index.d.mts +3 -2
  543. package/lib/types/kibana/builders/KibanaIndexBuilder.d.cts +67 -0
  544. package/lib/types/kibana/builders/KibanaIndexBuilder.d.mts +67 -0
  545. package/lib/types/kibana/builders/KibanaIndexBuilderCollection.d.cts +17 -0
  546. package/lib/types/kibana/builders/KibanaIndexBuilderCollection.d.mts +17 -0
  547. package/lib/types/kibana/builders/index.d.cts +2 -0
  548. package/lib/types/kibana/builders/index.d.mts +2 -0
  549. package/lib/types/kibana/index.d.cts +1 -0
  550. package/lib/types/kibana/index.d.mts +1 -0
  551. package/lib/types/kibana/types.d.cts +11 -0
  552. package/lib/types/kibana/types.d.mts +11 -0
  553. package/lib/types/loader/ObjectLoader.d.cts +27 -0
  554. package/lib/types/loader/ObjectLoader.d.mts +27 -0
  555. package/lib/types/loader/families.d.cts +34 -0
  556. package/lib/types/loader/families.d.mts +34 -0
  557. package/lib/types/loader/index.d.cts +10 -0
  558. package/lib/types/loader/index.d.mts +10 -0
  559. package/lib/types/loader/types.d.cts +24 -0
  560. package/lib/types/loader/types.d.mts +24 -0
  561. package/lib/types/nest/decorators.d.cts +8 -0
  562. package/lib/types/nest/decorators.d.mts +8 -0
  563. package/lib/types/nest/index.d.cts +1 -1
  564. package/lib/types/nest/index.d.mts +1 -1
  565. package/lib/types/nest/keycloakAuthHandler.d.cts +19 -42
  566. package/lib/types/nest/keycloakAuthHandler.d.mts +19 -42
  567. package/lib/types/nest/keycloakModule.d.cts +3 -5
  568. package/lib/types/nest/keycloakModule.d.mts +3 -5
  569. package/lib/types/nest/types.d.cts +2 -0
  570. package/lib/types/nest/types.d.mts +2 -0
  571. package/lib/types/nest/utils.d.cts +3 -4
  572. package/lib/types/nest/utils.d.mts +3 -4
  573. package/lib/types/plugins/contract.d.cts +180 -0
  574. package/lib/types/plugins/contract.d.mts +180 -0
  575. package/lib/types/plugins/index.d.cts +17 -0
  576. package/lib/types/plugins/index.d.mts +17 -0
  577. package/lib/types/plugins/kibana/host.d.cts +18 -0
  578. package/lib/types/plugins/kibana/host.d.mts +18 -0
  579. package/lib/types/plugins/kibana/index.d.cts +13 -0
  580. package/lib/types/plugins/kibana/index.d.mts +13 -0
  581. package/lib/types/plugins/kibana/installer.d.cts +45 -0
  582. package/lib/types/plugins/kibana/installer.d.mts +45 -0
  583. package/lib/types/plugins/kibana/manifest.d.cts +31 -0
  584. package/lib/types/plugins/kibana/manifest.d.mts +31 -0
  585. package/lib/types/plugins/kibana/templates.d.cts +12 -0
  586. package/lib/types/plugins/kibana/templates.d.mts +12 -0
  587. package/lib/types/plugins/kibana/types.d.cts +9 -0
  588. package/lib/types/plugins/kibana/types.d.mts +9 -0
  589. package/lib/types/plugins/superset/host.d.cts +20 -0
  590. package/lib/types/plugins/superset/host.d.mts +20 -0
  591. package/lib/types/plugins/superset/index.d.cts +15 -0
  592. package/lib/types/plugins/superset/index.d.mts +15 -0
  593. package/lib/types/plugins/superset/installer.d.cts +70 -0
  594. package/lib/types/plugins/superset/installer.d.mts +70 -0
  595. package/lib/types/plugins/superset/manifest.d.cts +28 -0
  596. package/lib/types/plugins/superset/manifest.d.mts +28 -0
  597. package/lib/types/plugins/superset/templates.d.cts +12 -0
  598. package/lib/types/plugins/superset/templates.d.mts +12 -0
  599. package/lib/types/plugins/superset/types.d.cts +10 -0
  600. package/lib/types/plugins/superset/types.d.mts +10 -0
  601. package/package.json +62 -3
  602. package/plugins/kibana/.gitignore +16 -0
  603. package/plugins/kibana/Dockerfile +19 -0
  604. package/plugins/kibana/docker-compose.yml +50 -0
  605. package/plugins/kibana/host/index.html +101 -0
  606. package/plugins/kibana/setup-dashboards.sh +84 -0
  607. package/plugins/superset/.gitignore +17 -0
  608. package/plugins/superset/Dockerfile +79 -0
  609. package/plugins/superset/docker-compose.yml +62 -0
  610. package/plugins/superset/host/index.html +168 -0
  611. package/plugins/superset/setup-dashboards.sh +106 -0
  612. package/plugins/superset/superset_config.py +49 -0
  613. package/dist/integrations.cjs.map +0 -1
  614. package/dist/integrations.js.map +0 -1
  615. package/lib/cjs/blob/azure/AzureBlobStoreService.cjs.map +0 -1
  616. package/lib/cjs/blob/azure/index.cjs.map +0 -1
  617. package/lib/cjs/blob/core/BlobErrors.cjs.map +0 -1
  618. package/lib/cjs/blob/core/BlobKey.cjs.map +0 -1
  619. package/lib/cjs/blob/core/BlobStoreFactory.cjs.map +0 -1
  620. package/lib/cjs/blob/core/BlobStoreService.cjs.map +0 -1
  621. package/lib/cjs/blob/core/BlobTypes.cjs.map +0 -1
  622. package/lib/cjs/blob/core/BlobValue.cjs.map +0 -1
  623. package/lib/cjs/blob/core/index.cjs.map +0 -1
  624. package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs.map +0 -1
  625. package/lib/cjs/blob/gcp/index.cjs.map +0 -1
  626. package/lib/cjs/blob/index.cjs.map +0 -1
  627. package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs.map +0 -1
  628. package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs.map +0 -1
  629. package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs.map +0 -1
  630. package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs.map +0 -1
  631. package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs.map +0 -1
  632. package/lib/cjs/blob/ipfs/index.cjs.map +0 -1
  633. package/lib/cjs/blob/local/LocalBlobStoreService.cjs.map +0 -1
  634. package/lib/cjs/blob/local/index.cjs.map +0 -1
  635. package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs.map +0 -1
  636. package/lib/cjs/blob/memory/index.cjs.map +0 -1
  637. package/lib/cjs/blob/s3/MinioBlobStoreService.cjs.map +0 -1
  638. package/lib/cjs/blob/s3/R2BlobStoreService.cjs.map +0 -1
  639. package/lib/cjs/blob/s3/S3BlobStoreService.cjs.map +0 -1
  640. package/lib/cjs/blob/s3/index.cjs.map +0 -1
  641. package/lib/cjs/docker/DockerComposeService.cjs.map +0 -1
  642. package/lib/cjs/docker/index.cjs.map +0 -1
  643. package/lib/cjs/graph/engine/constants.cjs.map +0 -1
  644. package/lib/cjs/graph/engine/decorators.cjs.map +0 -1
  645. package/lib/cjs/graph/engine/errors/GraphCycleError.cjs.map +0 -1
  646. package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs.map +0 -1
  647. package/lib/cjs/graph/engine/errors/GraphInputError.cjs.map +0 -1
  648. package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs.map +0 -1
  649. package/lib/cjs/graph/engine/errors/GraphPinningError.cjs.map +0 -1
  650. package/lib/cjs/graph/engine/errors/GraphPortError.cjs.map +0 -1
  651. package/lib/cjs/graph/engine/errors/GraphStoreError.cjs.map +0 -1
  652. package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs.map +0 -1
  653. package/lib/cjs/graph/engine/errors/index.cjs.map +0 -1
  654. package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs.map +0 -1
  655. package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs.map +0 -1
  656. package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs.map +0 -1
  657. package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs.map +0 -1
  658. package/lib/cjs/graph/engine/events/index.cjs.map +0 -1
  659. package/lib/cjs/graph/engine/execution/CodeGraphNodeExecutor.cjs.map +0 -1
  660. package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs.map +0 -1
  661. package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs.map +0 -1
  662. package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs.map +0 -1
  663. package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs.map +0 -1
  664. package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs.map +0 -1
  665. package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs.map +0 -1
  666. package/lib/cjs/graph/engine/execution/IsolatedVmCodeSandboxEvaluator.cjs.map +0 -1
  667. package/lib/cjs/graph/engine/execution/LogGraphNodeExecutor.cjs.map +0 -1
  668. package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs.map +0 -1
  669. package/lib/cjs/graph/engine/execution/index.cjs.map +0 -1
  670. package/lib/cjs/graph/engine/index.cjs.map +0 -1
  671. package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs.map +0 -1
  672. package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs.map +0 -1
  673. package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs.map +0 -1
  674. package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs.map +0 -1
  675. package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs.map +0 -1
  676. package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs.map +0 -1
  677. package/lib/cjs/graph/engine/loops/index.cjs.map +0 -1
  678. package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs.map +0 -1
  679. package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs.map +0 -1
  680. package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs.map +0 -1
  681. package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs.map +0 -1
  682. package/lib/cjs/graph/engine/pinning/index.cjs.map +0 -1
  683. package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs.map +0 -1
  684. package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs.map +0 -1
  685. package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs.map +0 -1
  686. package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs.map +0 -1
  687. package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs.map +0 -1
  688. package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs.map +0 -1
  689. package/lib/cjs/graph/engine/planning/GraphTopology.cjs.map +0 -1
  690. package/lib/cjs/graph/engine/planning/index.cjs.map +0 -1
  691. package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs.map +0 -1
  692. package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs.map +0 -1
  693. package/lib/cjs/graph/engine/registry/index.cjs.map +0 -1
  694. package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs.map +0 -1
  695. package/lib/cjs/graph/engine/snapshots/index.cjs.map +0 -1
  696. package/lib/cjs/graph/engine/store/GraphCachedValue.cjs.map +0 -1
  697. package/lib/cjs/graph/engine/store/GraphValueKey.cjs.map +0 -1
  698. package/lib/cjs/graph/engine/store/GraphValueStore.cjs.map +0 -1
  699. package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs.map +0 -1
  700. package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs.map +0 -1
  701. package/lib/cjs/graph/engine/store/index.cjs.map +0 -1
  702. package/lib/cjs/graph/engine/types.cjs.map +0 -1
  703. package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs.map +0 -1
  704. package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs.map +0 -1
  705. package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs.map +0 -1
  706. package/lib/cjs/graph/engine/validation/index.cjs.map +0 -1
  707. package/lib/cjs/graph/index.cjs.map +0 -1
  708. package/lib/cjs/graph/shared/constants.cjs.map +0 -1
  709. package/lib/cjs/graph/shared/index.cjs.map +0 -1
  710. package/lib/cjs/graph/shared/nodes/agent.cjs.map +0 -1
  711. package/lib/cjs/graph/shared/nodes/base.cjs.map +0 -1
  712. package/lib/cjs/graph/shared/nodes/category-styles.cjs.map +0 -1
  713. package/lib/cjs/graph/shared/nodes/flow-control.cjs.map +0 -1
  714. package/lib/cjs/graph/shared/nodes/index.cjs.map +0 -1
  715. package/lib/cjs/graph/shared/nodes/triggers.cjs.map +0 -1
  716. package/lib/cjs/graph/shared/types.cjs.map +0 -1
  717. package/lib/cjs/index.cjs.map +0 -1
  718. package/lib/cjs/keycloak/index.cjs.map +0 -1
  719. package/lib/cjs/keycloak/services/KeycloakAuthService.cjs.map +0 -1
  720. package/lib/cjs/keycloak/services/KeycloakClientService.cjs.map +0 -1
  721. package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs.map +0 -1
  722. package/lib/cjs/keycloak/services/KeycloakRealmService.cjs.map +0 -1
  723. package/lib/cjs/keycloak/services/KeycloakRoleService.cjs.map +0 -1
  724. package/lib/cjs/keycloak/services/KeycloakService.cjs.map +0 -1
  725. package/lib/cjs/keycloak/services/KeycloakUserService.cjs.map +0 -1
  726. package/lib/cjs/keycloak/services/index.cjs.map +0 -1
  727. package/lib/cjs/keycloak/services/runtime.cjs.map +0 -1
  728. package/lib/cjs/keycloak/types.cjs.map +0 -1
  729. package/lib/cjs/kibana/helpers.cjs.map +0 -1
  730. package/lib/cjs/kibana/index.cjs.map +0 -1
  731. package/lib/cjs/kibana/services/KibanaAuthService.cjs.map +0 -1
  732. package/lib/cjs/kibana/services/KibanaDashboardService.cjs.map +0 -1
  733. package/lib/cjs/kibana/services/KibanaDataViewService.cjs.map +0 -1
  734. package/lib/cjs/kibana/services/KibanaRoleService.cjs.map +0 -1
  735. package/lib/cjs/kibana/services/KibanaService.cjs.map +0 -1
  736. package/lib/cjs/kibana/services/KibanaSpaceService.cjs.map +0 -1
  737. package/lib/cjs/kibana/services/KibanaUserService.cjs.map +0 -1
  738. package/lib/cjs/kibana/services/index.cjs.map +0 -1
  739. package/lib/cjs/kibana/services/runtime.cjs.map +0 -1
  740. package/lib/cjs/kibana/types.cjs.map +0 -1
  741. package/lib/cjs/namespaces/index.cjs.map +0 -1
  742. package/lib/cjs/namespaces/models/authorization-model.cjs.map +0 -1
  743. package/lib/cjs/namespaces/models/effective-permission.model.cjs.map +0 -1
  744. package/lib/cjs/namespaces/models/group-membership.model.cjs.map +0 -1
  745. package/lib/cjs/namespaces/models/group.model.cjs.map +0 -1
  746. package/lib/cjs/namespaces/models/index.cjs.map +0 -1
  747. package/lib/cjs/namespaces/models/inheritance-block.model.cjs.map +0 -1
  748. package/lib/cjs/namespaces/models/org-unit-closure.model.cjs.map +0 -1
  749. package/lib/cjs/namespaces/models/org-unit-membership.model.cjs.map +0 -1
  750. package/lib/cjs/namespaces/models/org-unit-profile.model.cjs.map +0 -1
  751. package/lib/cjs/namespaces/models/org-unit.model.cjs.map +0 -1
  752. package/lib/cjs/namespaces/models/permission.model.cjs.map +0 -1
  753. package/lib/cjs/namespaces/models/principal.model.cjs.map +0 -1
  754. package/lib/cjs/namespaces/models/protected-resource.model.cjs.map +0 -1
  755. package/lib/cjs/namespaces/models/resource-grant.model.cjs.map +0 -1
  756. package/lib/cjs/namespaces/models/role-assignment.model.cjs.map +0 -1
  757. package/lib/cjs/namespaces/models/role-permission.model.cjs.map +0 -1
  758. package/lib/cjs/namespaces/models/role.model.cjs.map +0 -1
  759. package/lib/cjs/namespaces/models/storage-binding.model.cjs.map +0 -1
  760. package/lib/cjs/namespaces/models/tenant-membership.model.cjs.map +0 -1
  761. package/lib/cjs/namespaces/models/tenant-profile.model.cjs.map +0 -1
  762. package/lib/cjs/namespaces/models/tenant.model.cjs.map +0 -1
  763. package/lib/cjs/namespaces/models/user.model.cjs.map +0 -1
  764. package/lib/cjs/namespaces/org-based-authorization-system.cjs.map +0 -1
  765. package/lib/cjs/namespaces/org-based-authorization-system.models.cjs.map +0 -1
  766. package/lib/cjs/namespaces/org-based-authorization-system.services.cjs.map +0 -1
  767. package/lib/cjs/namespaces/services/authz.service.cjs.map +0 -1
  768. package/lib/cjs/namespaces/services/bootstrap.service.cjs.map +0 -1
  769. package/lib/cjs/namespaces/services/effective-permission.service.cjs.map +0 -1
  770. package/lib/cjs/namespaces/services/group-membership.service.cjs.map +0 -1
  771. package/lib/cjs/namespaces/services/group.service.cjs.map +0 -1
  772. package/lib/cjs/namespaces/services/index.cjs.map +0 -1
  773. package/lib/cjs/namespaces/services/inheritance-block.service.cjs.map +0 -1
  774. package/lib/cjs/namespaces/services/org-unit-closure.service.cjs.map +0 -1
  775. package/lib/cjs/namespaces/services/org-unit-membership.service.cjs.map +0 -1
  776. package/lib/cjs/namespaces/services/org-unit-profile.service.cjs.map +0 -1
  777. package/lib/cjs/namespaces/services/org-unit.service.cjs.map +0 -1
  778. package/lib/cjs/namespaces/services/permission.service.cjs.map +0 -1
  779. package/lib/cjs/namespaces/services/principal.service.cjs.map +0 -1
  780. package/lib/cjs/namespaces/services/protected-resource.service.cjs.map +0 -1
  781. package/lib/cjs/namespaces/services/resource-grant.service.cjs.map +0 -1
  782. package/lib/cjs/namespaces/services/resource-lifecycle.service.cjs.map +0 -1
  783. package/lib/cjs/namespaces/services/role-assignment.service.cjs.map +0 -1
  784. package/lib/cjs/namespaces/services/role-permission.service.cjs.map +0 -1
  785. package/lib/cjs/namespaces/services/role.service.cjs.map +0 -1
  786. package/lib/cjs/namespaces/services/storage-binding.service.cjs.map +0 -1
  787. package/lib/cjs/namespaces/services/system-management.service.cjs.map +0 -1
  788. package/lib/cjs/namespaces/services/tenant-membership.service.cjs.map +0 -1
  789. package/lib/cjs/namespaces/services/tenant-profile.service.cjs.map +0 -1
  790. package/lib/cjs/namespaces/services/tenant.service.cjs.map +0 -1
  791. package/lib/cjs/namespaces/services/user.service.cjs.map +0 -1
  792. package/lib/cjs/namespaces/types.cjs.map +0 -1
  793. package/lib/cjs/namespaces/utils.cjs.map +0 -1
  794. package/lib/cjs/nest/authService.cjs +0 -91
  795. package/lib/cjs/nest/authService.cjs.map +0 -1
  796. package/lib/cjs/nest/graph/GraphExecutionController.cjs.map +0 -1
  797. package/lib/cjs/nest/graph/GraphExecutionModule.cjs.map +0 -1
  798. package/lib/cjs/nest/graph/GraphExecutionResultModel.cjs.map +0 -1
  799. package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.cjs.map +0 -1
  800. package/lib/cjs/nest/graph/GraphResultService.cjs.map +0 -1
  801. package/lib/cjs/nest/graph/GraphWorkflowModel.cjs.map +0 -1
  802. package/lib/cjs/nest/graph/GraphWorkflowService.cjs.map +0 -1
  803. package/lib/cjs/nest/graph/index.cjs.map +0 -1
  804. package/lib/cjs/nest/graph/main.cjs.map +0 -1
  805. package/lib/cjs/nest/index.cjs.map +0 -1
  806. package/lib/cjs/nest/keycloakAuthHandler.cjs.map +0 -1
  807. package/lib/cjs/nest/keycloakModule.cjs.map +0 -1
  808. package/lib/cjs/nest/logging.cjs.map +0 -1
  809. package/lib/cjs/nest/types.cjs.map +0 -1
  810. package/lib/cjs/nest/utils.cjs.map +0 -1
  811. package/lib/cjs/secrets/aws/AwsSecretService.cjs.map +0 -1
  812. package/lib/cjs/secrets/aws/AwsSecretServiceConfig.cjs.map +0 -1
  813. package/lib/cjs/secrets/aws/index.cjs.map +0 -1
  814. package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs.map +0 -1
  815. package/lib/cjs/secrets/azure/AzureKeyVaultSecretServiceConfig.cjs.map +0 -1
  816. package/lib/cjs/secrets/azure/index.cjs.map +0 -1
  817. package/lib/cjs/secrets/core/SecretErrors.cjs.map +0 -1
  818. package/lib/cjs/secrets/core/SecretName.cjs.map +0 -1
  819. package/lib/cjs/secrets/core/SecretReference.cjs.map +0 -1
  820. package/lib/cjs/secrets/core/SecretSerialization.cjs.map +0 -1
  821. package/lib/cjs/secrets/core/SecretService.cjs.map +0 -1
  822. package/lib/cjs/secrets/core/SecretTypes.cjs.map +0 -1
  823. package/lib/cjs/secrets/core/index.cjs.map +0 -1
  824. package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs.map +0 -1
  825. package/lib/cjs/secrets/gcp/GcpSecretManagerServiceConfig.cjs.map +0 -1
  826. package/lib/cjs/secrets/gcp/index.cjs.map +0 -1
  827. package/lib/cjs/secrets/index.cjs.map +0 -1
  828. package/lib/cjs/secrets/model/ModelSecretCrypto.cjs.map +0 -1
  829. package/lib/cjs/secrets/model/ModelSecretService.cjs.map +0 -1
  830. package/lib/cjs/secrets/model/ModelSecretServiceConfig.cjs.map +0 -1
  831. package/lib/cjs/secrets/model/Secret.cjs.map +0 -1
  832. package/lib/cjs/secrets/model/index.cjs.map +0 -1
  833. package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs.map +0 -1
  834. package/lib/cjs/secrets/onepassword/OnePasswordSecretServiceConfig.cjs.map +0 -1
  835. package/lib/cjs/secrets/onepassword/index.cjs.map +0 -1
  836. package/lib/cjs/secrets/vault/VaultSecretService.cjs.map +0 -1
  837. package/lib/cjs/secrets/vault/VaultSecretServiceConfig.cjs.map +0 -1
  838. package/lib/cjs/secrets/vault/index.cjs.map +0 -1
  839. package/lib/cjs/shared/runtime.cjs.map +0 -1
  840. package/lib/cjs/utils.cjs.map +0 -1
  841. package/lib/esm/blob/azure/AzureBlobStoreService.js.map +0 -1
  842. package/lib/esm/blob/azure/index.js.map +0 -1
  843. package/lib/esm/blob/core/BlobErrors.js.map +0 -1
  844. package/lib/esm/blob/core/BlobKey.js.map +0 -1
  845. package/lib/esm/blob/core/BlobStoreFactory.js.map +0 -1
  846. package/lib/esm/blob/core/BlobStoreService.js.map +0 -1
  847. package/lib/esm/blob/core/BlobTypes.js.map +0 -1
  848. package/lib/esm/blob/core/BlobValue.js.map +0 -1
  849. package/lib/esm/blob/core/index.js.map +0 -1
  850. package/lib/esm/blob/gcp/GcsBlobStoreService.js.map +0 -1
  851. package/lib/esm/blob/gcp/index.js.map +0 -1
  852. package/lib/esm/blob/index.js.map +0 -1
  853. package/lib/esm/blob/ipfs/IpfsBlobStoreService.js.map +0 -1
  854. package/lib/esm/blob/ipfs/IpfsKeyIndex.js.map +0 -1
  855. package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js.map +0 -1
  856. package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js.map +0 -1
  857. package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js.map +0 -1
  858. package/lib/esm/blob/ipfs/index.js.map +0 -1
  859. package/lib/esm/blob/local/LocalBlobStoreService.js.map +0 -1
  860. package/lib/esm/blob/local/index.js.map +0 -1
  861. package/lib/esm/blob/memory/MemoryBlobStoreService.js.map +0 -1
  862. package/lib/esm/blob/memory/index.js.map +0 -1
  863. package/lib/esm/blob/s3/MinioBlobStoreService.js.map +0 -1
  864. package/lib/esm/blob/s3/R2BlobStoreService.js.map +0 -1
  865. package/lib/esm/blob/s3/S3BlobStoreService.js.map +0 -1
  866. package/lib/esm/blob/s3/index.js.map +0 -1
  867. package/lib/esm/docker/DockerComposeService.js.map +0 -1
  868. package/lib/esm/docker/index.js.map +0 -1
  869. package/lib/esm/graph/engine/constants.js.map +0 -1
  870. package/lib/esm/graph/engine/decorators.js.map +0 -1
  871. package/lib/esm/graph/engine/errors/GraphCycleError.js.map +0 -1
  872. package/lib/esm/graph/engine/errors/GraphExecutionError.js.map +0 -1
  873. package/lib/esm/graph/engine/errors/GraphInputError.js.map +0 -1
  874. package/lib/esm/graph/engine/errors/GraphLoopLimitError.js.map +0 -1
  875. package/lib/esm/graph/engine/errors/GraphPinningError.js.map +0 -1
  876. package/lib/esm/graph/engine/errors/GraphPortError.js.map +0 -1
  877. package/lib/esm/graph/engine/errors/GraphStoreError.js.map +0 -1
  878. package/lib/esm/graph/engine/errors/GraphTopologyError.js.map +0 -1
  879. package/lib/esm/graph/engine/errors/index.js.map +0 -1
  880. package/lib/esm/graph/engine/events/GraphExecutionEvent.js.map +0 -1
  881. package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js.map +0 -1
  882. package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js.map +0 -1
  883. package/lib/esm/graph/engine/events/GraphExecutionObserver.js.map +0 -1
  884. package/lib/esm/graph/engine/events/index.js.map +0 -1
  885. package/lib/esm/graph/engine/execution/CodeGraphNodeExecutor.js.map +0 -1
  886. package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js.map +0 -1
  887. package/lib/esm/graph/engine/execution/GraphExecutionContext.js.map +0 -1
  888. package/lib/esm/graph/engine/execution/GraphExecutionEngine.js.map +0 -1
  889. package/lib/esm/graph/engine/execution/GraphExecutionFrame.js.map +0 -1
  890. package/lib/esm/graph/engine/execution/GraphExecutionResult.js.map +0 -1
  891. package/lib/esm/graph/engine/execution/GraphNodeExecutor.js.map +0 -1
  892. package/lib/esm/graph/engine/execution/IsolatedVmCodeSandboxEvaluator.js.map +0 -1
  893. package/lib/esm/graph/engine/execution/LogGraphNodeExecutor.js.map +0 -1
  894. package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js.map +0 -1
  895. package/lib/esm/graph/engine/execution/index.js.map +0 -1
  896. package/lib/esm/graph/engine/index.js.map +0 -1
  897. package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js.map +0 -1
  898. package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js.map +0 -1
  899. package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js.map +0 -1
  900. package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js.map +0 -1
  901. package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js.map +0 -1
  902. package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js.map +0 -1
  903. package/lib/esm/graph/engine/loops/index.js.map +0 -1
  904. package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js.map +0 -1
  905. package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js.map +0 -1
  906. package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js.map +0 -1
  907. package/lib/esm/graph/engine/pinning/GraphPinningService.js.map +0 -1
  908. package/lib/esm/graph/engine/pinning/index.js.map +0 -1
  909. package/lib/esm/graph/engine/planning/GraphExecutionPlan.js.map +0 -1
  910. package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js.map +0 -1
  911. package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js.map +0 -1
  912. package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js.map +0 -1
  913. package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js.map +0 -1
  914. package/lib/esm/graph/engine/planning/GraphRelationResolver.js.map +0 -1
  915. package/lib/esm/graph/engine/planning/GraphTopology.js.map +0 -1
  916. package/lib/esm/graph/engine/planning/index.js.map +0 -1
  917. package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js.map +0 -1
  918. package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js.map +0 -1
  919. package/lib/esm/graph/engine/registry/index.js.map +0 -1
  920. package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js.map +0 -1
  921. package/lib/esm/graph/engine/snapshots/index.js.map +0 -1
  922. package/lib/esm/graph/engine/store/GraphCachedValue.js.map +0 -1
  923. package/lib/esm/graph/engine/store/GraphValueKey.js.map +0 -1
  924. package/lib/esm/graph/engine/store/GraphValueStore.js.map +0 -1
  925. package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js.map +0 -1
  926. package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js.map +0 -1
  927. package/lib/esm/graph/engine/store/index.js.map +0 -1
  928. package/lib/esm/graph/engine/types.js.map +0 -1
  929. package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js.map +0 -1
  930. package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js.map +0 -1
  931. package/lib/esm/graph/engine/validation/GraphValueValidator.js.map +0 -1
  932. package/lib/esm/graph/engine/validation/index.js.map +0 -1
  933. package/lib/esm/graph/index.js.map +0 -1
  934. package/lib/esm/graph/shared/constants.js.map +0 -1
  935. package/lib/esm/graph/shared/index.js.map +0 -1
  936. package/lib/esm/graph/shared/nodes/agent.js.map +0 -1
  937. package/lib/esm/graph/shared/nodes/base.js.map +0 -1
  938. package/lib/esm/graph/shared/nodes/category-styles.js.map +0 -1
  939. package/lib/esm/graph/shared/nodes/flow-control.js.map +0 -1
  940. package/lib/esm/graph/shared/nodes/index.js.map +0 -1
  941. package/lib/esm/graph/shared/nodes/triggers.js.map +0 -1
  942. package/lib/esm/graph/shared/types.js.map +0 -1
  943. package/lib/esm/index.js.map +0 -1
  944. package/lib/esm/keycloak/index.js.map +0 -1
  945. package/lib/esm/keycloak/services/KeycloakAuthService.js.map +0 -1
  946. package/lib/esm/keycloak/services/KeycloakClientService.js.map +0 -1
  947. package/lib/esm/keycloak/services/KeycloakIdentityProviderService.js.map +0 -1
  948. package/lib/esm/keycloak/services/KeycloakRealmService.js.map +0 -1
  949. package/lib/esm/keycloak/services/KeycloakRoleService.js.map +0 -1
  950. package/lib/esm/keycloak/services/KeycloakService.js.map +0 -1
  951. package/lib/esm/keycloak/services/KeycloakUserService.js.map +0 -1
  952. package/lib/esm/keycloak/services/index.js.map +0 -1
  953. package/lib/esm/keycloak/services/runtime.js.map +0 -1
  954. package/lib/esm/keycloak/types.js.map +0 -1
  955. package/lib/esm/kibana/helpers.js.map +0 -1
  956. package/lib/esm/kibana/index.js.map +0 -1
  957. package/lib/esm/kibana/services/KibanaAuthService.js.map +0 -1
  958. package/lib/esm/kibana/services/KibanaDashboardService.js.map +0 -1
  959. package/lib/esm/kibana/services/KibanaDataViewService.js.map +0 -1
  960. package/lib/esm/kibana/services/KibanaRoleService.js.map +0 -1
  961. package/lib/esm/kibana/services/KibanaService.js.map +0 -1
  962. package/lib/esm/kibana/services/KibanaSpaceService.js.map +0 -1
  963. package/lib/esm/kibana/services/KibanaUserService.js.map +0 -1
  964. package/lib/esm/kibana/services/index.js.map +0 -1
  965. package/lib/esm/kibana/services/runtime.js.map +0 -1
  966. package/lib/esm/kibana/types.js.map +0 -1
  967. package/lib/esm/namespaces/index.js.map +0 -1
  968. package/lib/esm/namespaces/models/authorization-model.js.map +0 -1
  969. package/lib/esm/namespaces/models/effective-permission.model.js.map +0 -1
  970. package/lib/esm/namespaces/models/group-membership.model.js.map +0 -1
  971. package/lib/esm/namespaces/models/group.model.js.map +0 -1
  972. package/lib/esm/namespaces/models/index.js.map +0 -1
  973. package/lib/esm/namespaces/models/inheritance-block.model.js.map +0 -1
  974. package/lib/esm/namespaces/models/org-unit-closure.model.js.map +0 -1
  975. package/lib/esm/namespaces/models/org-unit-membership.model.js.map +0 -1
  976. package/lib/esm/namespaces/models/org-unit-profile.model.js.map +0 -1
  977. package/lib/esm/namespaces/models/org-unit.model.js.map +0 -1
  978. package/lib/esm/namespaces/models/permission.model.js.map +0 -1
  979. package/lib/esm/namespaces/models/principal.model.js.map +0 -1
  980. package/lib/esm/namespaces/models/protected-resource.model.js.map +0 -1
  981. package/lib/esm/namespaces/models/resource-grant.model.js.map +0 -1
  982. package/lib/esm/namespaces/models/role-assignment.model.js.map +0 -1
  983. package/lib/esm/namespaces/models/role-permission.model.js.map +0 -1
  984. package/lib/esm/namespaces/models/role.model.js.map +0 -1
  985. package/lib/esm/namespaces/models/storage-binding.model.js.map +0 -1
  986. package/lib/esm/namespaces/models/tenant-membership.model.js.map +0 -1
  987. package/lib/esm/namespaces/models/tenant-profile.model.js.map +0 -1
  988. package/lib/esm/namespaces/models/tenant.model.js.map +0 -1
  989. package/lib/esm/namespaces/models/user.model.js.map +0 -1
  990. package/lib/esm/namespaces/org-based-authorization-system.js.map +0 -1
  991. package/lib/esm/namespaces/org-based-authorization-system.models.js.map +0 -1
  992. package/lib/esm/namespaces/org-based-authorization-system.services.js.map +0 -1
  993. package/lib/esm/namespaces/services/authz.service.js.map +0 -1
  994. package/lib/esm/namespaces/services/bootstrap.service.js.map +0 -1
  995. package/lib/esm/namespaces/services/effective-permission.service.js.map +0 -1
  996. package/lib/esm/namespaces/services/group-membership.service.js.map +0 -1
  997. package/lib/esm/namespaces/services/group.service.js.map +0 -1
  998. package/lib/esm/namespaces/services/index.js.map +0 -1
  999. package/lib/esm/namespaces/services/inheritance-block.service.js.map +0 -1
  1000. package/lib/esm/namespaces/services/org-unit-closure.service.js.map +0 -1
  1001. package/lib/esm/namespaces/services/org-unit-membership.service.js.map +0 -1
  1002. package/lib/esm/namespaces/services/org-unit-profile.service.js.map +0 -1
  1003. package/lib/esm/namespaces/services/org-unit.service.js.map +0 -1
  1004. package/lib/esm/namespaces/services/permission.service.js.map +0 -1
  1005. package/lib/esm/namespaces/services/principal.service.js.map +0 -1
  1006. package/lib/esm/namespaces/services/protected-resource.service.js.map +0 -1
  1007. package/lib/esm/namespaces/services/resource-grant.service.js.map +0 -1
  1008. package/lib/esm/namespaces/services/resource-lifecycle.service.js.map +0 -1
  1009. package/lib/esm/namespaces/services/role-assignment.service.js.map +0 -1
  1010. package/lib/esm/namespaces/services/role-permission.service.js.map +0 -1
  1011. package/lib/esm/namespaces/services/role.service.js.map +0 -1
  1012. package/lib/esm/namespaces/services/storage-binding.service.js.map +0 -1
  1013. package/lib/esm/namespaces/services/system-management.service.js.map +0 -1
  1014. package/lib/esm/namespaces/services/tenant-membership.service.js.map +0 -1
  1015. package/lib/esm/namespaces/services/tenant-profile.service.js.map +0 -1
  1016. package/lib/esm/namespaces/services/tenant.service.js.map +0 -1
  1017. package/lib/esm/namespaces/services/user.service.js.map +0 -1
  1018. package/lib/esm/namespaces/types.js.map +0 -1
  1019. package/lib/esm/namespaces/utils.js.map +0 -1
  1020. package/lib/esm/nest/authService.js +0 -86
  1021. package/lib/esm/nest/authService.js.map +0 -1
  1022. package/lib/esm/nest/graph/GraphExecutionController.js.map +0 -1
  1023. package/lib/esm/nest/graph/GraphExecutionModule.js.map +0 -1
  1024. package/lib/esm/nest/graph/GraphExecutionResultModel.js.map +0 -1
  1025. package/lib/esm/nest/graph/GraphExecutorRegistryFactory.js.map +0 -1
  1026. package/lib/esm/nest/graph/GraphResultService.js.map +0 -1
  1027. package/lib/esm/nest/graph/GraphWorkflowModel.js.map +0 -1
  1028. package/lib/esm/nest/graph/GraphWorkflowService.js.map +0 -1
  1029. package/lib/esm/nest/graph/index.js.map +0 -1
  1030. package/lib/esm/nest/graph/main.js.map +0 -1
  1031. package/lib/esm/nest/index.js.map +0 -1
  1032. package/lib/esm/nest/keycloakAuthHandler.js.map +0 -1
  1033. package/lib/esm/nest/keycloakModule.js.map +0 -1
  1034. package/lib/esm/nest/logging.js.map +0 -1
  1035. package/lib/esm/nest/types.js.map +0 -1
  1036. package/lib/esm/nest/utils.js.map +0 -1
  1037. package/lib/esm/secrets/aws/AwsSecretService.js.map +0 -1
  1038. package/lib/esm/secrets/aws/AwsSecretServiceConfig.js.map +0 -1
  1039. package/lib/esm/secrets/aws/index.js.map +0 -1
  1040. package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js.map +0 -1
  1041. package/lib/esm/secrets/azure/AzureKeyVaultSecretServiceConfig.js.map +0 -1
  1042. package/lib/esm/secrets/azure/index.js.map +0 -1
  1043. package/lib/esm/secrets/core/SecretErrors.js.map +0 -1
  1044. package/lib/esm/secrets/core/SecretName.js.map +0 -1
  1045. package/lib/esm/secrets/core/SecretReference.js.map +0 -1
  1046. package/lib/esm/secrets/core/SecretSerialization.js.map +0 -1
  1047. package/lib/esm/secrets/core/SecretService.js.map +0 -1
  1048. package/lib/esm/secrets/core/SecretTypes.js.map +0 -1
  1049. package/lib/esm/secrets/core/index.js.map +0 -1
  1050. package/lib/esm/secrets/gcp/GcpSecretManagerService.js.map +0 -1
  1051. package/lib/esm/secrets/gcp/GcpSecretManagerServiceConfig.js.map +0 -1
  1052. package/lib/esm/secrets/gcp/index.js.map +0 -1
  1053. package/lib/esm/secrets/index.js.map +0 -1
  1054. package/lib/esm/secrets/model/ModelSecretCrypto.js.map +0 -1
  1055. package/lib/esm/secrets/model/ModelSecretService.js.map +0 -1
  1056. package/lib/esm/secrets/model/ModelSecretServiceConfig.js.map +0 -1
  1057. package/lib/esm/secrets/model/Secret.js.map +0 -1
  1058. package/lib/esm/secrets/model/index.js.map +0 -1
  1059. package/lib/esm/secrets/onepassword/OnePasswordSecretService.js.map +0 -1
  1060. package/lib/esm/secrets/onepassword/OnePasswordSecretServiceConfig.js.map +0 -1
  1061. package/lib/esm/secrets/onepassword/index.js.map +0 -1
  1062. package/lib/esm/secrets/vault/VaultSecretService.js.map +0 -1
  1063. package/lib/esm/secrets/vault/VaultSecretServiceConfig.js.map +0 -1
  1064. package/lib/esm/secrets/vault/index.js.map +0 -1
  1065. package/lib/esm/shared/runtime.js.map +0 -1
  1066. package/lib/esm/utils.js.map +0 -1
  1067. package/lib/types/nest/authService.d.cts +0 -63
  1068. package/lib/types/nest/authService.d.mts +0 -63
@@ -0,0 +1,844 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.supersetPatchFiles = supersetPatchFiles;
4
+ /**
5
+ * @module integrations/plugins/superset/templates
6
+ * @summary Patch and build script templates for the Superset embed plugin.
7
+ * @description Holds all patch scripts (Python + Bash) and build scripts as
8
+ * string templates. These are materialized onto disk by the installer. Decaf
9
+ * does not generate new Superset source — it patches existing internal files
10
+ * (`superset-frontend/src/embedded/index.tsx` and
11
+ * `superset-embedded-sdk/src/index.ts`) following the reference implementation
12
+ * from DECAF-40 §9.
13
+ *
14
+ * The patch adds a `switchDashboard` method to Superset's existing Switchboard
15
+ * channel, replacing only `DashboardPage` while keeping the iframe element,
16
+ * document, contentWindow, React runtime, and message channel alive.
17
+ */
18
+ const manifest_js_1 = require("./manifest.cjs");
19
+ const APPLY_PATCH_PY = `#!/usr/bin/env python3
20
+
21
+ from __future__ import annotations
22
+
23
+ import argparse
24
+ import re
25
+ import sys
26
+ from pathlib import Path
27
+
28
+
29
+ FRONTEND_FILE = Path("superset-frontend/src/embedded/index.tsx")
30
+ SDK_FILE = Path("superset-embedded-sdk/src/index.ts")
31
+
32
+
33
+ class PatchError(RuntimeError):
34
+ pass
35
+
36
+
37
+ def replace_once(
38
+ content: str,
39
+ old: str,
40
+ new: str,
41
+ description: str,
42
+ ) -> str:
43
+ count = content.count(old)
44
+
45
+ if count != 1:
46
+ raise PatchError(
47
+ f"{description}: expected exactly one occurrence, found {count}"
48
+ )
49
+
50
+ return content.replace(old, new, 1)
51
+
52
+
53
+ def replace_regex_once(
54
+ content: str,
55
+ pattern: re.Pattern[str],
56
+ replacement: str,
57
+ description: str,
58
+ ) -> str:
59
+ updated, count = pattern.subn(replacement, content, count=1)
60
+
61
+ if count != 1:
62
+ raise PatchError(
63
+ f"{description}: expected exactly one match, found {count}"
64
+ )
65
+
66
+ return updated
67
+
68
+
69
+ def patch_react_import(content: str) -> str:
70
+ react_import_pattern = re.compile(
71
+ r"import\\s*\\{\\s*([^}]+)\\s*\\}\\s*from\\s*'react';"
72
+ )
73
+
74
+ match = react_import_pattern.search(content)
75
+
76
+ if not match:
77
+ raise PatchError("Could not locate the named React import")
78
+
79
+ imports = [
80
+ value.strip()
81
+ for value in match.group(1).replace("\\n", " ").split(",")
82
+ if value.strip()
83
+ ]
84
+
85
+ required_imports = ["lazy", "Suspense", "useEffect", "useState"]
86
+
87
+ for required_import in required_imports:
88
+ if required_import not in imports:
89
+ imports.append(required_import)
90
+
91
+ replacement = (
92
+ "import {\\n "
93
+ + ",\\n ".join(imports)
94
+ + ",\\n} from 'react';"
95
+ )
96
+
97
+ return (
98
+ content[: match.start()]
99
+ + replacement
100
+ + content[match.end() :]
101
+ )
102
+
103
+
104
+ def locate_embedded_component(
105
+ content: str,
106
+ ) -> tuple[re.Match[str], str]:
107
+ names = [
108
+ "EmbeddedLazyDashboardPage",
109
+ "EmbededLazyDashboardPage",
110
+ ]
111
+
112
+ for name in names:
113
+ pattern = re.compile(
114
+ rf"const {name} = \\(\\) => \\{{.*?\\n\\}};\\n"
115
+ rf"(?=const EmbeddedRoute)",
116
+ re.DOTALL,
117
+ )
118
+
119
+ match = pattern.search(content)
120
+
121
+ if match:
122
+ return match, name
123
+
124
+ raise PatchError(
125
+ "Could not find EmbeddedLazyDashboardPage before EmbeddedRoute"
126
+ )
127
+
128
+
129
+ def patch_frontend(frontend_path: Path) -> None:
130
+ content = frontend_path.read_text(encoding="utf-8")
131
+
132
+ if "SUPERSET_SWITCHABLE_EMBED_PATCH" in content:
133
+ print(f"Already patched: {frontend_path}")
134
+ return
135
+
136
+ content = patch_react_import(content)
137
+
138
+ component_match, component_name = locate_embedded_component(
139
+ content
140
+ )
141
+
142
+ replacement_component = \`// SUPERSET_SWITCHABLE_EMBED_PATCH
143
+ //
144
+ // Allows the existing embedded Superset document to replace DashboardPage
145
+ // without navigating or recreating the iframe.
146
+ //
147
+ // Security:
148
+ // - This method is exposed only through Superset's existing Switchboard
149
+ // MessageChannel.
150
+ // - The host application must obtain a guest token for the target dashboard.
151
+ // - Superset's normal Allowed Domains validation remains in effect.
152
+
153
+ interface SwitchDashboardPayload {
154
+ dashboardId: string;
155
+ guestToken: string;
156
+ }
157
+
158
+ interface SwitchDashboardResult {
159
+ dashboardId: string;
160
+ accepted: true;
161
+ }
162
+
163
+ type DashboardSwitchHandler = (
164
+ payload: SwitchDashboardPayload,
165
+ ) => Promise<SwitchDashboardResult>;
166
+
167
+ let dashboardSwitchHandler: DashboardSwitchHandler | undefined;
168
+
169
+ const \${component_name} = () => {
170
+ const uiConfig = useUiConfig();
171
+
172
+ const [dashboardId, setDashboardId] = useState<string | null>(
173
+ bootstrapData.embedded!.dashboard_id,
174
+ );
175
+
176
+ useEffect(() => {
177
+ dashboardSwitchHandler = async ({
178
+ dashboardId: requestedDashboardId,
179
+ guestToken,
180
+ }: SwitchDashboardPayload) => {
181
+ const nextDashboardId = requestedDashboardId.trim();
182
+
183
+ if (!nextDashboardId) {
184
+ throw new Error(
185
+ 'dashboardId must be a non-empty string',
186
+ );
187
+ }
188
+
189
+ if (
190
+ typeof guestToken !== 'string' ||
191
+ guestToken.trim().length === 0
192
+ ) {
193
+ throw new Error(
194
+ 'guestToken must be a non-empty string',
195
+ );
196
+ }
197
+
198
+ setDashboardId(null);
199
+
200
+ displayedUnauthorizedToast = false;
201
+
202
+ setupGuestClient(guestToken);
203
+
204
+ await new Promise<void>(resolve => {
205
+ window.requestAnimationFrame(() => resolve());
206
+ });
207
+
208
+ setDashboardId(nextDashboardId);
209
+
210
+ return {
211
+ dashboardId: nextDashboardId,
212
+ accepted: true,
213
+ };
214
+ };
215
+
216
+ return () => {
217
+ dashboardSwitchHandler = undefined;
218
+ };
219
+ }, []);
220
+
221
+ useEffect(() => {
222
+ if (!uiConfig?.emitDataMasks) {
223
+ return undefined;
224
+ }
225
+
226
+ let previousDataMask = store.getState().dataMask;
227
+
228
+ return store.subscribe(() => {
229
+ const currentDataMask = store.getState().dataMask;
230
+
231
+ if (previousDataMask !== currentDataMask) {
232
+ Switchboard.emit('observeDataMask', {
233
+ ...currentDataMask,
234
+ ...getDataMaskChangeTrigger(
235
+ currentDataMask,
236
+ previousDataMask,
237
+ ),
238
+ });
239
+
240
+ previousDataMask = currentDataMask;
241
+ }
242
+ });
243
+ }, [uiConfig?.emitDataMasks]);
244
+
245
+ if (!dashboardId) {
246
+ return <Loading />;
247
+ }
248
+
249
+ return (
250
+ <LazyDashboardPage
251
+ key={dashboardId}
252
+ idOrSlug={dashboardId}
253
+ />
254
+ );
255
+ };
256
+ \`
257
+
258
+ content = (
259
+ content[: component_match.start()]
260
+ + replacement_component
261
+ + content[component_match.end() :]
262
+ )
263
+
264
+ switchboard_anchor_candidates = [
265
+ (
266
+ " Switchboard.defineMethod("
267
+ "'getScrollSize', embeddedApi.getScrollSize);"
268
+ ),
269
+ (
270
+ " Switchboard.defineMethod(\\n"
271
+ " 'getScrollSize',\\n"
272
+ " embeddedApi.getScrollSize,\\n"
273
+ " );"
274
+ ),
275
+ ]
276
+
277
+ switchboard_method = """ Switchboard.defineMethod(
278
+ 'switchDashboard',
279
+ async (
280
+ payload: SwitchDashboardPayload,
281
+ ): Promise<SwitchDashboardResult> => {
282
+ if (!dashboardSwitchHandler) {
283
+ throw new Error(
284
+ 'The embedded dashboard is not ready to switch',
285
+ );
286
+ }
287
+
288
+ return dashboardSwitchHandler(payload);
289
+ },
290
+ );
291
+
292
+ """
293
+
294
+ anchor_found = False
295
+
296
+ for anchor in switchboard_anchor_candidates:
297
+ if content.count(anchor) == 1:
298
+ content = content.replace(
299
+ anchor,
300
+ switchboard_method + anchor,
301
+ 1,
302
+ )
303
+ anchor_found = True
304
+ break
305
+
306
+ if not anchor_found:
307
+ raise PatchError(
308
+ "Could not locate the getScrollSize Switchboard method"
309
+ )
310
+
311
+ frontend_path.write_text(content, encoding="utf-8")
312
+ print(f"Patched: {frontend_path}")
313
+
314
+
315
+ def patch_guest_token_fetch_type(content: str) -> str:
316
+ candidates = [
317
+ "export type GuestTokenFetchFn = () => Promise<string>;",
318
+ (
319
+ "export type GuestTokenFetchFn = "
320
+ "() => Promise<string>;"
321
+ ),
322
+ ]
323
+
324
+ replacement = """// SUPERSET_SWITCHABLE_EMBED_SDK_PATCH
325
+ //
326
+ // dashboardId is undefined for the initial dashboard bootstrap.
327
+ // After a successful dashboard switch, token refreshes receive the active
328
+ // dashboard UUID.
329
+ export type GuestTokenFetchFn = (
330
+ dashboardId?: string,
331
+ ) => Promise<string>;"""
332
+
333
+ for candidate in candidates:
334
+ if content.count(candidate) == 1:
335
+ return content.replace(
336
+ candidate,
337
+ replacement,
338
+ 1,
339
+ )
340
+
341
+ raise PatchError("Could not locate GuestTokenFetchFn")
342
+
343
+
344
+ def patch_embedded_dashboard_type(content: str) -> str:
345
+ type_pattern = re.compile(
346
+ r"(export\\s+(?:interface|type)\\s+EmbeddedDashboard"
347
+ r".*?\\{)(.*?)(\\n\\};)",
348
+ re.DOTALL,
349
+ )
350
+
351
+ match = type_pattern.search(content)
352
+
353
+ if not match:
354
+ raise PatchError(
355
+ "Could not locate the EmbeddedDashboard public type"
356
+ )
357
+
358
+ body = match.group(2)
359
+
360
+ if "switchDashboard:" in body:
361
+ return content
362
+
363
+ method = """
364
+ /**
365
+ * Replaces DashboardPage in the existing iframe document.
366
+ *
367
+ * The value must be the target dashboard UUID/id accepted by
368
+ * DashboardPage, not the embedded-configuration UUID used in the
369
+ * initial /embedded/:uuid URL.
370
+ */
371
+ switchDashboard: (
372
+ dashboardId: string,
373
+ ) => Promise<{
374
+ dashboardId: string;
375
+ accepted: true;
376
+ }>;
377
+ """
378
+
379
+ updated_type = (
380
+ match.group(1)
381
+ + body.rstrip()
382
+ + "\\n"
383
+ + method.rstrip()
384
+ + match.group(3)
385
+ )
386
+
387
+ return (
388
+ content[: match.start()]
389
+ + updated_type
390
+ + content[match.end() :]
391
+ )
392
+
393
+
394
+ def patch_initial_guest_token_fetch(content: str) -> str:
395
+ candidates = [
396
+ "fetchGuestToken(),",
397
+ "await fetchGuestToken(),",
398
+ ]
399
+
400
+ for candidate in candidates:
401
+ if content.count(candidate) >= 1:
402
+ return content.replace(
403
+ candidate,
404
+ candidate.replace(
405
+ "fetchGuestToken()",
406
+ "fetchGuestToken(undefined)",
407
+ ),
408
+ 1,
409
+ )
410
+
411
+ raise PatchError(
412
+ "Could not locate the initial fetchGuestToken call"
413
+ )
414
+
415
+
416
+ def patch_guest_token_refresh(content: str) -> str:
417
+ patterns = [
418
+ re.compile(
419
+ r"async function refreshGuestToken\\(\\) \\{\\s*"
420
+ r"const newGuestToken = await fetchGuestToken\\(\\);\\s*"
421
+ r"ourPort\\.emit\\("
422
+ r"'guestToken',\\s*\\{\\s*guestToken:\\s*newGuestToken\\s*\\}"
423
+ r"\\);\\s*"
424
+ r"setTimeout\\("
425
+ r"refreshGuestToken,\\s*"
426
+ r"getGuestTokenRefreshTiming\\(newGuestToken\\)"
427
+ r"\\);\\s*"
428
+ r"\\}",
429
+ re.DOTALL,
430
+ ),
431
+ re.compile(
432
+ r"const refreshGuestToken = async \\(\\) => \\{\\s*"
433
+ r"const newGuestToken = await fetchGuestToken\\(\\);\\s*"
434
+ r"ourPort\\.emit\\("
435
+ r"'guestToken',\\s*\\{\\s*guestToken:\\s*newGuestToken\\s*\\}"
436
+ r"\\);\\s*"
437
+ r"setTimeout\\("
438
+ r"refreshGuestToken,\\s*"
439
+ r"getGuestTokenRefreshTiming\\(newGuestToken\\)"
440
+ r"\\);\\s*"
441
+ r"\\};",
442
+ re.DOTALL,
443
+ ),
444
+ ]
445
+
446
+ replacement = """let activeDashboardId: string | undefined;
447
+
448
+ async function refreshGuestToken() {
449
+ const newGuestToken = await fetchGuestToken(
450
+ activeDashboardId,
451
+ );
452
+
453
+ ourPort.emit('guestToken', {
454
+ guestToken: newGuestToken,
455
+ });
456
+
457
+ setTimeout(
458
+ refreshGuestToken,
459
+ getGuestTokenRefreshTiming(newGuestToken),
460
+ );
461
+ }"""
462
+
463
+ for pattern in patterns:
464
+ updated, count = pattern.subn(
465
+ replacement,
466
+ content,
467
+ count=1,
468
+ )
469
+
470
+ if count == 1:
471
+ return updated
472
+
473
+ raise PatchError(
474
+ "Could not locate the guest-token refresh function"
475
+ )
476
+
477
+
478
+ def patch_sdk_functions(content: str) -> str:
479
+ anchor_candidates = [
480
+ (
481
+ " const getScrollSize = () => "
482
+ "ourPort.get<Size>('getScrollSize');"
483
+ ),
484
+ (
485
+ " const getScrollSize = () =>\\n"
486
+ " ourPort.get<Size>('getScrollSize');"
487
+ ),
488
+ ]
489
+
490
+ switch_function = """ const switchDashboard = async (
491
+ dashboardId: string,
492
+ ): Promise<{
493
+ dashboardId: string;
494
+ accepted: true;
495
+ }> => {
496
+ const normalizedDashboardId = dashboardId.trim();
497
+
498
+ if (!normalizedDashboardId) {
499
+ throw new Error(
500
+ 'dashboardId must be a non-empty string',
501
+ );
502
+ }
503
+
504
+ const guestToken = await fetchGuestToken(
505
+ normalizedDashboardId,
506
+ );
507
+
508
+ const result = await ourPort.get<{
509
+ dashboardId: string;
510
+ accepted: true;
511
+ }>('switchDashboard', {
512
+ dashboardId: normalizedDashboardId,
513
+ guestToken,
514
+ });
515
+
516
+ activeDashboardId = normalizedDashboardId;
517
+
518
+ return result;
519
+ };
520
+
521
+ """
522
+
523
+ for anchor in anchor_candidates:
524
+ if content.count(anchor) == 1:
525
+ return content.replace(
526
+ anchor,
527
+ switch_function + anchor,
528
+ 1,
529
+ )
530
+
531
+ raise PatchError(
532
+ "Could not locate the SDK getScrollSize function"
533
+ )
534
+
535
+
536
+ def patch_sdk_return_object(content: str) -> str:
537
+ candidates = [
538
+ " setThemeMode,\\n };",
539
+ " setThemeMode,\\n unmount,\\n };",
540
+ " unmount,\\n setThemeMode,\\n };",
541
+ ]
542
+
543
+ for candidate in candidates:
544
+ if content.count(candidate) == 1:
545
+ lines = candidate.splitlines()
546
+
547
+ closing = lines.pop()
548
+ body = "\\n".join(lines)
549
+
550
+ return content.replace(
551
+ candidate,
552
+ body
553
+ + "\\n"
554
+ + " switchDashboard,\\n"
555
+ + closing,
556
+ 1,
557
+ )
558
+
559
+ raise PatchError(
560
+ "Could not locate the EmbeddedDashboard return object"
561
+ )
562
+
563
+
564
+ def patch_sdk(sdk_path: Path) -> None:
565
+ content = sdk_path.read_text(encoding="utf-8")
566
+
567
+ if "SUPERSET_SWITCHABLE_EMBED_SDK_PATCH" in content:
568
+ print(f"Already patched: {sdk_path}")
569
+ return
570
+
571
+ content = patch_guest_token_fetch_type(content)
572
+ content = patch_embedded_dashboard_type(content)
573
+ content = patch_initial_guest_token_fetch(content)
574
+ content = patch_guest_token_refresh(content)
575
+ content = patch_sdk_functions(content)
576
+ content = patch_sdk_return_object(content)
577
+
578
+ sdk_path.write_text(content, encoding="utf-8")
579
+ print(f"Patched: {sdk_path}")
580
+
581
+
582
+ def main() -> int:
583
+ parser = argparse.ArgumentParser(
584
+ description=(
585
+ "Apply the switchable-dashboard patch to a "
586
+ "Superset 6.1.x source checkout."
587
+ )
588
+ )
589
+
590
+ parser.add_argument(
591
+ "superset_root",
592
+ type=Path,
593
+ help="Path to the Apache Superset source checkout",
594
+ )
595
+
596
+ args = parser.parse_args()
597
+ root = args.superset_root.resolve()
598
+
599
+ frontend_path = root / FRONTEND_FILE
600
+ sdk_path = root / SDK_FILE
601
+
602
+ missing = [
603
+ path
604
+ for path in [frontend_path, sdk_path]
605
+ if not path.exists()
606
+ ]
607
+
608
+ if missing:
609
+ print(
610
+ "The target does not appear to be a compatible "
611
+ "Superset source checkout.",
612
+ file=sys.stderr,
613
+ )
614
+
615
+ for missing_path in missing:
616
+ print(f"Missing: {missing_path}", file=sys.stderr)
617
+
618
+ return 2
619
+
620
+ try:
621
+ patch_frontend(frontend_path)
622
+ patch_sdk(sdk_path)
623
+ except PatchError as error:
624
+ print(f"Patch failed: {error}", file=sys.stderr)
625
+ return 1
626
+
627
+ print("Patch completed successfully.")
628
+ return 0
629
+
630
+
631
+ if __name__ == "__main__":
632
+ raise SystemExit(main())
633
+ `;
634
+ const VERIFY_PATCH_SH = `#!/usr/bin/env bash
635
+
636
+ set -euo pipefail
637
+
638
+ SUPERSET_ROOT=\${1:?Usage: verify_patch.sh /path/to/superset}
639
+
640
+ FRONTEND_FILE="$SUPERSET_ROOT/superset-frontend/src/embedded/index.tsx"
641
+ SDK_FILE="$SUPERSET_ROOT/superset-embedded-sdk/src/index.ts"
642
+
643
+ test -f "$FRONTEND_FILE"
644
+ test -f "$SDK_FILE"
645
+
646
+ grep -q \\
647
+ "SUPERSET_SWITCHABLE_EMBED_PATCH" \\
648
+ "$FRONTEND_FILE"
649
+
650
+ grep -q \\
651
+ "'switchDashboard'" \\
652
+ "$FRONTEND_FILE"
653
+
654
+ grep -q \\
655
+ "dashboardSwitchHandler" \\
656
+ "$FRONTEND_FILE"
657
+
658
+ grep -q \\
659
+ "SUPERSET_SWITCHABLE_EMBED_SDK_PATCH" \\
660
+ "$SDK_FILE"
661
+
662
+ grep -q \\
663
+ "switchDashboard:" \\
664
+ "$SDK_FILE"
665
+
666
+ grep -q \\
667
+ "activeDashboardId" \\
668
+ "$SDK_FILE"
669
+
670
+ grep -q \\
671
+ "fetchGuestToken(" \\
672
+ "$SDK_FILE"
673
+
674
+ echo "The switchable-dashboard patch is present."
675
+ `;
676
+ const BUILD_SDK_SH = `#!/usr/bin/env bash
677
+
678
+ set -euo pipefail
679
+
680
+ SUPERSET_ROOT=\${1:?Usage: build-sdk.sh /path/to/superset}
681
+
682
+ SDK_ROOT="$SUPERSET_ROOT/superset-embedded-sdk"
683
+
684
+ if [ ! -f "$SDK_ROOT/package.json" ]; then
685
+ echo "Missing SDK package: $SDK_ROOT" >&2
686
+ exit 1
687
+ fi
688
+
689
+ cd "$SDK_ROOT"
690
+
691
+ npm ci
692
+
693
+ npm run build
694
+
695
+ echo
696
+ echo "Embedded SDK build completed."
697
+ echo "Output directory:"
698
+ find . \\
699
+ -maxdepth 2 \\
700
+ -type d \\
701
+ \\( -name dist -o -name lib \\) \\
702
+ -print
703
+ `;
704
+ const BUILD_FRONTEND_SH = `#!/usr/bin/env bash
705
+
706
+ set -euo pipefail
707
+
708
+ SUPERSET_ROOT=\${1:?Usage: build-superset-frontend.sh /path/to/superset}
709
+
710
+ FRONTEND_ROOT="$SUPERSET_ROOT/superset-frontend"
711
+
712
+ if [ ! -f "$FRONTEND_ROOT/package.json" ]; then
713
+ echo "Missing Superset frontend: $FRONTEND_ROOT" >&2
714
+ exit 1
715
+ fi
716
+
717
+ cd "$FRONTEND_ROOT"
718
+
719
+ npm ci
720
+
721
+ npm run build
722
+
723
+ echo "Superset frontend build completed."
724
+ `;
725
+ const PATCH_AND_BUILD_SH = `#!/usr/bin/env bash
726
+
727
+ set -euo pipefail
728
+
729
+ SUPERSET_ROOT=\${1:?Usage: patch-and-build.sh /path/to/superset}
730
+
731
+ SCRIPT_DIR=$(
732
+ cd "$(dirname "\${BASH_SOURCE[0]}")"
733
+ pwd
734
+ )
735
+
736
+ PROJECT_ROOT=$(
737
+ cd "$SCRIPT_DIR/.."
738
+ pwd
739
+ )
740
+
741
+ python3 \\
742
+ "$PROJECT_ROOT/patches/apply_superset_6_1_patch.py" \\
743
+ "$SUPERSET_ROOT"
744
+
745
+ "$PROJECT_ROOT/patches/verify_patch.sh" \\
746
+ "$SUPERSET_ROOT"
747
+
748
+ "$SCRIPT_DIR/build-sdk.sh" \\
749
+ "$SUPERSET_ROOT"
750
+
751
+ "$SCRIPT_DIR/build-superset-frontend.sh" \\
752
+ "$SUPERSET_ROOT"
753
+
754
+ echo
755
+ echo "Patch and frontend builds completed."
756
+ `;
757
+ const BUILD_DOCKER_SH = `#!/usr/bin/env bash
758
+
759
+ set -euo pipefail
760
+
761
+ SUPERSET_ROOT=\${1:?Usage: build-docker-image.sh /path/to/superset [image-tag]}
762
+ IMAGE_TAG=\${2:-local/superset-switchable:6.1.0}
763
+
764
+ SCRIPT_DIR=$(
765
+ cd "$(dirname "\${BASH_SOURCE[0]}")"
766
+ pwd
767
+ )
768
+
769
+ PROJECT_ROOT=$(
770
+ cd "$SCRIPT_DIR/.."
771
+ pwd
772
+ )
773
+
774
+ python3 \\
775
+ "$PROJECT_ROOT/patches/apply_superset_6_1_patch.py" \\
776
+ "$SUPERSET_ROOT"
777
+
778
+ "$PROJECT_ROOT/patches/verify_patch.sh" \\
779
+ "$SUPERSET_ROOT"
780
+
781
+ cd "$SUPERSET_ROOT"
782
+
783
+ docker build \\
784
+ --target lean \\
785
+ --tag "$IMAGE_TAG" \\
786
+ .
787
+
788
+ echo "Built Docker image: $IMAGE_TAG"
789
+ `;
790
+ const README = `# ${manifest_js_1.SUPERSET_PLUGIN_ID}
791
+
792
+ Multi-tenant, org-agnostic Superset dashboard embed plugin (patch-and-build strategy).
793
+
794
+ This is not a generated plugin like the Kibana variant. Instead, Decaf holds
795
+ patch scripts that modify Superset's internal embedded frontend and embedded
796
+ SDK source files to add a \`switchDashboard\` method. The existing iframe
797
+ element, document, contentWindow, React runtime, and Switchboard MessageChannel
798
+ are preserved across dashboard switches.
799
+
800
+ ## What it patches
801
+
802
+ - \`superset-frontend/src/embedded/index.tsx\` — adds \`switchDashboard\` to the
803
+ Switchboard channel; replaces only \`DashboardPage\`.
804
+ - \`superset-embedded-sdk/src/index.ts\` — adds
805
+ \`embeddedDashboard.switchDashboard(dashboardId)\`; requests a guest token for
806
+ the selected dashboard; refreshes future guest tokens for the active dashboard.
807
+
808
+ ## Build
809
+
810
+ \`\`\`bash
811
+ # Apply patch + verify + build SDK + build frontend
812
+ build/patch-and-build.sh /path/to/superset
813
+
814
+ # Or build a Docker image
815
+ build/build-docker-image.sh /path/to/superset registry.example.com/superset-switchable:6.1.0
816
+ \`\`\`
817
+
818
+ The patched SDK must be packed and installed into the Angular application:
819
+
820
+ \`\`\`bash
821
+ cd /path/to/superset/superset-embedded-sdk
822
+ npm ci && npm run build && npm pack
823
+ cd /path/to/angular-app
824
+ npm install /path/to/superset/superset-embedded-sdk/superset-ui-embedded-sdk-*.tgz
825
+ \`\`\`
826
+
827
+ Version: ${manifest_js_1.SUPERSET_PLUGIN_VERSION}
828
+ `;
829
+ /**
830
+ * Returns the full set of patch and build script files.
831
+ */
832
+ function supersetPatchFiles() {
833
+ return [
834
+ { path: "patches/apply_superset_6_1_patch.py", content: APPLY_PATCH_PY, executable: true },
835
+ { path: "patches/verify_patch.sh", content: VERIFY_PATCH_SH, executable: true },
836
+ { path: "build/build-sdk.sh", content: BUILD_SDK_SH, executable: true },
837
+ { path: "build/build-superset-frontend.sh", content: BUILD_FRONTEND_SH, executable: true },
838
+ { path: "build/patch-and-build.sh", content: PATCH_AND_BUILD_SH, executable: true },
839
+ { path: "build/build-docker-image.sh", content: BUILD_DOCKER_SH, executable: true },
840
+ { path: "README.md", content: README },
841
+ ];
842
+ }
843
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbnMvc3VwZXJzZXQvdGVtcGxhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsdUJBQXVCLEVBQUUsc0JBQW1CO0FBV3pFLE1BQU0sY0FBYyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXNtQnRCLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F5Q3ZCLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMkJwQixDQUFDO0FBRUYsTUFBTSxpQkFBaUIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FvQnpCLENBQUM7QUFFRixNQUFNLGtCQUFrQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBK0IxQixDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBZ0N2QixDQUFDO0FBRUYsTUFBTSxNQUFNLEdBQUcsS0FBSyxrQkFBa0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7V0FxQzNCLHVCQUF1QjtDQUNqQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCO0lBQ2hDLE9BQU87UUFDTCxFQUFFLElBQUksRUFBRSxxQ0FBcUMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7UUFDMUYsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO1FBQy9FLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtRQUN2RSxFQUFFLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtRQUMxRixFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtRQUNuRixFQUFFLElBQUksRUFBRSw2QkFBNkIsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7UUFDbkYsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUU7S0FDdkMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL3BsdWdpbnMvc3VwZXJzZXQvdGVtcGxhdGVzXG4gKiBAc3VtbWFyeSBQYXRjaCBhbmQgYnVpbGQgc2NyaXB0IHRlbXBsYXRlcyBmb3IgdGhlIFN1cGVyc2V0IGVtYmVkIHBsdWdpbi5cbiAqIEBkZXNjcmlwdGlvbiBIb2xkcyBhbGwgcGF0Y2ggc2NyaXB0cyAoUHl0aG9uICsgQmFzaCkgYW5kIGJ1aWxkIHNjcmlwdHMgYXNcbiAqIHN0cmluZyB0ZW1wbGF0ZXMuIFRoZXNlIGFyZSBtYXRlcmlhbGl6ZWQgb250byBkaXNrIGJ5IHRoZSBpbnN0YWxsZXIuIERlY2FmXG4gKiBkb2VzIG5vdCBnZW5lcmF0ZSBuZXcgU3VwZXJzZXQgc291cmNlIOKAlCBpdCBwYXRjaGVzIGV4aXN0aW5nIGludGVybmFsIGZpbGVzXG4gKiAoYHN1cGVyc2V0LWZyb250ZW5kL3NyYy9lbWJlZGRlZC9pbmRleC50c3hgIGFuZFxuICogYHN1cGVyc2V0LWVtYmVkZGVkLXNkay9zcmMvaW5kZXgudHNgKSBmb2xsb3dpbmcgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvblxuICogZnJvbSBERUNBRi00MCDCpzkuXG4gKlxuICogVGhlIHBhdGNoIGFkZHMgYSBgc3dpdGNoRGFzaGJvYXJkYCBtZXRob2QgdG8gU3VwZXJzZXQncyBleGlzdGluZyBTd2l0Y2hib2FyZFxuICogY2hhbm5lbCwgcmVwbGFjaW5nIG9ubHkgYERhc2hib2FyZFBhZ2VgIHdoaWxlIGtlZXBpbmcgdGhlIGlmcmFtZSBlbGVtZW50LFxuICogZG9jdW1lbnQsIGNvbnRlbnRXaW5kb3csIFJlYWN0IHJ1bnRpbWUsIGFuZCBtZXNzYWdlIGNoYW5uZWwgYWxpdmUuXG4gKi9cbmltcG9ydCB7IFNVUEVSU0VUX1BMVUdJTl9JRCwgU1VQRVJTRVRfUExVR0lOX1ZFUlNJT04gfSBmcm9tIFwiLi9tYW5pZmVzdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1cGVyc2V0UGF0Y2hGaWxlIHtcbiAgLyoqIFJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5LiAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKiBGaWxlIGNvbnRlbnRzLiAqL1xuICBjb250ZW50OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRvIG1hcmsgdGhlIGZpbGUgZXhlY3V0YWJsZSBvbiBQT1NJWC4gKi9cbiAgZXhlY3V0YWJsZT86IGJvb2xlYW47XG59XG5cbmNvbnN0IEFQUExZX1BBVENIX1BZID0gYCMhL3Vzci9iaW4vZW52IHB5dGhvbjNcblxuZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9uc1xuXG5pbXBvcnQgYXJncGFyc2VcbmltcG9ydCByZVxuaW1wb3J0IHN5c1xuZnJvbSBwYXRobGliIGltcG9ydCBQYXRoXG5cblxuRlJPTlRFTkRfRklMRSA9IFBhdGgoXCJzdXBlcnNldC1mcm9udGVuZC9zcmMvZW1iZWRkZWQvaW5kZXgudHN4XCIpXG5TREtfRklMRSA9IFBhdGgoXCJzdXBlcnNldC1lbWJlZGRlZC1zZGsvc3JjL2luZGV4LnRzXCIpXG5cblxuY2xhc3MgUGF0Y2hFcnJvcihSdW50aW1lRXJyb3IpOlxuICAgIHBhc3NcblxuXG5kZWYgcmVwbGFjZV9vbmNlKFxuICAgIGNvbnRlbnQ6IHN0cixcbiAgICBvbGQ6IHN0cixcbiAgICBuZXc6IHN0cixcbiAgICBkZXNjcmlwdGlvbjogc3RyLFxuKSAtPiBzdHI6XG4gICAgY291bnQgPSBjb250ZW50LmNvdW50KG9sZClcblxuICAgIGlmIGNvdW50ICE9IDE6XG4gICAgICAgIHJhaXNlIFBhdGNoRXJyb3IoXG4gICAgICAgICAgICBmXCJ7ZGVzY3JpcHRpb259OiBleHBlY3RlZCBleGFjdGx5IG9uZSBvY2N1cnJlbmNlLCBmb3VuZCB7Y291bnR9XCJcbiAgICAgICAgKVxuXG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShvbGQsIG5ldywgMSlcblxuXG5kZWYgcmVwbGFjZV9yZWdleF9vbmNlKFxuICAgIGNvbnRlbnQ6IHN0cixcbiAgICBwYXR0ZXJuOiByZS5QYXR0ZXJuW3N0cl0sXG4gICAgcmVwbGFjZW1lbnQ6IHN0cixcbiAgICBkZXNjcmlwdGlvbjogc3RyLFxuKSAtPiBzdHI6XG4gICAgdXBkYXRlZCwgY291bnQgPSBwYXR0ZXJuLnN1Ym4ocmVwbGFjZW1lbnQsIGNvbnRlbnQsIGNvdW50PTEpXG5cbiAgICBpZiBjb3VudCAhPSAxOlxuICAgICAgICByYWlzZSBQYXRjaEVycm9yKFxuICAgICAgICAgICAgZlwie2Rlc2NyaXB0aW9ufTogZXhwZWN0ZWQgZXhhY3RseSBvbmUgbWF0Y2gsIGZvdW5kIHtjb3VudH1cIlxuICAgICAgICApXG5cbiAgICByZXR1cm4gdXBkYXRlZFxuXG5cbmRlZiBwYXRjaF9yZWFjdF9pbXBvcnQoY29udGVudDogc3RyKSAtPiBzdHI6XG4gICAgcmVhY3RfaW1wb3J0X3BhdHRlcm4gPSByZS5jb21waWxlKFxuICAgICAgICByXCJpbXBvcnRcXFxccypcXFxce1xcXFxzKihbXn1dKylcXFxccypcXFxcfVxcXFxzKmZyb21cXFxccyoncmVhY3QnO1wiXG4gICAgKVxuXG4gICAgbWF0Y2ggPSByZWFjdF9pbXBvcnRfcGF0dGVybi5zZWFyY2goY29udGVudClcblxuICAgIGlmIG5vdCBtYXRjaDpcbiAgICAgICAgcmFpc2UgUGF0Y2hFcnJvcihcIkNvdWxkIG5vdCBsb2NhdGUgdGhlIG5hbWVkIFJlYWN0IGltcG9ydFwiKVxuXG4gICAgaW1wb3J0cyA9IFtcbiAgICAgICAgdmFsdWUuc3RyaXAoKVxuICAgICAgICBmb3IgdmFsdWUgaW4gbWF0Y2guZ3JvdXAoMSkucmVwbGFjZShcIlxcXFxuXCIsIFwiIFwiKS5zcGxpdChcIixcIilcbiAgICAgICAgaWYgdmFsdWUuc3RyaXAoKVxuICAgIF1cblxuICAgIHJlcXVpcmVkX2ltcG9ydHMgPSBbXCJsYXp5XCIsIFwiU3VzcGVuc2VcIiwgXCJ1c2VFZmZlY3RcIiwgXCJ1c2VTdGF0ZVwiXVxuXG4gICAgZm9yIHJlcXVpcmVkX2ltcG9ydCBpbiByZXF1aXJlZF9pbXBvcnRzOlxuICAgICAgICBpZiByZXF1aXJlZF9pbXBvcnQgbm90IGluIGltcG9ydHM6XG4gICAgICAgICAgICBpbXBvcnRzLmFwcGVuZChyZXF1aXJlZF9pbXBvcnQpXG5cbiAgICByZXBsYWNlbWVudCA9IChcbiAgICAgICAgXCJpbXBvcnQge1xcXFxuICBcIlxuICAgICAgICArIFwiLFxcXFxuICBcIi5qb2luKGltcG9ydHMpXG4gICAgICAgICsgXCIsXFxcXG59IGZyb20gJ3JlYWN0JztcIlxuICAgIClcblxuICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRbOiBtYXRjaC5zdGFydCgpXVxuICAgICAgICArIHJlcGxhY2VtZW50XG4gICAgICAgICsgY29udGVudFttYXRjaC5lbmQoKSA6XVxuICAgIClcblxuXG5kZWYgbG9jYXRlX2VtYmVkZGVkX2NvbXBvbmVudChcbiAgICBjb250ZW50OiBzdHIsXG4pIC0+IHR1cGxlW3JlLk1hdGNoW3N0cl0sIHN0cl06XG4gICAgbmFtZXMgPSBbXG4gICAgICAgIFwiRW1iZWRkZWRMYXp5RGFzaGJvYXJkUGFnZVwiLFxuICAgICAgICBcIkVtYmVkZWRMYXp5RGFzaGJvYXJkUGFnZVwiLFxuICAgIF1cblxuICAgIGZvciBuYW1lIGluIG5hbWVzOlxuICAgICAgICBwYXR0ZXJuID0gcmUuY29tcGlsZShcbiAgICAgICAgICAgIHJmXCJjb25zdCB7bmFtZX0gPSBcXFxcKFxcXFwpID0+IFxcXFx7ey4qP1xcXFxuXFxcXH19O1xcXFxuXCJcbiAgICAgICAgICAgIHJmXCIoPz1jb25zdCBFbWJlZGRlZFJvdXRlKVwiLFxuICAgICAgICAgICAgcmUuRE9UQUxMLFxuICAgICAgICApXG5cbiAgICAgICAgbWF0Y2ggPSBwYXR0ZXJuLnNlYXJjaChjb250ZW50KVxuXG4gICAgICAgIGlmIG1hdGNoOlxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoLCBuYW1lXG5cbiAgICByYWlzZSBQYXRjaEVycm9yKFxuICAgICAgICBcIkNvdWxkIG5vdCBmaW5kIEVtYmVkZGVkTGF6eURhc2hib2FyZFBhZ2UgYmVmb3JlIEVtYmVkZGVkUm91dGVcIlxuICAgIClcblxuXG5kZWYgcGF0Y2hfZnJvbnRlbmQoZnJvbnRlbmRfcGF0aDogUGF0aCkgLT4gTm9uZTpcbiAgICBjb250ZW50ID0gZnJvbnRlbmRfcGF0aC5yZWFkX3RleHQoZW5jb2Rpbmc9XCJ1dGYtOFwiKVxuXG4gICAgaWYgXCJTVVBFUlNFVF9TV0lUQ0hBQkxFX0VNQkVEX1BBVENIXCIgaW4gY29udGVudDpcbiAgICAgICAgcHJpbnQoZlwiQWxyZWFkeSBwYXRjaGVkOiB7ZnJvbnRlbmRfcGF0aH1cIilcbiAgICAgICAgcmV0dXJuXG5cbiAgICBjb250ZW50ID0gcGF0Y2hfcmVhY3RfaW1wb3J0KGNvbnRlbnQpXG5cbiAgICBjb21wb25lbnRfbWF0Y2gsIGNvbXBvbmVudF9uYW1lID0gbG9jYXRlX2VtYmVkZGVkX2NvbXBvbmVudChcbiAgICAgICAgY29udGVudFxuICAgIClcblxuICAgIHJlcGxhY2VtZW50X2NvbXBvbmVudCA9IFxcYC8vIFNVUEVSU0VUX1NXSVRDSEFCTEVfRU1CRURfUEFUQ0hcbi8vXG4vLyBBbGxvd3MgdGhlIGV4aXN0aW5nIGVtYmVkZGVkIFN1cGVyc2V0IGRvY3VtZW50IHRvIHJlcGxhY2UgRGFzaGJvYXJkUGFnZVxuLy8gd2l0aG91dCBuYXZpZ2F0aW5nIG9yIHJlY3JlYXRpbmcgdGhlIGlmcmFtZS5cbi8vXG4vLyBTZWN1cml0eTpcbi8vIC0gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCBvbmx5IHRocm91Z2ggU3VwZXJzZXQncyBleGlzdGluZyBTd2l0Y2hib2FyZFxuLy8gICBNZXNzYWdlQ2hhbm5lbC5cbi8vIC0gVGhlIGhvc3QgYXBwbGljYXRpb24gbXVzdCBvYnRhaW4gYSBndWVzdCB0b2tlbiBmb3IgdGhlIHRhcmdldCBkYXNoYm9hcmQuXG4vLyAtIFN1cGVyc2V0J3Mgbm9ybWFsIEFsbG93ZWQgRG9tYWlucyB2YWxpZGF0aW9uIHJlbWFpbnMgaW4gZWZmZWN0LlxuXG5pbnRlcmZhY2UgU3dpdGNoRGFzaGJvYXJkUGF5bG9hZCB7XG4gIGRhc2hib2FyZElkOiBzdHJpbmc7XG4gIGd1ZXN0VG9rZW46IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFN3aXRjaERhc2hib2FyZFJlc3VsdCB7XG4gIGRhc2hib2FyZElkOiBzdHJpbmc7XG4gIGFjY2VwdGVkOiB0cnVlO1xufVxuXG50eXBlIERhc2hib2FyZFN3aXRjaEhhbmRsZXIgPSAoXG4gIHBheWxvYWQ6IFN3aXRjaERhc2hib2FyZFBheWxvYWQsXG4pID0+IFByb21pc2U8U3dpdGNoRGFzaGJvYXJkUmVzdWx0PjtcblxubGV0IGRhc2hib2FyZFN3aXRjaEhhbmRsZXI6IERhc2hib2FyZFN3aXRjaEhhbmRsZXIgfCB1bmRlZmluZWQ7XG5cbmNvbnN0IFxcJHtjb21wb25lbnRfbmFtZX0gPSAoKSA9PiB7XG4gIGNvbnN0IHVpQ29uZmlnID0gdXNlVWlDb25maWcoKTtcblxuICBjb25zdCBbZGFzaGJvYXJkSWQsIHNldERhc2hib2FyZElkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KFxuICAgIGJvb3RzdHJhcERhdGEuZW1iZWRkZWQhLmRhc2hib2FyZF9pZCxcbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGRhc2hib2FyZFN3aXRjaEhhbmRsZXIgPSBhc3luYyAoe1xuICAgICAgZGFzaGJvYXJkSWQ6IHJlcXVlc3RlZERhc2hib2FyZElkLFxuICAgICAgZ3Vlc3RUb2tlbixcbiAgICB9OiBTd2l0Y2hEYXNoYm9hcmRQYXlsb2FkKSA9PiB7XG4gICAgICBjb25zdCBuZXh0RGFzaGJvYXJkSWQgPSByZXF1ZXN0ZWREYXNoYm9hcmRJZC50cmltKCk7XG5cbiAgICAgIGlmICghbmV4dERhc2hib2FyZElkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnZGFzaGJvYXJkSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBndWVzdFRva2VuICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICBndWVzdFRva2VuLnRyaW0oKS5sZW5ndGggPT09IDBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2d1ZXN0VG9rZW4gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBzZXREYXNoYm9hcmRJZChudWxsKTtcblxuICAgICAgZGlzcGxheWVkVW5hdXRob3JpemVkVG9hc3QgPSBmYWxzZTtcblxuICAgICAgc2V0dXBHdWVzdENsaWVudChndWVzdFRva2VuKTtcblxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXREYXNoYm9hcmRJZChuZXh0RGFzaGJvYXJkSWQpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXNoYm9hcmRJZDogbmV4dERhc2hib2FyZElkLFxuICAgICAgICBhY2NlcHRlZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkYXNoYm9hcmRTd2l0Y2hIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghdWlDb25maWc/LmVtaXREYXRhTWFza3MpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgbGV0IHByZXZpb3VzRGF0YU1hc2sgPSBzdG9yZS5nZXRTdGF0ZSgpLmRhdGFNYXNrO1xuXG4gICAgcmV0dXJuIHN0b3JlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50RGF0YU1hc2sgPSBzdG9yZS5nZXRTdGF0ZSgpLmRhdGFNYXNrO1xuXG4gICAgICBpZiAocHJldmlvdXNEYXRhTWFzayAhPT0gY3VycmVudERhdGFNYXNrKSB7XG4gICAgICAgIFN3aXRjaGJvYXJkLmVtaXQoJ29ic2VydmVEYXRhTWFzaycsIHtcbiAgICAgICAgICAuLi5jdXJyZW50RGF0YU1hc2ssXG4gICAgICAgICAgLi4uZ2V0RGF0YU1hc2tDaGFuZ2VUcmlnZ2VyKFxuICAgICAgICAgICAgY3VycmVudERhdGFNYXNrLFxuICAgICAgICAgICAgcHJldmlvdXNEYXRhTWFzayxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcblxuICAgICAgICBwcmV2aW91c0RhdGFNYXNrID0gY3VycmVudERhdGFNYXNrO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbdWlDb25maWc/LmVtaXREYXRhTWFza3NdKTtcblxuICBpZiAoIWRhc2hib2FyZElkKSB7XG4gICAgcmV0dXJuIDxMb2FkaW5nIC8+O1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8TGF6eURhc2hib2FyZFBhZ2VcbiAgICAgIGtleT17ZGFzaGJvYXJkSWR9XG4gICAgICBpZE9yU2x1Zz17ZGFzaGJvYXJkSWR9XG4gICAgLz5cbiAgKTtcbn07XG5cXGBcblxuICAgIGNvbnRlbnQgPSAoXG4gICAgICAgIGNvbnRlbnRbOiBjb21wb25lbnRfbWF0Y2guc3RhcnQoKV1cbiAgICAgICAgKyByZXBsYWNlbWVudF9jb21wb25lbnRcbiAgICAgICAgKyBjb250ZW50W2NvbXBvbmVudF9tYXRjaC5lbmQoKSA6XVxuICAgIClcblxuICAgIHN3aXRjaGJvYXJkX2FuY2hvcl9jYW5kaWRhdGVzID0gW1xuICAgICAgICAoXG4gICAgICAgICAgICBcIiAgICBTd2l0Y2hib2FyZC5kZWZpbmVNZXRob2QoXCJcbiAgICAgICAgICAgIFwiJ2dldFNjcm9sbFNpemUnLCBlbWJlZGRlZEFwaS5nZXRTY3JvbGxTaXplKTtcIlxuICAgICAgICApLFxuICAgICAgICAoXG4gICAgICAgICAgICBcIiAgICBTd2l0Y2hib2FyZC5kZWZpbmVNZXRob2QoXFxcXG5cIlxuICAgICAgICAgICAgXCIgICAgICAnZ2V0U2Nyb2xsU2l6ZScsXFxcXG5cIlxuICAgICAgICAgICAgXCIgICAgICBlbWJlZGRlZEFwaS5nZXRTY3JvbGxTaXplLFxcXFxuXCJcbiAgICAgICAgICAgIFwiICAgICk7XCJcbiAgICAgICAgKSxcbiAgICBdXG5cbiAgICBzd2l0Y2hib2FyZF9tZXRob2QgPSBcIlwiXCIgICAgU3dpdGNoYm9hcmQuZGVmaW5lTWV0aG9kKFxuICAgICAgJ3N3aXRjaERhc2hib2FyZCcsXG4gICAgICBhc3luYyAoXG4gICAgICAgIHBheWxvYWQ6IFN3aXRjaERhc2hib2FyZFBheWxvYWQsXG4gICAgICApOiBQcm9taXNlPFN3aXRjaERhc2hib2FyZFJlc3VsdD4gPT4ge1xuICAgICAgICBpZiAoIWRhc2hib2FyZFN3aXRjaEhhbmRsZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnVGhlIGVtYmVkZGVkIGRhc2hib2FyZCBpcyBub3QgcmVhZHkgdG8gc3dpdGNoJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhc2hib2FyZFN3aXRjaEhhbmRsZXIocGF5bG9hZCk7XG4gICAgICB9LFxuICAgICk7XG5cblwiXCJcIlxuXG4gICAgYW5jaG9yX2ZvdW5kID0gRmFsc2VcblxuICAgIGZvciBhbmNob3IgaW4gc3dpdGNoYm9hcmRfYW5jaG9yX2NhbmRpZGF0ZXM6XG4gICAgICAgIGlmIGNvbnRlbnQuY291bnQoYW5jaG9yKSA9PSAxOlxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICAgICAgc3dpdGNoYm9hcmRfbWV0aG9kICsgYW5jaG9yLFxuICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBhbmNob3JfZm91bmQgPSBUcnVlXG4gICAgICAgICAgICBicmVha1xuXG4gICAgaWYgbm90IGFuY2hvcl9mb3VuZDpcbiAgICAgICAgcmFpc2UgUGF0Y2hFcnJvcihcbiAgICAgICAgICAgIFwiQ291bGQgbm90IGxvY2F0ZSB0aGUgZ2V0U2Nyb2xsU2l6ZSBTd2l0Y2hib2FyZCBtZXRob2RcIlxuICAgICAgICApXG5cbiAgICBmcm9udGVuZF9wYXRoLndyaXRlX3RleHQoY29udGVudCwgZW5jb2Rpbmc9XCJ1dGYtOFwiKVxuICAgIHByaW50KGZcIlBhdGNoZWQ6IHtmcm9udGVuZF9wYXRofVwiKVxuXG5cbmRlZiBwYXRjaF9ndWVzdF90b2tlbl9mZXRjaF90eXBlKGNvbnRlbnQ6IHN0cikgLT4gc3RyOlxuICAgIGNhbmRpZGF0ZXMgPSBbXG4gICAgICAgIFwiZXhwb3J0IHR5cGUgR3Vlc3RUb2tlbkZldGNoRm4gPSAoKSA9PiBQcm9taXNlPHN0cmluZz47XCIsXG4gICAgICAgIChcbiAgICAgICAgICAgIFwiZXhwb3J0IHR5cGUgR3Vlc3RUb2tlbkZldGNoRm4gPSBcIlxuICAgICAgICAgICAgXCIoKSA9PiBQcm9taXNlPHN0cmluZz47XCJcbiAgICAgICAgKSxcbiAgICBdXG5cbiAgICByZXBsYWNlbWVudCA9IFwiXCJcIi8vIFNVUEVSU0VUX1NXSVRDSEFCTEVfRU1CRURfU0RLX1BBVENIXG4vL1xuLy8gZGFzaGJvYXJkSWQgaXMgdW5kZWZpbmVkIGZvciB0aGUgaW5pdGlhbCBkYXNoYm9hcmQgYm9vdHN0cmFwLlxuLy8gQWZ0ZXIgYSBzdWNjZXNzZnVsIGRhc2hib2FyZCBzd2l0Y2gsIHRva2VuIHJlZnJlc2hlcyByZWNlaXZlIHRoZSBhY3RpdmVcbi8vIGRhc2hib2FyZCBVVUlELlxuZXhwb3J0IHR5cGUgR3Vlc3RUb2tlbkZldGNoRm4gPSAoXG4gIGRhc2hib2FyZElkPzogc3RyaW5nLFxuKSA9PiBQcm9taXNlPHN0cmluZz47XCJcIlwiXG5cbiAgICBmb3IgY2FuZGlkYXRlIGluIGNhbmRpZGF0ZXM6XG4gICAgICAgIGlmIGNvbnRlbnQuY291bnQoY2FuZGlkYXRlKSA9PSAxOlxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQsXG4gICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIClcblxuICAgIHJhaXNlIFBhdGNoRXJyb3IoXCJDb3VsZCBub3QgbG9jYXRlIEd1ZXN0VG9rZW5GZXRjaEZuXCIpXG5cblxuZGVmIHBhdGNoX2VtYmVkZGVkX2Rhc2hib2FyZF90eXBlKGNvbnRlbnQ6IHN0cikgLT4gc3RyOlxuICAgIHR5cGVfcGF0dGVybiA9IHJlLmNvbXBpbGUoXG4gICAgICAgIHJcIihleHBvcnRcXFxccysoPzppbnRlcmZhY2V8dHlwZSlcXFxccytFbWJlZGRlZERhc2hib2FyZFwiXG4gICAgICAgIHJcIi4qP1xcXFx7KSguKj8pKFxcXFxuXFxcXH07KVwiLFxuICAgICAgICByZS5ET1RBTEwsXG4gICAgKVxuXG4gICAgbWF0Y2ggPSB0eXBlX3BhdHRlcm4uc2VhcmNoKGNvbnRlbnQpXG5cbiAgICBpZiBub3QgbWF0Y2g6XG4gICAgICAgIHJhaXNlIFBhdGNoRXJyb3IoXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBsb2NhdGUgdGhlIEVtYmVkZGVkRGFzaGJvYXJkIHB1YmxpYyB0eXBlXCJcbiAgICAgICAgKVxuXG4gICAgYm9keSA9IG1hdGNoLmdyb3VwKDIpXG5cbiAgICBpZiBcInN3aXRjaERhc2hib2FyZDpcIiBpbiBib2R5OlxuICAgICAgICByZXR1cm4gY29udGVudFxuXG4gICAgbWV0aG9kID0gXCJcIlwiXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBEYXNoYm9hcmRQYWdlIGluIHRoZSBleGlzdGluZyBpZnJhbWUgZG9jdW1lbnQuXG4gICAqXG4gICAqIFRoZSB2YWx1ZSBtdXN0IGJlIHRoZSB0YXJnZXQgZGFzaGJvYXJkIFVVSUQvaWQgYWNjZXB0ZWQgYnlcbiAgICogRGFzaGJvYXJkUGFnZSwgbm90IHRoZSBlbWJlZGRlZC1jb25maWd1cmF0aW9uIFVVSUQgdXNlZCBpbiB0aGVcbiAgICogaW5pdGlhbCAvZW1iZWRkZWQvOnV1aWQgVVJMLlxuICAgKi9cbiAgc3dpdGNoRGFzaGJvYXJkOiAoXG4gICAgZGFzaGJvYXJkSWQ6IHN0cmluZyxcbiAgKSA9PiBQcm9taXNlPHtcbiAgICBkYXNoYm9hcmRJZDogc3RyaW5nO1xuICAgIGFjY2VwdGVkOiB0cnVlO1xuICB9PjtcblwiXCJcIlxuXG4gICAgdXBkYXRlZF90eXBlID0gKFxuICAgICAgICBtYXRjaC5ncm91cCgxKVxuICAgICAgICArIGJvZHkucnN0cmlwKClcbiAgICAgICAgKyBcIlxcXFxuXCJcbiAgICAgICAgKyBtZXRob2QucnN0cmlwKClcbiAgICAgICAgKyBtYXRjaC5ncm91cCgzKVxuICAgIClcblxuICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRbOiBtYXRjaC5zdGFydCgpXVxuICAgICAgICArIHVwZGF0ZWRfdHlwZVxuICAgICAgICArIGNvbnRlbnRbbWF0Y2guZW5kKCkgOl1cbiAgICApXG5cblxuZGVmIHBhdGNoX2luaXRpYWxfZ3Vlc3RfdG9rZW5fZmV0Y2goY29udGVudDogc3RyKSAtPiBzdHI6XG4gICAgY2FuZGlkYXRlcyA9IFtcbiAgICAgICAgXCJmZXRjaEd1ZXN0VG9rZW4oKSxcIixcbiAgICAgICAgXCJhd2FpdCBmZXRjaEd1ZXN0VG9rZW4oKSxcIixcbiAgICBdXG5cbiAgICBmb3IgY2FuZGlkYXRlIGluIGNhbmRpZGF0ZXM6XG4gICAgICAgIGlmIGNvbnRlbnQuY291bnQoY2FuZGlkYXRlKSA+PSAxOlxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgIFwiZmV0Y2hHdWVzdFRva2VuKClcIixcbiAgICAgICAgICAgICAgICAgICAgXCJmZXRjaEd1ZXN0VG9rZW4odW5kZWZpbmVkKVwiLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIClcblxuICAgIHJhaXNlIFBhdGNoRXJyb3IoXG4gICAgICAgIFwiQ291bGQgbm90IGxvY2F0ZSB0aGUgaW5pdGlhbCBmZXRjaEd1ZXN0VG9rZW4gY2FsbFwiXG4gICAgKVxuXG5cbmRlZiBwYXRjaF9ndWVzdF90b2tlbl9yZWZyZXNoKGNvbnRlbnQ6IHN0cikgLT4gc3RyOlxuICAgIHBhdHRlcm5zID0gW1xuICAgICAgICByZS5jb21waWxlKFxuICAgICAgICAgICAgclwiYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEd1ZXN0VG9rZW5cXFxcKFxcXFwpIFxcXFx7XFxcXHMqXCJcbiAgICAgICAgICAgIHJcImNvbnN0IG5ld0d1ZXN0VG9rZW4gPSBhd2FpdCBmZXRjaEd1ZXN0VG9rZW5cXFxcKFxcXFwpO1xcXFxzKlwiXG4gICAgICAgICAgICByXCJvdXJQb3J0XFxcXC5lbWl0XFxcXChcIlxuICAgICAgICAgICAgclwiJ2d1ZXN0VG9rZW4nLFxcXFxzKlxcXFx7XFxcXHMqZ3Vlc3RUb2tlbjpcXFxccypuZXdHdWVzdFRva2VuXFxcXHMqXFxcXH1cIlxuICAgICAgICAgICAgclwiXFxcXCk7XFxcXHMqXCJcbiAgICAgICAgICAgIHJcInNldFRpbWVvdXRcXFxcKFwiXG4gICAgICAgICAgICByXCJyZWZyZXNoR3Vlc3RUb2tlbixcXFxccypcIlxuICAgICAgICAgICAgclwiZ2V0R3Vlc3RUb2tlblJlZnJlc2hUaW1pbmdcXFxcKG5ld0d1ZXN0VG9rZW5cXFxcKVwiXG4gICAgICAgICAgICByXCJcXFxcKTtcXFxccypcIlxuICAgICAgICAgICAgclwiXFxcXH1cIixcbiAgICAgICAgICAgIHJlLkRPVEFMTCxcbiAgICAgICAgKSxcbiAgICAgICAgcmUuY29tcGlsZShcbiAgICAgICAgICAgIHJcImNvbnN0IHJlZnJlc2hHdWVzdFRva2VuID0gYXN5bmMgXFxcXChcXFxcKSA9PiBcXFxce1xcXFxzKlwiXG4gICAgICAgICAgICByXCJjb25zdCBuZXdHdWVzdFRva2VuID0gYXdhaXQgZmV0Y2hHdWVzdFRva2VuXFxcXChcXFxcKTtcXFxccypcIlxuICAgICAgICAgICAgclwib3VyUG9ydFxcXFwuZW1pdFxcXFwoXCJcbiAgICAgICAgICAgIHJcIidndWVzdFRva2VuJyxcXFxccypcXFxce1xcXFxzKmd1ZXN0VG9rZW46XFxcXHMqbmV3R3Vlc3RUb2tlblxcXFxzKlxcXFx9XCJcbiAgICAgICAgICAgIHJcIlxcXFwpO1xcXFxzKlwiXG4gICAgICAgICAgICByXCJzZXRUaW1lb3V0XFxcXChcIlxuICAgICAgICAgICAgclwicmVmcmVzaEd1ZXN0VG9rZW4sXFxcXHMqXCJcbiAgICAgICAgICAgIHJcImdldEd1ZXN0VG9rZW5SZWZyZXNoVGltaW5nXFxcXChuZXdHdWVzdFRva2VuXFxcXClcIlxuICAgICAgICAgICAgclwiXFxcXCk7XFxcXHMqXCJcbiAgICAgICAgICAgIHJcIlxcXFx9O1wiLFxuICAgICAgICAgICAgcmUuRE9UQUxMLFxuICAgICAgICApLFxuICAgIF1cblxuICAgIHJlcGxhY2VtZW50ID0gXCJcIlwibGV0IGFjdGl2ZURhc2hib2FyZElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEd1ZXN0VG9rZW4oKSB7XG4gICAgY29uc3QgbmV3R3Vlc3RUb2tlbiA9IGF3YWl0IGZldGNoR3Vlc3RUb2tlbihcbiAgICAgIGFjdGl2ZURhc2hib2FyZElkLFxuICAgICk7XG5cbiAgICBvdXJQb3J0LmVtaXQoJ2d1ZXN0VG9rZW4nLCB7XG4gICAgICBndWVzdFRva2VuOiBuZXdHdWVzdFRva2VuLFxuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChcbiAgICAgIHJlZnJlc2hHdWVzdFRva2VuLFxuICAgICAgZ2V0R3Vlc3RUb2tlblJlZnJlc2hUaW1pbmcobmV3R3Vlc3RUb2tlbiksXG4gICAgKTtcbiAgfVwiXCJcIlxuXG4gICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6XG4gICAgICAgIHVwZGF0ZWQsIGNvdW50ID0gcGF0dGVybi5zdWJuKFxuICAgICAgICAgICAgcmVwbGFjZW1lbnQsXG4gICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgY291bnQ9MSxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIGNvdW50ID09IDE6XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlZFxuXG4gICAgcmFpc2UgUGF0Y2hFcnJvcihcbiAgICAgICAgXCJDb3VsZCBub3QgbG9jYXRlIHRoZSBndWVzdC10b2tlbiByZWZyZXNoIGZ1bmN0aW9uXCJcbiAgICApXG5cblxuZGVmIHBhdGNoX3Nka19mdW5jdGlvbnMoY29udGVudDogc3RyKSAtPiBzdHI6XG4gICAgYW5jaG9yX2NhbmRpZGF0ZXMgPSBbXG4gICAgICAgIChcbiAgICAgICAgICAgIFwiICBjb25zdCBnZXRTY3JvbGxTaXplID0gKCkgPT4gXCJcbiAgICAgICAgICAgIFwib3VyUG9ydC5nZXQ8U2l6ZT4oJ2dldFNjcm9sbFNpemUnKTtcIlxuICAgICAgICApLFxuICAgICAgICAoXG4gICAgICAgICAgICBcIiAgY29uc3QgZ2V0U2Nyb2xsU2l6ZSA9ICgpID0+XFxcXG5cIlxuICAgICAgICAgICAgXCIgICAgb3VyUG9ydC5nZXQ8U2l6ZT4oJ2dldFNjcm9sbFNpemUnKTtcIlxuICAgICAgICApLFxuICAgIF1cblxuICAgIHN3aXRjaF9mdW5jdGlvbiA9IFwiXCJcIiAgY29uc3Qgc3dpdGNoRGFzaGJvYXJkID0gYXN5bmMgKFxuICAgIGRhc2hib2FyZElkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8e1xuICAgIGRhc2hib2FyZElkOiBzdHJpbmc7XG4gICAgYWNjZXB0ZWQ6IHRydWU7XG4gIH0+ID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkRGFzaGJvYXJkSWQgPSBkYXNoYm9hcmRJZC50cmltKCk7XG5cbiAgICBpZiAoIW5vcm1hbGl6ZWREYXNoYm9hcmRJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnZGFzaGJvYXJkSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBndWVzdFRva2VuID0gYXdhaXQgZmV0Y2hHdWVzdFRva2VuKFxuICAgICAgbm9ybWFsaXplZERhc2hib2FyZElkLFxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXJQb3J0LmdldDx7XG4gICAgICBkYXNoYm9hcmRJZDogc3RyaW5nO1xuICAgICAgYWNjZXB0ZWQ6IHRydWU7XG4gICAgfT4oJ3N3aXRjaERhc2hib2FyZCcsIHtcbiAgICAgIGRhc2hib2FyZElkOiBub3JtYWxpemVkRGFzaGJvYXJkSWQsXG4gICAgICBndWVzdFRva2VuLFxuICAgIH0pO1xuXG4gICAgYWN0aXZlRGFzaGJvYXJkSWQgPSBub3JtYWxpemVkRGFzaGJvYXJkSWQ7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG5cIlwiXCJcblxuICAgIGZvciBhbmNob3IgaW4gYW5jaG9yX2NhbmRpZGF0ZXM6XG4gICAgICAgIGlmIGNvbnRlbnQuY291bnQoYW5jaG9yKSA9PSAxOlxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICAgICAgc3dpdGNoX2Z1bmN0aW9uICsgYW5jaG9yLFxuICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICApXG5cbiAgICByYWlzZSBQYXRjaEVycm9yKFxuICAgICAgICBcIkNvdWxkIG5vdCBsb2NhdGUgdGhlIFNESyBnZXRTY3JvbGxTaXplIGZ1bmN0aW9uXCJcbiAgICApXG5cblxuZGVmIHBhdGNoX3Nka19yZXR1cm5fb2JqZWN0KGNvbnRlbnQ6IHN0cikgLT4gc3RyOlxuICAgIGNhbmRpZGF0ZXMgPSBbXG4gICAgICAgIFwiICAgIHNldFRoZW1lTW9kZSxcXFxcbiAgfTtcIixcbiAgICAgICAgXCIgICAgc2V0VGhlbWVNb2RlLFxcXFxuICAgIHVubW91bnQsXFxcXG4gIH07XCIsXG4gICAgICAgIFwiICAgIHVubW91bnQsXFxcXG4gICAgc2V0VGhlbWVNb2RlLFxcXFxuICB9O1wiLFxuICAgIF1cblxuICAgIGZvciBjYW5kaWRhdGUgaW4gY2FuZGlkYXRlczpcbiAgICAgICAgaWYgY29udGVudC5jb3VudChjYW5kaWRhdGUpID09IDE6XG4gICAgICAgICAgICBsaW5lcyA9IGNhbmRpZGF0ZS5zcGxpdGxpbmVzKClcblxuICAgICAgICAgICAgY2xvc2luZyA9IGxpbmVzLnBvcCgpXG4gICAgICAgICAgICBib2R5ID0gXCJcXFxcblwiLmpvaW4obGluZXMpXG5cbiAgICAgICAgICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlLFxuICAgICAgICAgICAgICAgIGJvZHlcbiAgICAgICAgICAgICAgICArIFwiXFxcXG5cIlxuICAgICAgICAgICAgICAgICsgXCIgICAgc3dpdGNoRGFzaGJvYXJkLFxcXFxuXCJcbiAgICAgICAgICAgICAgICArIGNsb3NpbmcsXG4gICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIClcblxuICAgIHJhaXNlIFBhdGNoRXJyb3IoXG4gICAgICAgIFwiQ291bGQgbm90IGxvY2F0ZSB0aGUgRW1iZWRkZWREYXNoYm9hcmQgcmV0dXJuIG9iamVjdFwiXG4gICAgKVxuXG5cbmRlZiBwYXRjaF9zZGsoc2RrX3BhdGg6IFBhdGgpIC0+IE5vbmU6XG4gICAgY29udGVudCA9IHNka19wYXRoLnJlYWRfdGV4dChlbmNvZGluZz1cInV0Zi04XCIpXG5cbiAgICBpZiBcIlNVUEVSU0VUX1NXSVRDSEFCTEVfRU1CRURfU0RLX1BBVENIXCIgaW4gY29udGVudDpcbiAgICAgICAgcHJpbnQoZlwiQWxyZWFkeSBwYXRjaGVkOiB7c2RrX3BhdGh9XCIpXG4gICAgICAgIHJldHVyblxuXG4gICAgY29udGVudCA9IHBhdGNoX2d1ZXN0X3Rva2VuX2ZldGNoX3R5cGUoY29udGVudClcbiAgICBjb250ZW50ID0gcGF0Y2hfZW1iZWRkZWRfZGFzaGJvYXJkX3R5cGUoY29udGVudClcbiAgICBjb250ZW50ID0gcGF0Y2hfaW5pdGlhbF9ndWVzdF90b2tlbl9mZXRjaChjb250ZW50KVxuICAgIGNvbnRlbnQgPSBwYXRjaF9ndWVzdF90b2tlbl9yZWZyZXNoKGNvbnRlbnQpXG4gICAgY29udGVudCA9IHBhdGNoX3Nka19mdW5jdGlvbnMoY29udGVudClcbiAgICBjb250ZW50ID0gcGF0Y2hfc2RrX3JldHVybl9vYmplY3QoY29udGVudClcblxuICAgIHNka19wYXRoLndyaXRlX3RleHQoY29udGVudCwgZW5jb2Rpbmc9XCJ1dGYtOFwiKVxuICAgIHByaW50KGZcIlBhdGNoZWQ6IHtzZGtfcGF0aH1cIilcblxuXG5kZWYgbWFpbigpIC0+IGludDpcbiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihcbiAgICAgICAgZGVzY3JpcHRpb249KFxuICAgICAgICAgICAgXCJBcHBseSB0aGUgc3dpdGNoYWJsZS1kYXNoYm9hcmQgcGF0Y2ggdG8gYSBcIlxuICAgICAgICAgICAgXCJTdXBlcnNldCA2LjEueCBzb3VyY2UgY2hlY2tvdXQuXCJcbiAgICAgICAgKVxuICAgIClcblxuICAgIHBhcnNlci5hZGRfYXJndW1lbnQoXG4gICAgICAgIFwic3VwZXJzZXRfcm9vdFwiLFxuICAgICAgICB0eXBlPVBhdGgsXG4gICAgICAgIGhlbHA9XCJQYXRoIHRvIHRoZSBBcGFjaGUgU3VwZXJzZXQgc291cmNlIGNoZWNrb3V0XCIsXG4gICAgKVxuXG4gICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKClcbiAgICByb290ID0gYXJncy5zdXBlcnNldF9yb290LnJlc29sdmUoKVxuXG4gICAgZnJvbnRlbmRfcGF0aCA9IHJvb3QgLyBGUk9OVEVORF9GSUxFXG4gICAgc2RrX3BhdGggPSByb290IC8gU0RLX0ZJTEVcblxuICAgIG1pc3NpbmcgPSBbXG4gICAgICAgIHBhdGhcbiAgICAgICAgZm9yIHBhdGggaW4gW2Zyb250ZW5kX3BhdGgsIHNka19wYXRoXVxuICAgICAgICBpZiBub3QgcGF0aC5leGlzdHMoKVxuICAgIF1cblxuICAgIGlmIG1pc3Npbmc6XG4gICAgICAgIHByaW50KFxuICAgICAgICAgICAgXCJUaGUgdGFyZ2V0IGRvZXMgbm90IGFwcGVhciB0byBiZSBhIGNvbXBhdGlibGUgXCJcbiAgICAgICAgICAgIFwiU3VwZXJzZXQgc291cmNlIGNoZWNrb3V0LlwiLFxuICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyLFxuICAgICAgICApXG5cbiAgICAgICAgZm9yIG1pc3NpbmdfcGF0aCBpbiBtaXNzaW5nOlxuICAgICAgICAgICAgcHJpbnQoZlwiTWlzc2luZzoge21pc3NpbmdfcGF0aH1cIiwgZmlsZT1zeXMuc3RkZXJyKVxuXG4gICAgICAgIHJldHVybiAyXG5cbiAgICB0cnk6XG4gICAgICAgIHBhdGNoX2Zyb250ZW5kKGZyb250ZW5kX3BhdGgpXG4gICAgICAgIHBhdGNoX3NkayhzZGtfcGF0aClcbiAgICBleGNlcHQgUGF0Y2hFcnJvciBhcyBlcnJvcjpcbiAgICAgICAgcHJpbnQoZlwiUGF0Y2ggZmFpbGVkOiB7ZXJyb3J9XCIsIGZpbGU9c3lzLnN0ZGVycilcbiAgICAgICAgcmV0dXJuIDFcblxuICAgIHByaW50KFwiUGF0Y2ggY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cIilcbiAgICByZXR1cm4gMFxuXG5cbmlmIF9fbmFtZV9fID09IFwiX19tYWluX19cIjpcbiAgICByYWlzZSBTeXN0ZW1FeGl0KG1haW4oKSlcbmA7XG5cbmNvbnN0IFZFUklGWV9QQVRDSF9TSCA9IGAjIS91c3IvYmluL2VudiBiYXNoXG5cbnNldCAtZXVvIHBpcGVmYWlsXG5cblNVUEVSU0VUX1JPT1Q9XFwkezE6P1VzYWdlOiB2ZXJpZnlfcGF0Y2guc2ggL3BhdGgvdG8vc3VwZXJzZXR9XG5cbkZST05URU5EX0ZJTEU9XCIkU1VQRVJTRVRfUk9PVC9zdXBlcnNldC1mcm9udGVuZC9zcmMvZW1iZWRkZWQvaW5kZXgudHN4XCJcblNES19GSUxFPVwiJFNVUEVSU0VUX1JPT1Qvc3VwZXJzZXQtZW1iZWRkZWQtc2RrL3NyYy9pbmRleC50c1wiXG5cbnRlc3QgLWYgXCIkRlJPTlRFTkRfRklMRVwiXG50ZXN0IC1mIFwiJFNES19GSUxFXCJcblxuZ3JlcCAtcSBcXFxcXG4gIFwiU1VQRVJTRVRfU1dJVENIQUJMRV9FTUJFRF9QQVRDSFwiIFxcXFxcbiAgXCIkRlJPTlRFTkRfRklMRVwiXG5cbmdyZXAgLXEgXFxcXFxuICBcIidzd2l0Y2hEYXNoYm9hcmQnXCIgXFxcXFxuICBcIiRGUk9OVEVORF9GSUxFXCJcblxuZ3JlcCAtcSBcXFxcXG4gIFwiZGFzaGJvYXJkU3dpdGNoSGFuZGxlclwiIFxcXFxcbiAgXCIkRlJPTlRFTkRfRklMRVwiXG5cbmdyZXAgLXEgXFxcXFxuICBcIlNVUEVSU0VUX1NXSVRDSEFCTEVfRU1CRURfU0RLX1BBVENIXCIgXFxcXFxuICBcIiRTREtfRklMRVwiXG5cbmdyZXAgLXEgXFxcXFxuICBcInN3aXRjaERhc2hib2FyZDpcIiBcXFxcXG4gIFwiJFNES19GSUxFXCJcblxuZ3JlcCAtcSBcXFxcXG4gIFwiYWN0aXZlRGFzaGJvYXJkSWRcIiBcXFxcXG4gIFwiJFNES19GSUxFXCJcblxuZ3JlcCAtcSBcXFxcXG4gIFwiZmV0Y2hHdWVzdFRva2VuKFwiIFxcXFxcbiAgXCIkU0RLX0ZJTEVcIlxuXG5lY2hvIFwiVGhlIHN3aXRjaGFibGUtZGFzaGJvYXJkIHBhdGNoIGlzIHByZXNlbnQuXCJcbmA7XG5cbmNvbnN0IEJVSUxEX1NES19TSCA9IGAjIS91c3IvYmluL2VudiBiYXNoXG5cbnNldCAtZXVvIHBpcGVmYWlsXG5cblNVUEVSU0VUX1JPT1Q9XFwkezE6P1VzYWdlOiBidWlsZC1zZGsuc2ggL3BhdGgvdG8vc3VwZXJzZXR9XG5cblNES19ST09UPVwiJFNVUEVSU0VUX1JPT1Qvc3VwZXJzZXQtZW1iZWRkZWQtc2RrXCJcblxuaWYgWyAhIC1mIFwiJFNES19ST09UL3BhY2thZ2UuanNvblwiIF07IHRoZW5cbiAgZWNobyBcIk1pc3NpbmcgU0RLIHBhY2thZ2U6ICRTREtfUk9PVFwiID4mMlxuICBleGl0IDFcbmZpXG5cbmNkIFwiJFNES19ST09UXCJcblxubnBtIGNpXG5cbm5wbSBydW4gYnVpbGRcblxuZWNob1xuZWNobyBcIkVtYmVkZGVkIFNESyBidWlsZCBjb21wbGV0ZWQuXCJcbmVjaG8gXCJPdXRwdXQgZGlyZWN0b3J5OlwiXG5maW5kIC4gXFxcXFxuICAtbWF4ZGVwdGggMiBcXFxcXG4gIC10eXBlIGQgXFxcXFxuICBcXFxcKCAtbmFtZSBkaXN0IC1vIC1uYW1lIGxpYiBcXFxcKSBcXFxcXG4gIC1wcmludFxuYDtcblxuY29uc3QgQlVJTERfRlJPTlRFTkRfU0ggPSBgIyEvdXNyL2Jpbi9lbnYgYmFzaFxuXG5zZXQgLWV1byBwaXBlZmFpbFxuXG5TVVBFUlNFVF9ST09UPVxcJHsxOj9Vc2FnZTogYnVpbGQtc3VwZXJzZXQtZnJvbnRlbmQuc2ggL3BhdGgvdG8vc3VwZXJzZXR9XG5cbkZST05URU5EX1JPT1Q9XCIkU1VQRVJTRVRfUk9PVC9zdXBlcnNldC1mcm9udGVuZFwiXG5cbmlmIFsgISAtZiBcIiRGUk9OVEVORF9ST09UL3BhY2thZ2UuanNvblwiIF07IHRoZW5cbiAgZWNobyBcIk1pc3NpbmcgU3VwZXJzZXQgZnJvbnRlbmQ6ICRGUk9OVEVORF9ST09UXCIgPiYyXG4gIGV4aXQgMVxuZmlcblxuY2QgXCIkRlJPTlRFTkRfUk9PVFwiXG5cbm5wbSBjaVxuXG5ucG0gcnVuIGJ1aWxkXG5cbmVjaG8gXCJTdXBlcnNldCBmcm9udGVuZCBidWlsZCBjb21wbGV0ZWQuXCJcbmA7XG5cbmNvbnN0IFBBVENIX0FORF9CVUlMRF9TSCA9IGAjIS91c3IvYmluL2VudiBiYXNoXG5cbnNldCAtZXVvIHBpcGVmYWlsXG5cblNVUEVSU0VUX1JPT1Q9XFwkezE6P1VzYWdlOiBwYXRjaC1hbmQtYnVpbGQuc2ggL3BhdGgvdG8vc3VwZXJzZXR9XG5cblNDUklQVF9ESVI9JChcbiAgY2QgXCIkKGRpcm5hbWUgXCJcXCR7QkFTSF9TT1VSQ0VbMF19XCIpXCJcbiAgcHdkXG4pXG5cblBST0pFQ1RfUk9PVD0kKFxuICBjZCBcIiRTQ1JJUFRfRElSLy4uXCJcbiAgcHdkXG4pXG5cbnB5dGhvbjMgXFxcXFxuICBcIiRQUk9KRUNUX1JPT1QvcGF0Y2hlcy9hcHBseV9zdXBlcnNldF82XzFfcGF0Y2gucHlcIiBcXFxcXG4gIFwiJFNVUEVSU0VUX1JPT1RcIlxuXG5cIiRQUk9KRUNUX1JPT1QvcGF0Y2hlcy92ZXJpZnlfcGF0Y2guc2hcIiBcXFxcXG4gIFwiJFNVUEVSU0VUX1JPT1RcIlxuXG5cIiRTQ1JJUFRfRElSL2J1aWxkLXNkay5zaFwiIFxcXFxcbiAgXCIkU1VQRVJTRVRfUk9PVFwiXG5cblwiJFNDUklQVF9ESVIvYnVpbGQtc3VwZXJzZXQtZnJvbnRlbmQuc2hcIiBcXFxcXG4gIFwiJFNVUEVSU0VUX1JPT1RcIlxuXG5lY2hvXG5lY2hvIFwiUGF0Y2ggYW5kIGZyb250ZW5kIGJ1aWxkcyBjb21wbGV0ZWQuXCJcbmA7XG5cbmNvbnN0IEJVSUxEX0RPQ0tFUl9TSCA9IGAjIS91c3IvYmluL2VudiBiYXNoXG5cbnNldCAtZXVvIHBpcGVmYWlsXG5cblNVUEVSU0VUX1JPT1Q9XFwkezE6P1VzYWdlOiBidWlsZC1kb2NrZXItaW1hZ2Uuc2ggL3BhdGgvdG8vc3VwZXJzZXQgW2ltYWdlLXRhZ119XG5JTUFHRV9UQUc9XFwkezI6LWxvY2FsL3N1cGVyc2V0LXN3aXRjaGFibGU6Ni4xLjB9XG5cblNDUklQVF9ESVI9JChcbiAgY2QgXCIkKGRpcm5hbWUgXCJcXCR7QkFTSF9TT1VSQ0VbMF19XCIpXCJcbiAgcHdkXG4pXG5cblBST0pFQ1RfUk9PVD0kKFxuICBjZCBcIiRTQ1JJUFRfRElSLy4uXCJcbiAgcHdkXG4pXG5cbnB5dGhvbjMgXFxcXFxuICBcIiRQUk9KRUNUX1JPT1QvcGF0Y2hlcy9hcHBseV9zdXBlcnNldF82XzFfcGF0Y2gucHlcIiBcXFxcXG4gIFwiJFNVUEVSU0VUX1JPT1RcIlxuXG5cIiRQUk9KRUNUX1JPT1QvcGF0Y2hlcy92ZXJpZnlfcGF0Y2guc2hcIiBcXFxcXG4gIFwiJFNVUEVSU0VUX1JPT1RcIlxuXG5jZCBcIiRTVVBFUlNFVF9ST09UXCJcblxuZG9ja2VyIGJ1aWxkIFxcXFxcbiAgLS10YXJnZXQgbGVhbiBcXFxcXG4gIC0tdGFnIFwiJElNQUdFX1RBR1wiIFxcXFxcbiAgLlxuXG5lY2hvIFwiQnVpbHQgRG9ja2VyIGltYWdlOiAkSU1BR0VfVEFHXCJcbmA7XG5cbmNvbnN0IFJFQURNRSA9IGAjICR7U1VQRVJTRVRfUExVR0lOX0lEfVxuXG5NdWx0aS10ZW5hbnQsIG9yZy1hZ25vc3RpYyBTdXBlcnNldCBkYXNoYm9hcmQgZW1iZWQgcGx1Z2luIChwYXRjaC1hbmQtYnVpbGQgc3RyYXRlZ3kpLlxuXG5UaGlzIGlzIG5vdCBhIGdlbmVyYXRlZCBwbHVnaW4gbGlrZSB0aGUgS2liYW5hIHZhcmlhbnQuIEluc3RlYWQsIERlY2FmIGhvbGRzXG5wYXRjaCBzY3JpcHRzIHRoYXQgbW9kaWZ5IFN1cGVyc2V0J3MgaW50ZXJuYWwgZW1iZWRkZWQgZnJvbnRlbmQgYW5kIGVtYmVkZGVkXG5TREsgc291cmNlIGZpbGVzIHRvIGFkZCBhIFxcYHN3aXRjaERhc2hib2FyZFxcYCBtZXRob2QuIFRoZSBleGlzdGluZyBpZnJhbWVcbmVsZW1lbnQsIGRvY3VtZW50LCBjb250ZW50V2luZG93LCBSZWFjdCBydW50aW1lLCBhbmQgU3dpdGNoYm9hcmQgTWVzc2FnZUNoYW5uZWxcbmFyZSBwcmVzZXJ2ZWQgYWNyb3NzIGRhc2hib2FyZCBzd2l0Y2hlcy5cblxuIyMgV2hhdCBpdCBwYXRjaGVzXG5cbi0gXFxgc3VwZXJzZXQtZnJvbnRlbmQvc3JjL2VtYmVkZGVkL2luZGV4LnRzeFxcYCDigJQgYWRkcyBcXGBzd2l0Y2hEYXNoYm9hcmRcXGAgdG8gdGhlXG4gIFN3aXRjaGJvYXJkIGNoYW5uZWw7IHJlcGxhY2VzIG9ubHkgXFxgRGFzaGJvYXJkUGFnZVxcYC5cbi0gXFxgc3VwZXJzZXQtZW1iZWRkZWQtc2RrL3NyYy9pbmRleC50c1xcYCDigJQgYWRkc1xuICBcXGBlbWJlZGRlZERhc2hib2FyZC5zd2l0Y2hEYXNoYm9hcmQoZGFzaGJvYXJkSWQpXFxgOyByZXF1ZXN0cyBhIGd1ZXN0IHRva2VuIGZvclxuICB0aGUgc2VsZWN0ZWQgZGFzaGJvYXJkOyByZWZyZXNoZXMgZnV0dXJlIGd1ZXN0IHRva2VucyBmb3IgdGhlIGFjdGl2ZSBkYXNoYm9hcmQuXG5cbiMjIEJ1aWxkXG5cblxcYFxcYFxcYGJhc2hcbiMgQXBwbHkgcGF0Y2ggKyB2ZXJpZnkgKyBidWlsZCBTREsgKyBidWlsZCBmcm9udGVuZFxuYnVpbGQvcGF0Y2gtYW5kLWJ1aWxkLnNoIC9wYXRoL3RvL3N1cGVyc2V0XG5cbiMgT3IgYnVpbGQgYSBEb2NrZXIgaW1hZ2VcbmJ1aWxkL2J1aWxkLWRvY2tlci1pbWFnZS5zaCAvcGF0aC90by9zdXBlcnNldCByZWdpc3RyeS5leGFtcGxlLmNvbS9zdXBlcnNldC1zd2l0Y2hhYmxlOjYuMS4wXG5cXGBcXGBcXGBcblxuVGhlIHBhdGNoZWQgU0RLIG11c3QgYmUgcGFja2VkIGFuZCBpbnN0YWxsZWQgaW50byB0aGUgQW5ndWxhciBhcHBsaWNhdGlvbjpcblxuXFxgXFxgXFxgYmFzaFxuY2QgL3BhdGgvdG8vc3VwZXJzZXQvc3VwZXJzZXQtZW1iZWRkZWQtc2RrXG5ucG0gY2kgJiYgbnBtIHJ1biBidWlsZCAmJiBucG0gcGFja1xuY2QgL3BhdGgvdG8vYW5ndWxhci1hcHBcbm5wbSBpbnN0YWxsIC9wYXRoL3RvL3N1cGVyc2V0L3N1cGVyc2V0LWVtYmVkZGVkLXNkay9zdXBlcnNldC11aS1lbWJlZGRlZC1zZGstKi50Z3pcblxcYFxcYFxcYFxuXG5WZXJzaW9uOiAke1NVUEVSU0VUX1BMVUdJTl9WRVJTSU9OfVxuYDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBwYXRjaCBhbmQgYnVpbGQgc2NyaXB0IGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwZXJzZXRQYXRjaEZpbGVzKCk6IFN1cGVyc2V0UGF0Y2hGaWxlW10ge1xuICByZXR1cm4gW1xuICAgIHsgcGF0aDogXCJwYXRjaGVzL2FwcGx5X3N1cGVyc2V0XzZfMV9wYXRjaC5weVwiLCBjb250ZW50OiBBUFBMWV9QQVRDSF9QWSwgZXhlY3V0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcGF0aDogXCJwYXRjaGVzL3ZlcmlmeV9wYXRjaC5zaFwiLCBjb250ZW50OiBWRVJJRllfUEFUQ0hfU0gsIGV4ZWN1dGFibGU6IHRydWUgfSxcbiAgICB7IHBhdGg6IFwiYnVpbGQvYnVpbGQtc2RrLnNoXCIsIGNvbnRlbnQ6IEJVSUxEX1NES19TSCwgZXhlY3V0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcGF0aDogXCJidWlsZC9idWlsZC1zdXBlcnNldC1mcm9udGVuZC5zaFwiLCBjb250ZW50OiBCVUlMRF9GUk9OVEVORF9TSCwgZXhlY3V0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcGF0aDogXCJidWlsZC9wYXRjaC1hbmQtYnVpbGQuc2hcIiwgY29udGVudDogUEFUQ0hfQU5EX0JVSUxEX1NILCBleGVjdXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwYXRoOiBcImJ1aWxkL2J1aWxkLWRvY2tlci1pbWFnZS5zaFwiLCBjb250ZW50OiBCVUlMRF9ET0NLRVJfU0gsIGV4ZWN1dGFibGU6IHRydWUgfSxcbiAgICB7IHBhdGg6IFwiUkVBRE1FLm1kXCIsIGNvbnRlbnQ6IFJFQURNRSB9LFxuICBdO1xufVxuIl19
844
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidGVtcGxhdGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNHpCQSxnREFVQztBQXQwQkQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILCtDQUE0RTtBQUM1RSxNQUFNLGNBQWMsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FzbUJ0QixDQUFDO0FBQ0YsTUFBTSxlQUFlLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBeUN2QixDQUFDO0FBQ0YsTUFBTSxZQUFZLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTJCcEIsQ0FBQztBQUNGLE1BQU0saUJBQWlCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBb0J6QixDQUFDO0FBQ0YsTUFBTSxrQkFBa0IsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQStCMUIsQ0FBQztBQUNGLE1BQU0sZUFBZSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWdDdkIsQ0FBQztBQUNGLE1BQU0sTUFBTSxHQUFHLEtBQUssZ0NBQWtCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1dBcUMzQixxQ0FBdUI7Q0FDakMsQ0FBQztBQUNGOztHQUVHO0FBQ0gsU0FBZ0Isa0JBQWtCO0lBQzlCLE9BQU87UUFDSCxFQUFFLElBQUksRUFBRSxxQ0FBcUMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7UUFDMUYsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO1FBQy9FLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtRQUN2RSxFQUFFLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtRQUMxRixFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtRQUNuRixFQUFFLElBQUksRUFBRSw2QkFBNkIsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7UUFDbkYsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUU7S0FDekMsQ0FBQztBQUNOLENBQUM7QUFDRCw4MitCQUE4MitCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9wbHVnaW5zL3N1cGVyc2V0L3RlbXBsYXRlc1xuICogQHN1bW1hcnkgUGF0Y2ggYW5kIGJ1aWxkIHNjcmlwdCB0ZW1wbGF0ZXMgZm9yIHRoZSBTdXBlcnNldCBlbWJlZCBwbHVnaW4uXG4gKiBAZGVzY3JpcHRpb24gSG9sZHMgYWxsIHBhdGNoIHNjcmlwdHMgKFB5dGhvbiArIEJhc2gpIGFuZCBidWlsZCBzY3JpcHRzIGFzXG4gKiBzdHJpbmcgdGVtcGxhdGVzLiBUaGVzZSBhcmUgbWF0ZXJpYWxpemVkIG9udG8gZGlzayBieSB0aGUgaW5zdGFsbGVyLiBEZWNhZlxuICogZG9lcyBub3QgZ2VuZXJhdGUgbmV3IFN1cGVyc2V0IHNvdXJjZSDigJQgaXQgcGF0Y2hlcyBleGlzdGluZyBpbnRlcm5hbCBmaWxlc1xuICogKGBzdXBlcnNldC1mcm9udGVuZC9zcmMvZW1iZWRkZWQvaW5kZXgudHN4YCBhbmRcbiAqIGBzdXBlcnNldC1lbWJlZGRlZC1zZGsvc3JjL2luZGV4LnRzYCkgZm9sbG93aW5nIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb25cbiAqIGZyb20gREVDQUYtNDAgwqc5LlxuICpcbiAqIFRoZSBwYXRjaCBhZGRzIGEgYHN3aXRjaERhc2hib2FyZGAgbWV0aG9kIHRvIFN1cGVyc2V0J3MgZXhpc3RpbmcgU3dpdGNoYm9hcmRcbiAqIGNoYW5uZWwsIHJlcGxhY2luZyBvbmx5IGBEYXNoYm9hcmRQYWdlYCB3aGlsZSBrZWVwaW5nIHRoZSBpZnJhbWUgZWxlbWVudCxcbiAqIGRvY3VtZW50LCBjb250ZW50V2luZG93LCBSZWFjdCBydW50aW1lLCBhbmQgbWVzc2FnZSBjaGFubmVsIGFsaXZlLlxuICovXG5pbXBvcnQgeyBTVVBFUlNFVF9QTFVHSU5fSUQsIFNVUEVSU0VUX1BMVUdJTl9WRVJTSU9OIH0gZnJvbSBcIi4vbWFuaWZlc3QuanNcIjtcbmNvbnN0IEFQUExZX1BBVENIX1BZID0gYCMhL3Vzci9iaW4vZW52IHB5dGhvbjNcblxuZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9uc1xuXG5pbXBvcnQgYXJncGFyc2VcbmltcG9ydCByZVxuaW1wb3J0IHN5c1xuZnJvbSBwYXRobGliIGltcG9ydCBQYXRoXG5cblxuRlJPTlRFTkRfRklMRSA9IFBhdGgoXCJzdXBlcnNldC1mcm9udGVuZC9zcmMvZW1iZWRkZWQvaW5kZXgudHN4XCIpXG5TREtfRklMRSA9IFBhdGgoXCJzdXBlcnNldC1lbWJlZGRlZC1zZGsvc3JjL2luZGV4LnRzXCIpXG5cblxuY2xhc3MgUGF0Y2hFcnJvcihSdW50aW1lRXJyb3IpOlxuICAgIHBhc3NcblxuXG5kZWYgcmVwbGFjZV9vbmNlKFxuICAgIGNvbnRlbnQ6IHN0cixcbiAgICBvbGQ6IHN0cixcbiAgICBuZXc6IHN0cixcbiAgICBkZXNjcmlwdGlvbjogc3RyLFxuKSAtPiBzdHI6XG4gICAgY291bnQgPSBjb250ZW50LmNvdW50KG9sZClcblxuICAgIGlmIGNvdW50ICE9IDE6XG4gICAgICAgIHJhaXNlIFBhdGNoRXJyb3IoXG4gICAgICAgICAgICBmXCJ7ZGVzY3JpcHRpb259OiBleHBlY3RlZCBleGFjdGx5IG9uZSBvY2N1cnJlbmNlLCBmb3VuZCB7Y291bnR9XCJcbiAgICAgICAgKVxuXG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShvbGQsIG5ldywgMSlcblxuXG5kZWYgcmVwbGFjZV9yZWdleF9vbmNlKFxuICAgIGNvbnRlbnQ6IHN0cixcbiAgICBwYXR0ZXJuOiByZS5QYXR0ZXJuW3N0cl0sXG4gICAgcmVwbGFjZW1lbnQ6IHN0cixcbiAgICBkZXNjcmlwdGlvbjogc3RyLFxuKSAtPiBzdHI6XG4gICAgdXBkYXRlZCwgY291bnQgPSBwYXR0ZXJuLnN1Ym4ocmVwbGFjZW1lbnQsIGNvbnRlbnQsIGNvdW50PTEpXG5cbiAgICBpZiBjb3VudCAhPSAxOlxuICAgICAgICByYWlzZSBQYXRjaEVycm9yKFxuICAgICAgICAgICAgZlwie2Rlc2NyaXB0aW9ufTogZXhwZWN0ZWQgZXhhY3RseSBvbmUgbWF0Y2gsIGZvdW5kIHtjb3VudH1cIlxuICAgICAgICApXG5cbiAgICByZXR1cm4gdXBkYXRlZFxuXG5cbmRlZiBwYXRjaF9yZWFjdF9pbXBvcnQoY29udGVudDogc3RyKSAtPiBzdHI6XG4gICAgcmVhY3RfaW1wb3J0X3BhdHRlcm4gPSByZS5jb21waWxlKFxuICAgICAgICByXCJpbXBvcnRcXFxccypcXFxce1xcXFxzKihbXn1dKylcXFxccypcXFxcfVxcXFxzKmZyb21cXFxccyoncmVhY3QnO1wiXG4gICAgKVxuXG4gICAgbWF0Y2ggPSByZWFjdF9pbXBvcnRfcGF0dGVybi5zZWFyY2goY29udGVudClcblxuICAgIGlmIG5vdCBtYXRjaDpcbiAgICAgICAgcmFpc2UgUGF0Y2hFcnJvcihcIkNvdWxkIG5vdCBsb2NhdGUgdGhlIG5hbWVkIFJlYWN0IGltcG9ydFwiKVxuXG4gICAgaW1wb3J0cyA9IFtcbiAgICAgICAgdmFsdWUuc3RyaXAoKVxuICAgICAgICBmb3IgdmFsdWUgaW4gbWF0Y2guZ3JvdXAoMSkucmVwbGFjZShcIlxcXFxuXCIsIFwiIFwiKS5zcGxpdChcIixcIilcbiAgICAgICAgaWYgdmFsdWUuc3RyaXAoKVxuICAgIF1cblxuICAgIHJlcXVpcmVkX2ltcG9ydHMgPSBbXCJsYXp5XCIsIFwiU3VzcGVuc2VcIiwgXCJ1c2VFZmZlY3RcIiwgXCJ1c2VTdGF0ZVwiXVxuXG4gICAgZm9yIHJlcXVpcmVkX2ltcG9ydCBpbiByZXF1aXJlZF9pbXBvcnRzOlxuICAgICAgICBpZiByZXF1aXJlZF9pbXBvcnQgbm90IGluIGltcG9ydHM6XG4gICAgICAgICAgICBpbXBvcnRzLmFwcGVuZChyZXF1aXJlZF9pbXBvcnQpXG5cbiAgICByZXBsYWNlbWVudCA9IChcbiAgICAgICAgXCJpbXBvcnQge1xcXFxuICBcIlxuICAgICAgICArIFwiLFxcXFxuICBcIi5qb2luKGltcG9ydHMpXG4gICAgICAgICsgXCIsXFxcXG59IGZyb20gJ3JlYWN0JztcIlxuICAgIClcblxuICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRbOiBtYXRjaC5zdGFydCgpXVxuICAgICAgICArIHJlcGxhY2VtZW50XG4gICAgICAgICsgY29udGVudFttYXRjaC5lbmQoKSA6XVxuICAgIClcblxuXG5kZWYgbG9jYXRlX2VtYmVkZGVkX2NvbXBvbmVudChcbiAgICBjb250ZW50OiBzdHIsXG4pIC0+IHR1cGxlW3JlLk1hdGNoW3N0cl0sIHN0cl06XG4gICAgbmFtZXMgPSBbXG4gICAgICAgIFwiRW1iZWRkZWRMYXp5RGFzaGJvYXJkUGFnZVwiLFxuICAgICAgICBcIkVtYmVkZWRMYXp5RGFzaGJvYXJkUGFnZVwiLFxuICAgIF1cblxuICAgIGZvciBuYW1lIGluIG5hbWVzOlxuICAgICAgICBwYXR0ZXJuID0gcmUuY29tcGlsZShcbiAgICAgICAgICAgIHJmXCJjb25zdCB7bmFtZX0gPSBcXFxcKFxcXFwpID0+IFxcXFx7ey4qP1xcXFxuXFxcXH19O1xcXFxuXCJcbiAgICAgICAgICAgIHJmXCIoPz1jb25zdCBFbWJlZGRlZFJvdXRlKVwiLFxuICAgICAgICAgICAgcmUuRE9UQUxMLFxuICAgICAgICApXG5cbiAgICAgICAgbWF0Y2ggPSBwYXR0ZXJuLnNlYXJjaChjb250ZW50KVxuXG4gICAgICAgIGlmIG1hdGNoOlxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoLCBuYW1lXG5cbiAgICByYWlzZSBQYXRjaEVycm9yKFxuICAgICAgICBcIkNvdWxkIG5vdCBmaW5kIEVtYmVkZGVkTGF6eURhc2hib2FyZFBhZ2UgYmVmb3JlIEVtYmVkZGVkUm91dGVcIlxuICAgIClcblxuXG5kZWYgcGF0Y2hfZnJvbnRlbmQoZnJvbnRlbmRfcGF0aDogUGF0aCkgLT4gTm9uZTpcbiAgICBjb250ZW50ID0gZnJvbnRlbmRfcGF0aC5yZWFkX3RleHQoZW5jb2Rpbmc9XCJ1dGYtOFwiKVxuXG4gICAgaWYgXCJTVVBFUlNFVF9TV0lUQ0hBQkxFX0VNQkVEX1BBVENIXCIgaW4gY29udGVudDpcbiAgICAgICAgcHJpbnQoZlwiQWxyZWFkeSBwYXRjaGVkOiB7ZnJvbnRlbmRfcGF0aH1cIilcbiAgICAgICAgcmV0dXJuXG5cbiAgICBjb250ZW50ID0gcGF0Y2hfcmVhY3RfaW1wb3J0KGNvbnRlbnQpXG5cbiAgICBjb21wb25lbnRfbWF0Y2gsIGNvbXBvbmVudF9uYW1lID0gbG9jYXRlX2VtYmVkZGVkX2NvbXBvbmVudChcbiAgICAgICAgY29udGVudFxuICAgIClcblxuICAgIHJlcGxhY2VtZW50X2NvbXBvbmVudCA9IFxcYC8vIFNVUEVSU0VUX1NXSVRDSEFCTEVfRU1CRURfUEFUQ0hcbi8vXG4vLyBBbGxvd3MgdGhlIGV4aXN0aW5nIGVtYmVkZGVkIFN1cGVyc2V0IGRvY3VtZW50IHRvIHJlcGxhY2UgRGFzaGJvYXJkUGFnZVxuLy8gd2l0aG91dCBuYXZpZ2F0aW5nIG9yIHJlY3JlYXRpbmcgdGhlIGlmcmFtZS5cbi8vXG4vLyBTZWN1cml0eTpcbi8vIC0gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCBvbmx5IHRocm91Z2ggU3VwZXJzZXQncyBleGlzdGluZyBTd2l0Y2hib2FyZFxuLy8gICBNZXNzYWdlQ2hhbm5lbC5cbi8vIC0gVGhlIGhvc3QgYXBwbGljYXRpb24gbXVzdCBvYnRhaW4gYSBndWVzdCB0b2tlbiBmb3IgdGhlIHRhcmdldCBkYXNoYm9hcmQuXG4vLyAtIFN1cGVyc2V0J3Mgbm9ybWFsIEFsbG93ZWQgRG9tYWlucyB2YWxpZGF0aW9uIHJlbWFpbnMgaW4gZWZmZWN0LlxuXG5pbnRlcmZhY2UgU3dpdGNoRGFzaGJvYXJkUGF5bG9hZCB7XG4gIGRhc2hib2FyZElkOiBzdHJpbmc7XG4gIGd1ZXN0VG9rZW46IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFN3aXRjaERhc2hib2FyZFJlc3VsdCB7XG4gIGRhc2hib2FyZElkOiBzdHJpbmc7XG4gIGFjY2VwdGVkOiB0cnVlO1xufVxuXG50eXBlIERhc2hib2FyZFN3aXRjaEhhbmRsZXIgPSAoXG4gIHBheWxvYWQ6IFN3aXRjaERhc2hib2FyZFBheWxvYWQsXG4pID0+IFByb21pc2U8U3dpdGNoRGFzaGJvYXJkUmVzdWx0PjtcblxubGV0IGRhc2hib2FyZFN3aXRjaEhhbmRsZXI6IERhc2hib2FyZFN3aXRjaEhhbmRsZXIgfCB1bmRlZmluZWQ7XG5cbmNvbnN0IFxcJHtjb21wb25lbnRfbmFtZX0gPSAoKSA9PiB7XG4gIGNvbnN0IHVpQ29uZmlnID0gdXNlVWlDb25maWcoKTtcblxuICBjb25zdCBbZGFzaGJvYXJkSWQsIHNldERhc2hib2FyZElkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KFxuICAgIGJvb3RzdHJhcERhdGEuZW1iZWRkZWQhLmRhc2hib2FyZF9pZCxcbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGRhc2hib2FyZFN3aXRjaEhhbmRsZXIgPSBhc3luYyAoe1xuICAgICAgZGFzaGJvYXJkSWQ6IHJlcXVlc3RlZERhc2hib2FyZElkLFxuICAgICAgZ3Vlc3RUb2tlbixcbiAgICB9OiBTd2l0Y2hEYXNoYm9hcmRQYXlsb2FkKSA9PiB7XG4gICAgICBjb25zdCBuZXh0RGFzaGJvYXJkSWQgPSByZXF1ZXN0ZWREYXNoYm9hcmRJZC50cmltKCk7XG5cbiAgICAgIGlmICghbmV4dERhc2hib2FyZElkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnZGFzaGJvYXJkSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBndWVzdFRva2VuICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICBndWVzdFRva2VuLnRyaW0oKS5sZW5ndGggPT09IDBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2d1ZXN0VG9rZW4gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBzZXREYXNoYm9hcmRJZChudWxsKTtcblxuICAgICAgZGlzcGxheWVkVW5hdXRob3JpemVkVG9hc3QgPSBmYWxzZTtcblxuICAgICAgc2V0dXBHdWVzdENsaWVudChndWVzdFRva2VuKTtcblxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXREYXNoYm9hcmRJZChuZXh0RGFzaGJvYXJkSWQpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXNoYm9hcmRJZDogbmV4dERhc2hib2FyZElkLFxuICAgICAgICBhY2NlcHRlZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkYXNoYm9hcmRTd2l0Y2hIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghdWlDb25maWc/LmVtaXREYXRhTWFza3MpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgbGV0IHByZXZpb3VzRGF0YU1hc2sgPSBzdG9yZS5nZXRTdGF0ZSgpLmRhdGFNYXNrO1xuXG4gICAgcmV0dXJuIHN0b3JlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50RGF0YU1hc2sgPSBzdG9yZS5nZXRTdGF0ZSgpLmRhdGFNYXNrO1xuXG4gICAgICBpZiAocHJldmlvdXNEYXRhTWFzayAhPT0gY3VycmVudERhdGFNYXNrKSB7XG4gICAgICAgIFN3aXRjaGJvYXJkLmVtaXQoJ29ic2VydmVEYXRhTWFzaycsIHtcbiAgICAgICAgICAuLi5jdXJyZW50RGF0YU1hc2ssXG4gICAgICAgICAgLi4uZ2V0RGF0YU1hc2tDaGFuZ2VUcmlnZ2VyKFxuICAgICAgICAgICAgY3VycmVudERhdGFNYXNrLFxuICAgICAgICAgICAgcHJldmlvdXNEYXRhTWFzayxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcblxuICAgICAgICBwcmV2aW91c0RhdGFNYXNrID0gY3VycmVudERhdGFNYXNrO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbdWlDb25maWc/LmVtaXREYXRhTWFza3NdKTtcblxuICBpZiAoIWRhc2hib2FyZElkKSB7XG4gICAgcmV0dXJuIDxMb2FkaW5nIC8+O1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8TGF6eURhc2hib2FyZFBhZ2VcbiAgICAgIGtleT17ZGFzaGJvYXJkSWR9XG4gICAgICBpZE9yU2x1Zz17ZGFzaGJvYXJkSWR9XG4gICAgLz5cbiAgKTtcbn07XG5cXGBcblxuICAgIGNvbnRlbnQgPSAoXG4gICAgICAgIGNvbnRlbnRbOiBjb21wb25lbnRfbWF0Y2guc3RhcnQoKV1cbiAgICAgICAgKyByZXBsYWNlbWVudF9jb21wb25lbnRcbiAgICAgICAgKyBjb250ZW50W2NvbXBvbmVudF9tYXRjaC5lbmQoKSA6XVxuICAgIClcblxuICAgIHN3aXRjaGJvYXJkX2FuY2hvcl9jYW5kaWRhdGVzID0gW1xuICAgICAgICAoXG4gICAgICAgICAgICBcIiAgICBTd2l0Y2hib2FyZC5kZWZpbmVNZXRob2QoXCJcbiAgICAgICAgICAgIFwiJ2dldFNjcm9sbFNpemUnLCBlbWJlZGRlZEFwaS5nZXRTY3JvbGxTaXplKTtcIlxuICAgICAgICApLFxuICAgICAgICAoXG4gICAgICAgICAgICBcIiAgICBTd2l0Y2hib2FyZC5kZWZpbmVNZXRob2QoXFxcXG5cIlxuICAgICAgICAgICAgXCIgICAgICAnZ2V0U2Nyb2xsU2l6ZScsXFxcXG5cIlxuICAgICAgICAgICAgXCIgICAgICBlbWJlZGRlZEFwaS5nZXRTY3JvbGxTaXplLFxcXFxuXCJcbiAgICAgICAgICAgIFwiICAgICk7XCJcbiAgICAgICAgKSxcbiAgICBdXG5cbiAgICBzd2l0Y2hib2FyZF9tZXRob2QgPSBcIlwiXCIgICAgU3dpdGNoYm9hcmQuZGVmaW5lTWV0aG9kKFxuICAgICAgJ3N3aXRjaERhc2hib2FyZCcsXG4gICAgICBhc3luYyAoXG4gICAgICAgIHBheWxvYWQ6IFN3aXRjaERhc2hib2FyZFBheWxvYWQsXG4gICAgICApOiBQcm9taXNlPFN3aXRjaERhc2hib2FyZFJlc3VsdD4gPT4ge1xuICAgICAgICBpZiAoIWRhc2hib2FyZFN3aXRjaEhhbmRsZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnVGhlIGVtYmVkZGVkIGRhc2hib2FyZCBpcyBub3QgcmVhZHkgdG8gc3dpdGNoJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhc2hib2FyZFN3aXRjaEhhbmRsZXIocGF5bG9hZCk7XG4gICAgICB9LFxuICAgICk7XG5cblwiXCJcIlxuXG4gICAgYW5jaG9yX2ZvdW5kID0gRmFsc2VcblxuICAgIGZvciBhbmNob3IgaW4gc3dpdGNoYm9hcmRfYW5jaG9yX2NhbmRpZGF0ZXM6XG4gICAgICAgIGlmIGNvbnRlbnQuY291bnQoYW5jaG9yKSA9PSAxOlxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICAgICAgc3dpdGNoYm9hcmRfbWV0aG9kICsgYW5jaG9yLFxuICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBhbmNob3JfZm91bmQgPSBUcnVlXG4gICAgICAgICAgICBicmVha1xuXG4gICAgaWYgbm90IGFuY2hvcl9mb3VuZDpcbiAgICAgICAgcmFpc2UgUGF0Y2hFcnJvcihcbiAgICAgICAgICAgIFwiQ291bGQgbm90IGxvY2F0ZSB0aGUgZ2V0U2Nyb2xsU2l6ZSBTd2l0Y2hib2FyZCBtZXRob2RcIlxuICAgICAgICApXG5cbiAgICBmcm9udGVuZF9wYXRoLndyaXRlX3RleHQoY29udGVudCwgZW5jb2Rpbmc9XCJ1dGYtOFwiKVxuICAgIHByaW50KGZcIlBhdGNoZWQ6IHtmcm9udGVuZF9wYXRofVwiKVxuXG5cbmRlZiBwYXRjaF9ndWVzdF90b2tlbl9mZXRjaF90eXBlKGNvbnRlbnQ6IHN0cikgLT4gc3RyOlxuICAgIGNhbmRpZGF0ZXMgPSBbXG4gICAgICAgIFwiZXhwb3J0IHR5cGUgR3Vlc3RUb2tlbkZldGNoRm4gPSAoKSA9PiBQcm9taXNlPHN0cmluZz47XCIsXG4gICAgICAgIChcbiAgICAgICAgICAgIFwiZXhwb3J0IHR5cGUgR3Vlc3RUb2tlbkZldGNoRm4gPSBcIlxuICAgICAgICAgICAgXCIoKSA9PiBQcm9taXNlPHN0cmluZz47XCJcbiAgICAgICAgKSxcbiAgICBdXG5cbiAgICByZXBsYWNlbWVudCA9IFwiXCJcIi8vIFNVUEVSU0VUX1NXSVRDSEFCTEVfRU1CRURfU0RLX1BBVENIXG4vL1xuLy8gZGFzaGJvYXJkSWQgaXMgdW5kZWZpbmVkIGZvciB0aGUgaW5pdGlhbCBkYXNoYm9hcmQgYm9vdHN0cmFwLlxuLy8gQWZ0ZXIgYSBzdWNjZXNzZnVsIGRhc2hib2FyZCBzd2l0Y2gsIHRva2VuIHJlZnJlc2hlcyByZWNlaXZlIHRoZSBhY3RpdmVcbi8vIGRhc2hib2FyZCBVVUlELlxuZXhwb3J0IHR5cGUgR3Vlc3RUb2tlbkZldGNoRm4gPSAoXG4gIGRhc2hib2FyZElkPzogc3RyaW5nLFxuKSA9PiBQcm9taXNlPHN0cmluZz47XCJcIlwiXG5cbiAgICBmb3IgY2FuZGlkYXRlIGluIGNhbmRpZGF0ZXM6XG4gICAgICAgIGlmIGNvbnRlbnQuY291bnQoY2FuZGlkYXRlKSA9PSAxOlxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQsXG4gICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIClcblxuICAgIHJhaXNlIFBhdGNoRXJyb3IoXCJDb3VsZCBub3QgbG9jYXRlIEd1ZXN0VG9rZW5GZXRjaEZuXCIpXG5cblxuZGVmIHBhdGNoX2VtYmVkZGVkX2Rhc2hib2FyZF90eXBlKGNvbnRlbnQ6IHN0cikgLT4gc3RyOlxuICAgIHR5cGVfcGF0dGVybiA9IHJlLmNvbXBpbGUoXG4gICAgICAgIHJcIihleHBvcnRcXFxccysoPzppbnRlcmZhY2V8dHlwZSlcXFxccytFbWJlZGRlZERhc2hib2FyZFwiXG4gICAgICAgIHJcIi4qP1xcXFx7KSguKj8pKFxcXFxuXFxcXH07KVwiLFxuICAgICAgICByZS5ET1RBTEwsXG4gICAgKVxuXG4gICAgbWF0Y2ggPSB0eXBlX3BhdHRlcm4uc2VhcmNoKGNvbnRlbnQpXG5cbiAgICBpZiBub3QgbWF0Y2g6XG4gICAgICAgIHJhaXNlIFBhdGNoRXJyb3IoXG4gICAgICAgICAgICBcIkNvdWxkIG5vdCBsb2NhdGUgdGhlIEVtYmVkZGVkRGFzaGJvYXJkIHB1YmxpYyB0eXBlXCJcbiAgICAgICAgKVxuXG4gICAgYm9keSA9IG1hdGNoLmdyb3VwKDIpXG5cbiAgICBpZiBcInN3aXRjaERhc2hib2FyZDpcIiBpbiBib2R5OlxuICAgICAgICByZXR1cm4gY29udGVudFxuXG4gICAgbWV0aG9kID0gXCJcIlwiXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBEYXNoYm9hcmRQYWdlIGluIHRoZSBleGlzdGluZyBpZnJhbWUgZG9jdW1lbnQuXG4gICAqXG4gICAqIFRoZSB2YWx1ZSBtdXN0IGJlIHRoZSB0YXJnZXQgZGFzaGJvYXJkIFVVSUQvaWQgYWNjZXB0ZWQgYnlcbiAgICogRGFzaGJvYXJkUGFnZSwgbm90IHRoZSBlbWJlZGRlZC1jb25maWd1cmF0aW9uIFVVSUQgdXNlZCBpbiB0aGVcbiAgICogaW5pdGlhbCAvZW1iZWRkZWQvOnV1aWQgVVJMLlxuICAgKi9cbiAgc3dpdGNoRGFzaGJvYXJkOiAoXG4gICAgZGFzaGJvYXJkSWQ6IHN0cmluZyxcbiAgKSA9PiBQcm9taXNlPHtcbiAgICBkYXNoYm9hcmRJZDogc3RyaW5nO1xuICAgIGFjY2VwdGVkOiB0cnVlO1xuICB9PjtcblwiXCJcIlxuXG4gICAgdXBkYXRlZF90eXBlID0gKFxuICAgICAgICBtYXRjaC5ncm91cCgxKVxuICAgICAgICArIGJvZHkucnN0cmlwKClcbiAgICAgICAgKyBcIlxcXFxuXCJcbiAgICAgICAgKyBtZXRob2QucnN0cmlwKClcbiAgICAgICAgKyBtYXRjaC5ncm91cCgzKVxuICAgIClcblxuICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRbOiBtYXRjaC5zdGFydCgpXVxuICAgICAgICArIHVwZGF0ZWRfdHlwZVxuICAgICAgICArIGNvbnRlbnRbbWF0Y2guZW5kKCkgOl1cbiAgICApXG5cblxuZGVmIHBhdGNoX2luaXRpYWxfZ3Vlc3RfdG9rZW5fZmV0Y2goY29udGVudDogc3RyKSAtPiBzdHI6XG4gICAgY2FuZGlkYXRlcyA9IFtcbiAgICAgICAgXCJmZXRjaEd1ZXN0VG9rZW4oKSxcIixcbiAgICAgICAgXCJhd2FpdCBmZXRjaEd1ZXN0VG9rZW4oKSxcIixcbiAgICBdXG5cbiAgICBmb3IgY2FuZGlkYXRlIGluIGNhbmRpZGF0ZXM6XG4gICAgICAgIGlmIGNvbnRlbnQuY291bnQoY2FuZGlkYXRlKSA+PSAxOlxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgIFwiZmV0Y2hHdWVzdFRva2VuKClcIixcbiAgICAgICAgICAgICAgICAgICAgXCJmZXRjaEd1ZXN0VG9rZW4odW5kZWZpbmVkKVwiLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIClcblxuICAgIHJhaXNlIFBhdGNoRXJyb3IoXG4gICAgICAgIFwiQ291bGQgbm90IGxvY2F0ZSB0aGUgaW5pdGlhbCBmZXRjaEd1ZXN0VG9rZW4gY2FsbFwiXG4gICAgKVxuXG5cbmRlZiBwYXRjaF9ndWVzdF90b2tlbl9yZWZyZXNoKGNvbnRlbnQ6IHN0cikgLT4gc3RyOlxuICAgIHBhdHRlcm5zID0gW1xuICAgICAgICByZS5jb21waWxlKFxuICAgICAgICAgICAgclwiYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEd1ZXN0VG9rZW5cXFxcKFxcXFwpIFxcXFx7XFxcXHMqXCJcbiAgICAgICAgICAgIHJcImNvbnN0IG5ld0d1ZXN0VG9rZW4gPSBhd2FpdCBmZXRjaEd1ZXN0VG9rZW5cXFxcKFxcXFwpO1xcXFxzKlwiXG4gICAgICAgICAgICByXCJvdXJQb3J0XFxcXC5lbWl0XFxcXChcIlxuICAgICAgICAgICAgclwiJ2d1ZXN0VG9rZW4nLFxcXFxzKlxcXFx7XFxcXHMqZ3Vlc3RUb2tlbjpcXFxccypuZXdHdWVzdFRva2VuXFxcXHMqXFxcXH1cIlxuICAgICAgICAgICAgclwiXFxcXCk7XFxcXHMqXCJcbiAgICAgICAgICAgIHJcInNldFRpbWVvdXRcXFxcKFwiXG4gICAgICAgICAgICByXCJyZWZyZXNoR3Vlc3RUb2tlbixcXFxccypcIlxuICAgICAgICAgICAgclwiZ2V0R3Vlc3RUb2tlblJlZnJlc2hUaW1pbmdcXFxcKG5ld0d1ZXN0VG9rZW5cXFxcKVwiXG4gICAgICAgICAgICByXCJcXFxcKTtcXFxccypcIlxuICAgICAgICAgICAgclwiXFxcXH1cIixcbiAgICAgICAgICAgIHJlLkRPVEFMTCxcbiAgICAgICAgKSxcbiAgICAgICAgcmUuY29tcGlsZShcbiAgICAgICAgICAgIHJcImNvbnN0IHJlZnJlc2hHdWVzdFRva2VuID0gYXN5bmMgXFxcXChcXFxcKSA9PiBcXFxce1xcXFxzKlwiXG4gICAgICAgICAgICByXCJjb25zdCBuZXdHdWVzdFRva2VuID0gYXdhaXQgZmV0Y2hHdWVzdFRva2VuXFxcXChcXFxcKTtcXFxccypcIlxuICAgICAgICAgICAgclwib3VyUG9ydFxcXFwuZW1pdFxcXFwoXCJcbiAgICAgICAgICAgIHJcIidndWVzdFRva2VuJyxcXFxccypcXFxce1xcXFxzKmd1ZXN0VG9rZW46XFxcXHMqbmV3R3Vlc3RUb2tlblxcXFxzKlxcXFx9XCJcbiAgICAgICAgICAgIHJcIlxcXFwpO1xcXFxzKlwiXG4gICAgICAgICAgICByXCJzZXRUaW1lb3V0XFxcXChcIlxuICAgICAgICAgICAgclwicmVmcmVzaEd1ZXN0VG9rZW4sXFxcXHMqXCJcbiAgICAgICAgICAgIHJcImdldEd1ZXN0VG9rZW5SZWZyZXNoVGltaW5nXFxcXChuZXdHdWVzdFRva2VuXFxcXClcIlxuICAgICAgICAgICAgclwiXFxcXCk7XFxcXHMqXCJcbiAgICAgICAgICAgIHJcIlxcXFx9O1wiLFxuICAgICAgICAgICAgcmUuRE9UQUxMLFxuICAgICAgICApLFxuICAgIF1cblxuICAgIHJlcGxhY2VtZW50ID0gXCJcIlwibGV0IGFjdGl2ZURhc2hib2FyZElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEd1ZXN0VG9rZW4oKSB7XG4gICAgY29uc3QgbmV3R3Vlc3RUb2tlbiA9IGF3YWl0IGZldGNoR3Vlc3RUb2tlbihcbiAgICAgIGFjdGl2ZURhc2hib2FyZElkLFxuICAgICk7XG5cbiAgICBvdXJQb3J0LmVtaXQoJ2d1ZXN0VG9rZW4nLCB7XG4gICAgICBndWVzdFRva2VuOiBuZXdHdWVzdFRva2VuLFxuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChcbiAgICAgIHJlZnJlc2hHdWVzdFRva2VuLFxuICAgICAgZ2V0R3Vlc3RUb2tlblJlZnJlc2hUaW1pbmcobmV3R3Vlc3RUb2tlbiksXG4gICAgKTtcbiAgfVwiXCJcIlxuXG4gICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6XG4gICAgICAgIHVwZGF0ZWQsIGNvdW50ID0gcGF0dGVybi5zdWJuKFxuICAgICAgICAgICAgcmVwbGFjZW1lbnQsXG4gICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgY291bnQ9MSxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIGNvdW50ID09IDE6XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlZFxuXG4gICAgcmFpc2UgUGF0Y2hFcnJvcihcbiAgICAgICAgXCJDb3VsZCBub3QgbG9jYXRlIHRoZSBndWVzdC10b2tlbiByZWZyZXNoIGZ1bmN0aW9uXCJcbiAgICApXG5cblxuZGVmIHBhdGNoX3Nka19mdW5jdGlvbnMoY29udGVudDogc3RyKSAtPiBzdHI6XG4gICAgYW5jaG9yX2NhbmRpZGF0ZXMgPSBbXG4gICAgICAgIChcbiAgICAgICAgICAgIFwiICBjb25zdCBnZXRTY3JvbGxTaXplID0gKCkgPT4gXCJcbiAgICAgICAgICAgIFwib3VyUG9ydC5nZXQ8U2l6ZT4oJ2dldFNjcm9sbFNpemUnKTtcIlxuICAgICAgICApLFxuICAgICAgICAoXG4gICAgICAgICAgICBcIiAgY29uc3QgZ2V0U2Nyb2xsU2l6ZSA9ICgpID0+XFxcXG5cIlxuICAgICAgICAgICAgXCIgICAgb3VyUG9ydC5nZXQ8U2l6ZT4oJ2dldFNjcm9sbFNpemUnKTtcIlxuICAgICAgICApLFxuICAgIF1cblxuICAgIHN3aXRjaF9mdW5jdGlvbiA9IFwiXCJcIiAgY29uc3Qgc3dpdGNoRGFzaGJvYXJkID0gYXN5bmMgKFxuICAgIGRhc2hib2FyZElkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8e1xuICAgIGRhc2hib2FyZElkOiBzdHJpbmc7XG4gICAgYWNjZXB0ZWQ6IHRydWU7XG4gIH0+ID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkRGFzaGJvYXJkSWQgPSBkYXNoYm9hcmRJZC50cmltKCk7XG5cbiAgICBpZiAoIW5vcm1hbGl6ZWREYXNoYm9hcmRJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnZGFzaGJvYXJkSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBndWVzdFRva2VuID0gYXdhaXQgZmV0Y2hHdWVzdFRva2VuKFxuICAgICAgbm9ybWFsaXplZERhc2hib2FyZElkLFxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvdXJQb3J0LmdldDx7XG4gICAgICBkYXNoYm9hcmRJZDogc3RyaW5nO1xuICAgICAgYWNjZXB0ZWQ6IHRydWU7XG4gICAgfT4oJ3N3aXRjaERhc2hib2FyZCcsIHtcbiAgICAgIGRhc2hib2FyZElkOiBub3JtYWxpemVkRGFzaGJvYXJkSWQsXG4gICAgICBndWVzdFRva2VuLFxuICAgIH0pO1xuXG4gICAgYWN0aXZlRGFzaGJvYXJkSWQgPSBub3JtYWxpemVkRGFzaGJvYXJkSWQ7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG5cIlwiXCJcblxuICAgIGZvciBhbmNob3IgaW4gYW5jaG9yX2NhbmRpZGF0ZXM6XG4gICAgICAgIGlmIGNvbnRlbnQuY291bnQoYW5jaG9yKSA9PSAxOlxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICAgICAgc3dpdGNoX2Z1bmN0aW9uICsgYW5jaG9yLFxuICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICApXG5cbiAgICByYWlzZSBQYXRjaEVycm9yKFxuICAgICAgICBcIkNvdWxkIG5vdCBsb2NhdGUgdGhlIFNESyBnZXRTY3JvbGxTaXplIGZ1bmN0aW9uXCJcbiAgICApXG5cblxuZGVmIHBhdGNoX3Nka19yZXR1cm5fb2JqZWN0KGNvbnRlbnQ6IHN0cikgLT4gc3RyOlxuICAgIGNhbmRpZGF0ZXMgPSBbXG4gICAgICAgIFwiICAgIHNldFRoZW1lTW9kZSxcXFxcbiAgfTtcIixcbiAgICAgICAgXCIgICAgc2V0VGhlbWVNb2RlLFxcXFxuICAgIHVubW91bnQsXFxcXG4gIH07XCIsXG4gICAgICAgIFwiICAgIHVubW91bnQsXFxcXG4gICAgc2V0VGhlbWVNb2RlLFxcXFxuICB9O1wiLFxuICAgIF1cblxuICAgIGZvciBjYW5kaWRhdGUgaW4gY2FuZGlkYXRlczpcbiAgICAgICAgaWYgY29udGVudC5jb3VudChjYW5kaWRhdGUpID09IDE6XG4gICAgICAgICAgICBsaW5lcyA9IGNhbmRpZGF0ZS5zcGxpdGxpbmVzKClcblxuICAgICAgICAgICAgY2xvc2luZyA9IGxpbmVzLnBvcCgpXG4gICAgICAgICAgICBib2R5ID0gXCJcXFxcblwiLmpvaW4obGluZXMpXG5cbiAgICAgICAgICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlLFxuICAgICAgICAgICAgICAgIGJvZHlcbiAgICAgICAgICAgICAgICArIFwiXFxcXG5cIlxuICAgICAgICAgICAgICAgICsgXCIgICAgc3dpdGNoRGFzaGJvYXJkLFxcXFxuXCJcbiAgICAgICAgICAgICAgICArIGNsb3NpbmcsXG4gICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIClcblxuICAgIHJhaXNlIFBhdGNoRXJyb3IoXG4gICAgICAgIFwiQ291bGQgbm90IGxvY2F0ZSB0aGUgRW1iZWRkZWREYXNoYm9hcmQgcmV0dXJuIG9iamVjdFwiXG4gICAgKVxuXG5cbmRlZiBwYXRjaF9zZGsoc2RrX3BhdGg6IFBhdGgpIC0+IE5vbmU6XG4gICAgY29udGVudCA9IHNka19wYXRoLnJlYWRfdGV4dChlbmNvZGluZz1cInV0Zi04XCIpXG5cbiAgICBpZiBcIlNVUEVSU0VUX1NXSVRDSEFCTEVfRU1CRURfU0RLX1BBVENIXCIgaW4gY29udGVudDpcbiAgICAgICAgcHJpbnQoZlwiQWxyZWFkeSBwYXRjaGVkOiB7c2RrX3BhdGh9XCIpXG4gICAgICAgIHJldHVyblxuXG4gICAgY29udGVudCA9IHBhdGNoX2d1ZXN0X3Rva2VuX2ZldGNoX3R5cGUoY29udGVudClcbiAgICBjb250ZW50ID0gcGF0Y2hfZW1iZWRkZWRfZGFzaGJvYXJkX3R5cGUoY29udGVudClcbiAgICBjb250ZW50ID0gcGF0Y2hfaW5pdGlhbF9ndWVzdF90b2tlbl9mZXRjaChjb250ZW50KVxuICAgIGNvbnRlbnQgPSBwYXRjaF9ndWVzdF90b2tlbl9yZWZyZXNoKGNvbnRlbnQpXG4gICAgY29udGVudCA9IHBhdGNoX3Nka19mdW5jdGlvbnMoY29udGVudClcbiAgICBjb250ZW50ID0gcGF0Y2hfc2RrX3JldHVybl9vYmplY3QoY29udGVudClcblxuICAgIHNka19wYXRoLndyaXRlX3RleHQoY29udGVudCwgZW5jb2Rpbmc9XCJ1dGYtOFwiKVxuICAgIHByaW50KGZcIlBhdGNoZWQ6IHtzZGtfcGF0aH1cIilcblxuXG5kZWYgbWFpbigpIC0+IGludDpcbiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihcbiAgICAgICAgZGVzY3JpcHRpb249KFxuICAgICAgICAgICAgXCJBcHBseSB0aGUgc3dpdGNoYWJsZS1kYXNoYm9hcmQgcGF0Y2ggdG8gYSBcIlxuICAgICAgICAgICAgXCJTdXBlcnNldCA2LjEueCBzb3VyY2UgY2hlY2tvdXQuXCJcbiAgICAgICAgKVxuICAgIClcblxuICAgIHBhcnNlci5hZGRfYXJndW1lbnQoXG4gICAgICAgIFwic3VwZXJzZXRfcm9vdFwiLFxuICAgICAgICB0eXBlPVBhdGgsXG4gICAgICAgIGhlbHA9XCJQYXRoIHRvIHRoZSBBcGFjaGUgU3VwZXJzZXQgc291cmNlIGNoZWNrb3V0XCIsXG4gICAgKVxuXG4gICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKClcbiAgICByb290ID0gYXJncy5zdXBlcnNldF9yb290LnJlc29sdmUoKVxuXG4gICAgZnJvbnRlbmRfcGF0aCA9IHJvb3QgLyBGUk9OVEVORF9GSUxFXG4gICAgc2RrX3BhdGggPSByb290IC8gU0RLX0ZJTEVcblxuICAgIG1pc3NpbmcgPSBbXG4gICAgICAgIHBhdGhcbiAgICAgICAgZm9yIHBhdGggaW4gW2Zyb250ZW5kX3BhdGgsIHNka19wYXRoXVxuICAgICAgICBpZiBub3QgcGF0aC5leGlzdHMoKVxuICAgIF1cblxuICAgIGlmIG1pc3Npbmc6XG4gICAgICAgIHByaW50KFxuICAgICAgICAgICAgXCJUaGUgdGFyZ2V0IGRvZXMgbm90IGFwcGVhciB0byBiZSBhIGNvbXBhdGlibGUgXCJcbiAgICAgICAgICAgIFwiU3VwZXJzZXQgc291cmNlIGNoZWNrb3V0LlwiLFxuICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyLFxuICAgICAgICApXG5cbiAgICAgICAgZm9yIG1pc3NpbmdfcGF0aCBpbiBtaXNzaW5nOlxuICAgICAgICAgICAgcHJpbnQoZlwiTWlzc2luZzoge21pc3NpbmdfcGF0aH1cIiwgZmlsZT1zeXMuc3RkZXJyKVxuXG4gICAgICAgIHJldHVybiAyXG5cbiAgICB0cnk6XG4gICAgICAgIHBhdGNoX2Zyb250ZW5kKGZyb250ZW5kX3BhdGgpXG4gICAgICAgIHBhdGNoX3NkayhzZGtfcGF0aClcbiAgICBleGNlcHQgUGF0Y2hFcnJvciBhcyBlcnJvcjpcbiAgICAgICAgcHJpbnQoZlwiUGF0Y2ggZmFpbGVkOiB7ZXJyb3J9XCIsIGZpbGU9c3lzLnN0ZGVycilcbiAgICAgICAgcmV0dXJuIDFcblxuICAgIHByaW50KFwiUGF0Y2ggY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cIilcbiAgICByZXR1cm4gMFxuXG5cbmlmIF9fbmFtZV9fID09IFwiX19tYWluX19cIjpcbiAgICByYWlzZSBTeXN0ZW1FeGl0KG1haW4oKSlcbmA7XG5jb25zdCBWRVJJRllfUEFUQ0hfU0ggPSBgIyEvdXNyL2Jpbi9lbnYgYmFzaFxuXG5zZXQgLWV1byBwaXBlZmFpbFxuXG5TVVBFUlNFVF9ST09UPVxcJHsxOj9Vc2FnZTogdmVyaWZ5X3BhdGNoLnNoIC9wYXRoL3RvL3N1cGVyc2V0fVxuXG5GUk9OVEVORF9GSUxFPVwiJFNVUEVSU0VUX1JPT1Qvc3VwZXJzZXQtZnJvbnRlbmQvc3JjL2VtYmVkZGVkL2luZGV4LnRzeFwiXG5TREtfRklMRT1cIiRTVVBFUlNFVF9ST09UL3N1cGVyc2V0LWVtYmVkZGVkLXNkay9zcmMvaW5kZXgudHNcIlxuXG50ZXN0IC1mIFwiJEZST05URU5EX0ZJTEVcIlxudGVzdCAtZiBcIiRTREtfRklMRVwiXG5cbmdyZXAgLXEgXFxcXFxuICBcIlNVUEVSU0VUX1NXSVRDSEFCTEVfRU1CRURfUEFUQ0hcIiBcXFxcXG4gIFwiJEZST05URU5EX0ZJTEVcIlxuXG5ncmVwIC1xIFxcXFxcbiAgXCInc3dpdGNoRGFzaGJvYXJkJ1wiIFxcXFxcbiAgXCIkRlJPTlRFTkRfRklMRVwiXG5cbmdyZXAgLXEgXFxcXFxuICBcImRhc2hib2FyZFN3aXRjaEhhbmRsZXJcIiBcXFxcXG4gIFwiJEZST05URU5EX0ZJTEVcIlxuXG5ncmVwIC1xIFxcXFxcbiAgXCJTVVBFUlNFVF9TV0lUQ0hBQkxFX0VNQkVEX1NES19QQVRDSFwiIFxcXFxcbiAgXCIkU0RLX0ZJTEVcIlxuXG5ncmVwIC1xIFxcXFxcbiAgXCJzd2l0Y2hEYXNoYm9hcmQ6XCIgXFxcXFxuICBcIiRTREtfRklMRVwiXG5cbmdyZXAgLXEgXFxcXFxuICBcImFjdGl2ZURhc2hib2FyZElkXCIgXFxcXFxuICBcIiRTREtfRklMRVwiXG5cbmdyZXAgLXEgXFxcXFxuICBcImZldGNoR3Vlc3RUb2tlbihcIiBcXFxcXG4gIFwiJFNES19GSUxFXCJcblxuZWNobyBcIlRoZSBzd2l0Y2hhYmxlLWRhc2hib2FyZCBwYXRjaCBpcyBwcmVzZW50LlwiXG5gO1xuY29uc3QgQlVJTERfU0RLX1NIID0gYCMhL3Vzci9iaW4vZW52IGJhc2hcblxuc2V0IC1ldW8gcGlwZWZhaWxcblxuU1VQRVJTRVRfUk9PVD1cXCR7MTo/VXNhZ2U6IGJ1aWxkLXNkay5zaCAvcGF0aC90by9zdXBlcnNldH1cblxuU0RLX1JPT1Q9XCIkU1VQRVJTRVRfUk9PVC9zdXBlcnNldC1lbWJlZGRlZC1zZGtcIlxuXG5pZiBbICEgLWYgXCIkU0RLX1JPT1QvcGFja2FnZS5qc29uXCIgXTsgdGhlblxuICBlY2hvIFwiTWlzc2luZyBTREsgcGFja2FnZTogJFNES19ST09UXCIgPiYyXG4gIGV4aXQgMVxuZmlcblxuY2QgXCIkU0RLX1JPT1RcIlxuXG5ucG0gY2lcblxubnBtIHJ1biBidWlsZFxuXG5lY2hvXG5lY2hvIFwiRW1iZWRkZWQgU0RLIGJ1aWxkIGNvbXBsZXRlZC5cIlxuZWNobyBcIk91dHB1dCBkaXJlY3Rvcnk6XCJcbmZpbmQgLiBcXFxcXG4gIC1tYXhkZXB0aCAyIFxcXFxcbiAgLXR5cGUgZCBcXFxcXG4gIFxcXFwoIC1uYW1lIGRpc3QgLW8gLW5hbWUgbGliIFxcXFwpIFxcXFxcbiAgLXByaW50XG5gO1xuY29uc3QgQlVJTERfRlJPTlRFTkRfU0ggPSBgIyEvdXNyL2Jpbi9lbnYgYmFzaFxuXG5zZXQgLWV1byBwaXBlZmFpbFxuXG5TVVBFUlNFVF9ST09UPVxcJHsxOj9Vc2FnZTogYnVpbGQtc3VwZXJzZXQtZnJvbnRlbmQuc2ggL3BhdGgvdG8vc3VwZXJzZXR9XG5cbkZST05URU5EX1JPT1Q9XCIkU1VQRVJTRVRfUk9PVC9zdXBlcnNldC1mcm9udGVuZFwiXG5cbmlmIFsgISAtZiBcIiRGUk9OVEVORF9ST09UL3BhY2thZ2UuanNvblwiIF07IHRoZW5cbiAgZWNobyBcIk1pc3NpbmcgU3VwZXJzZXQgZnJvbnRlbmQ6ICRGUk9OVEVORF9ST09UXCIgPiYyXG4gIGV4aXQgMVxuZmlcblxuY2QgXCIkRlJPTlRFTkRfUk9PVFwiXG5cbm5wbSBjaVxuXG5ucG0gcnVuIGJ1aWxkXG5cbmVjaG8gXCJTdXBlcnNldCBmcm9udGVuZCBidWlsZCBjb21wbGV0ZWQuXCJcbmA7XG5jb25zdCBQQVRDSF9BTkRfQlVJTERfU0ggPSBgIyEvdXNyL2Jpbi9lbnYgYmFzaFxuXG5zZXQgLWV1byBwaXBlZmFpbFxuXG5TVVBFUlNFVF9ST09UPVxcJHsxOj9Vc2FnZTogcGF0Y2gtYW5kLWJ1aWxkLnNoIC9wYXRoL3RvL3N1cGVyc2V0fVxuXG5TQ1JJUFRfRElSPSQoXG4gIGNkIFwiJChkaXJuYW1lIFwiXFwke0JBU0hfU09VUkNFWzBdfVwiKVwiXG4gIHB3ZFxuKVxuXG5QUk9KRUNUX1JPT1Q9JChcbiAgY2QgXCIkU0NSSVBUX0RJUi8uLlwiXG4gIHB3ZFxuKVxuXG5weXRob24zIFxcXFxcbiAgXCIkUFJPSkVDVF9ST09UL3BhdGNoZXMvYXBwbHlfc3VwZXJzZXRfNl8xX3BhdGNoLnB5XCIgXFxcXFxuICBcIiRTVVBFUlNFVF9ST09UXCJcblxuXCIkUFJPSkVDVF9ST09UL3BhdGNoZXMvdmVyaWZ5X3BhdGNoLnNoXCIgXFxcXFxuICBcIiRTVVBFUlNFVF9ST09UXCJcblxuXCIkU0NSSVBUX0RJUi9idWlsZC1zZGsuc2hcIiBcXFxcXG4gIFwiJFNVUEVSU0VUX1JPT1RcIlxuXG5cIiRTQ1JJUFRfRElSL2J1aWxkLXN1cGVyc2V0LWZyb250ZW5kLnNoXCIgXFxcXFxuICBcIiRTVVBFUlNFVF9ST09UXCJcblxuZWNob1xuZWNobyBcIlBhdGNoIGFuZCBmcm9udGVuZCBidWlsZHMgY29tcGxldGVkLlwiXG5gO1xuY29uc3QgQlVJTERfRE9DS0VSX1NIID0gYCMhL3Vzci9iaW4vZW52IGJhc2hcblxuc2V0IC1ldW8gcGlwZWZhaWxcblxuU1VQRVJTRVRfUk9PVD1cXCR7MTo/VXNhZ2U6IGJ1aWxkLWRvY2tlci1pbWFnZS5zaCAvcGF0aC90by9zdXBlcnNldCBbaW1hZ2UtdGFnXX1cbklNQUdFX1RBRz1cXCR7MjotbG9jYWwvc3VwZXJzZXQtc3dpdGNoYWJsZTo2LjEuMH1cblxuU0NSSVBUX0RJUj0kKFxuICBjZCBcIiQoZGlybmFtZSBcIlxcJHtCQVNIX1NPVVJDRVswXX1cIilcIlxuICBwd2RcbilcblxuUFJPSkVDVF9ST09UPSQoXG4gIGNkIFwiJFNDUklQVF9ESVIvLi5cIlxuICBwd2RcbilcblxucHl0aG9uMyBcXFxcXG4gIFwiJFBST0pFQ1RfUk9PVC9wYXRjaGVzL2FwcGx5X3N1cGVyc2V0XzZfMV9wYXRjaC5weVwiIFxcXFxcbiAgXCIkU1VQRVJTRVRfUk9PVFwiXG5cblwiJFBST0pFQ1RfUk9PVC9wYXRjaGVzL3ZlcmlmeV9wYXRjaC5zaFwiIFxcXFxcbiAgXCIkU1VQRVJTRVRfUk9PVFwiXG5cbmNkIFwiJFNVUEVSU0VUX1JPT1RcIlxuXG5kb2NrZXIgYnVpbGQgXFxcXFxuICAtLXRhcmdldCBsZWFuIFxcXFxcbiAgLS10YWcgXCIkSU1BR0VfVEFHXCIgXFxcXFxuICAuXG5cbmVjaG8gXCJCdWlsdCBEb2NrZXIgaW1hZ2U6ICRJTUFHRV9UQUdcIlxuYDtcbmNvbnN0IFJFQURNRSA9IGAjICR7U1VQRVJTRVRfUExVR0lOX0lEfVxuXG5NdWx0aS10ZW5hbnQsIG9yZy1hZ25vc3RpYyBTdXBlcnNldCBkYXNoYm9hcmQgZW1iZWQgcGx1Z2luIChwYXRjaC1hbmQtYnVpbGQgc3RyYXRlZ3kpLlxuXG5UaGlzIGlzIG5vdCBhIGdlbmVyYXRlZCBwbHVnaW4gbGlrZSB0aGUgS2liYW5hIHZhcmlhbnQuIEluc3RlYWQsIERlY2FmIGhvbGRzXG5wYXRjaCBzY3JpcHRzIHRoYXQgbW9kaWZ5IFN1cGVyc2V0J3MgaW50ZXJuYWwgZW1iZWRkZWQgZnJvbnRlbmQgYW5kIGVtYmVkZGVkXG5TREsgc291cmNlIGZpbGVzIHRvIGFkZCBhIFxcYHN3aXRjaERhc2hib2FyZFxcYCBtZXRob2QuIFRoZSBleGlzdGluZyBpZnJhbWVcbmVsZW1lbnQsIGRvY3VtZW50LCBjb250ZW50V2luZG93LCBSZWFjdCBydW50aW1lLCBhbmQgU3dpdGNoYm9hcmQgTWVzc2FnZUNoYW5uZWxcbmFyZSBwcmVzZXJ2ZWQgYWNyb3NzIGRhc2hib2FyZCBzd2l0Y2hlcy5cblxuIyMgV2hhdCBpdCBwYXRjaGVzXG5cbi0gXFxgc3VwZXJzZXQtZnJvbnRlbmQvc3JjL2VtYmVkZGVkL2luZGV4LnRzeFxcYCDigJQgYWRkcyBcXGBzd2l0Y2hEYXNoYm9hcmRcXGAgdG8gdGhlXG4gIFN3aXRjaGJvYXJkIGNoYW5uZWw7IHJlcGxhY2VzIG9ubHkgXFxgRGFzaGJvYXJkUGFnZVxcYC5cbi0gXFxgc3VwZXJzZXQtZW1iZWRkZWQtc2RrL3NyYy9pbmRleC50c1xcYCDigJQgYWRkc1xuICBcXGBlbWJlZGRlZERhc2hib2FyZC5zd2l0Y2hEYXNoYm9hcmQoZGFzaGJvYXJkSWQpXFxgOyByZXF1ZXN0cyBhIGd1ZXN0IHRva2VuIGZvclxuICB0aGUgc2VsZWN0ZWQgZGFzaGJvYXJkOyByZWZyZXNoZXMgZnV0dXJlIGd1ZXN0IHRva2VucyBmb3IgdGhlIGFjdGl2ZSBkYXNoYm9hcmQuXG5cbiMjIEJ1aWxkXG5cblxcYFxcYFxcYGJhc2hcbiMgQXBwbHkgcGF0Y2ggKyB2ZXJpZnkgKyBidWlsZCBTREsgKyBidWlsZCBmcm9udGVuZFxuYnVpbGQvcGF0Y2gtYW5kLWJ1aWxkLnNoIC9wYXRoL3RvL3N1cGVyc2V0XG5cbiMgT3IgYnVpbGQgYSBEb2NrZXIgaW1hZ2VcbmJ1aWxkL2J1aWxkLWRvY2tlci1pbWFnZS5zaCAvcGF0aC90by9zdXBlcnNldCByZWdpc3RyeS5leGFtcGxlLmNvbS9zdXBlcnNldC1zd2l0Y2hhYmxlOjYuMS4wXG5cXGBcXGBcXGBcblxuVGhlIHBhdGNoZWQgU0RLIG11c3QgYmUgcGFja2VkIGFuZCBpbnN0YWxsZWQgaW50byB0aGUgQW5ndWxhciBhcHBsaWNhdGlvbjpcblxuXFxgXFxgXFxgYmFzaFxuY2QgL3BhdGgvdG8vc3VwZXJzZXQvc3VwZXJzZXQtZW1iZWRkZWQtc2RrXG5ucG0gY2kgJiYgbnBtIHJ1biBidWlsZCAmJiBucG0gcGFja1xuY2QgL3BhdGgvdG8vYW5ndWxhci1hcHBcbm5wbSBpbnN0YWxsIC9wYXRoL3RvL3N1cGVyc2V0L3N1cGVyc2V0LWVtYmVkZGVkLXNkay9zdXBlcnNldC11aS1lbWJlZGRlZC1zZGstKi50Z3pcblxcYFxcYFxcYFxuXG5WZXJzaW9uOiAke1NVUEVSU0VUX1BMVUdJTl9WRVJTSU9OfVxuYDtcbi8qKlxuICogUmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgcGF0Y2ggYW5kIGJ1aWxkIHNjcmlwdCBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cGVyc2V0UGF0Y2hGaWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICB7IHBhdGg6IFwicGF0Y2hlcy9hcHBseV9zdXBlcnNldF82XzFfcGF0Y2gucHlcIiwgY29udGVudDogQVBQTFlfUEFUQ0hfUFksIGV4ZWN1dGFibGU6IHRydWUgfSxcbiAgICAgICAgeyBwYXRoOiBcInBhdGNoZXMvdmVyaWZ5X3BhdGNoLnNoXCIsIGNvbnRlbnQ6IFZFUklGWV9QQVRDSF9TSCwgZXhlY3V0YWJsZTogdHJ1ZSB9LFxuICAgICAgICB7IHBhdGg6IFwiYnVpbGQvYnVpbGQtc2RrLnNoXCIsIGNvbnRlbnQ6IEJVSUxEX1NES19TSCwgZXhlY3V0YWJsZTogdHJ1ZSB9LFxuICAgICAgICB7IHBhdGg6IFwiYnVpbGQvYnVpbGQtc3VwZXJzZXQtZnJvbnRlbmQuc2hcIiwgY29udGVudDogQlVJTERfRlJPTlRFTkRfU0gsIGV4ZWN1dGFibGU6IHRydWUgfSxcbiAgICAgICAgeyBwYXRoOiBcImJ1aWxkL3BhdGNoLWFuZC1idWlsZC5zaFwiLCBjb250ZW50OiBQQVRDSF9BTkRfQlVJTERfU0gsIGV4ZWN1dGFibGU6IHRydWUgfSxcbiAgICAgICAgeyBwYXRoOiBcImJ1aWxkL2J1aWxkLWRvY2tlci1pbWFnZS5zaFwiLCBjb250ZW50OiBCVUlMRF9ET0NLRVJfU0gsIGV4ZWN1dGFibGU6IHRydWUgfSxcbiAgICAgICAgeyBwYXRoOiBcIlJFQURNRS5tZFwiLCBjb250ZW50OiBSRUFETUUgfSxcbiAgICBdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pZEdWdGNHeGhkR1Z6TG1weklpd2ljMjkxY21ObFVtOXZkQ0k2SWlJc0luTnZkWEpqWlhNaU9sc2lMaTR2TGk0dkxpNHZMaTR2YzNKakwzQnNkV2RwYm5NdmMzVndaWEp6WlhRdmRHVnRjR3hoZEdWekxuUnpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSkJRVUZCT3pzN096czdPenM3T3pzN08wZEJZVWM3UVVGRFNDeFBRVUZQTEVWQlFVVXNhMEpCUVd0Q0xFVkJRVVVzZFVKQlFYVkNMRVZCUVVVc2MwSkJRVzFDTzBGQlYzcEZMRTFCUVUwc1kwRkJZeXhIUVVGSE96czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096dERRWE50UW5SQ0xFTkJRVU03UVVGRlJpeE5RVUZOTEdWQlFXVXNSMEZCUnpzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdRMEY1UTNaQ0xFTkJRVU03UVVGRlJpeE5RVUZOTEZsQlFWa3NSMEZCUnpzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3TzBOQk1rSndRaXhEUVVGRE8wRkJSVVlzVFVGQlRTeHBRa0ZCYVVJc1IwRkJSenM3T3pzN096czdPenM3T3pzN096czdPenM3UTBGdlFucENMRU5CUVVNN1FVRkZSaXhOUVVGTkxHdENRVUZyUWl4SFFVRkhPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3TzBOQkswSXhRaXhEUVVGRE8wRkJSVVlzVFVGQlRTeGxRVUZsTEVkQlFVYzdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3TzBOQlowTjJRaXhEUVVGRE8wRkJSVVlzVFVGQlRTeE5RVUZOTEVkQlFVY3NTMEZCU3l4clFrRkJhMEk3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3VjBGeFF6TkNMSFZDUVVGMVFqdERRVU5xUXl4RFFVRkRPMEZCUlVZN08wZEJSVWM3UVVGRFNDeE5RVUZOTEZWQlFWVXNhMEpCUVd0Q08wbEJRMmhETEU5QlFVODdVVUZEVEN4RlFVRkZMRWxCUVVrc1JVRkJSU3h4UTBGQmNVTXNSVUZCUlN4UFFVRlBMRVZCUVVVc1kwRkJZeXhGUVVGRkxGVkJRVlVzUlVGQlJTeEpRVUZKTEVWQlFVVTdVVUZETVVZc1JVRkJSU3hKUVVGSkxFVkJRVVVzZVVKQlFYbENMRVZCUVVVc1QwRkJUeXhGUVVGRkxHVkJRV1VzUlVGQlJTeFZRVUZWTEVWQlFVVXNTVUZCU1N4RlFVRkZPMUZCUXk5RkxFVkJRVVVzU1VGQlNTeEZRVUZGTEc5Q1FVRnZRaXhGUVVGRkxFOUJRVThzUlVGQlJTeFpRVUZaTEVWQlFVVXNWVUZCVlN4RlFVRkZMRWxCUVVrc1JVRkJSVHRSUVVOMlJTeEZRVUZGTEVsQlFVa3NSVUZCUlN4clEwRkJhME1zUlVGQlJTeFBRVUZQTEVWQlFVVXNhVUpCUVdsQ0xFVkJRVVVzVlVGQlZTeEZRVUZGTEVsQlFVa3NSVUZCUlR0UlFVTXhSaXhGUVVGRkxFbEJRVWtzUlVGQlJTd3dRa0ZCTUVJc1JVRkJSU3hQUVVGUExFVkJRVVVzYTBKQlFXdENMRVZCUVVVc1ZVRkJWU3hGUVVGRkxFbEJRVWtzUlVGQlJUdFJRVU51Uml4RlFVRkZMRWxCUVVrc1JVRkJSU3cyUWtGQk5rSXNSVUZCUlN4UFFVRlBMRVZCUVVVc1pVRkJaU3hGUVVGRkxGVkJRVlVzUlVGQlJTeEpRVUZKTEVWQlFVVTdVVUZEYmtZc1JVRkJSU3hKUVVGSkxFVkJRVVVzVjBGQlZ5eEZRVUZGTEU5QlFVOHNSVUZCUlN4TlFVRk5MRVZCUVVVN1MwRkRka01zUTBGQlF6dEJRVU5LTEVOQlFVTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUl2S2lwY2JpQXFJRUJ0YjJSMWJHVWdhVzUwWldkeVlYUnBiMjV6TDNCc2RXZHBibk12YzNWd1pYSnpaWFF2ZEdWdGNHeGhkR1Z6WEc0Z0tpQkFjM1Z0YldGeWVTQlFZWFJqYUNCaGJtUWdZblZwYkdRZ2MyTnlhWEIwSUhSbGJYQnNZWFJsY3lCbWIzSWdkR2hsSUZOMWNHVnljMlYwSUdWdFltVmtJSEJzZFdkcGJpNWNiaUFxSUVCa1pYTmpjbWx3ZEdsdmJpQkliMnhrY3lCaGJHd2djR0YwWTJnZ2MyTnlhWEIwY3lBb1VIbDBhRzl1SUNzZ1FtRnphQ2tnWVc1a0lHSjFhV3hrSUhOamNtbHdkSE1nWVhOY2JpQXFJSE4wY21sdVp5QjBaVzF3YkdGMFpYTXVJRlJvWlhObElHRnlaU0J0WVhSbGNtbGhiR2w2WldRZ2IyNTBieUJrYVhOcklHSjVJSFJvWlNCcGJuTjBZV3hzWlhJdUlFUmxZMkZtWEc0Z0tpQmtiMlZ6SUc1dmRDQm5aVzVsY21GMFpTQnVaWGNnVTNWd1pYSnpaWFFnYzI5MWNtTmxJT0tBbENCcGRDQndZWFJqYUdWeklHVjRhWE4wYVc1bklHbHVkR1Z5Ym1Gc0lHWnBiR1Z6WEc0Z0tpQW9ZSE4xY0dWeWMyVjBMV1p5YjI1MFpXNWtMM055WXk5bGJXSmxaR1JsWkM5cGJtUmxlQzUwYzNoZ0lHRnVaRnh1SUNvZ1lITjFjR1Z5YzJWMExXVnRZbVZrWkdWa0xYTmtheTl6Y21NdmFXNWtaWGd1ZEhOZ0tTQm1iMnhzYjNkcGJtY2dkR2hsSUhKbFptVnlaVzVqWlNCcGJYQnNaVzFsYm5SaGRHbHZibHh1SUNvZ1puSnZiU0JFUlVOQlJpMDBNQ0RDcHprdVhHNGdLbHh1SUNvZ1ZHaGxJSEJoZEdOb0lHRmtaSE1nWVNCZ2MzZHBkR05vUkdGemFHSnZZWEprWUNCdFpYUm9iMlFnZEc4Z1UzVndaWEp6WlhRbmN5QmxlR2x6ZEdsdVp5QlRkMmwwWTJoaWIyRnlaRnh1SUNvZ1kyaGhibTVsYkN3Z2NtVndiR0ZqYVc1bklHOXViSGtnWUVSaGMyaGliMkZ5WkZCaFoyVmdJSGRvYVd4bElHdGxaWEJwYm1jZ2RHaGxJR2xtY21GdFpTQmxiR1Z0Wlc1MExGeHVJQ29nWkc5amRXMWxiblFzSUdOdmJuUmxiblJYYVc1a2IzY3NJRkpsWVdOMElISjFiblJwYldVc0lHRnVaQ0J0WlhOellXZGxJR05vWVc1dVpXd2dZV3hwZG1VdVhHNGdLaTljYm1sdGNHOXlkQ0I3SUZOVlVFVlNVMFZVWDFCTVZVZEpUbDlKUkN3Z1UxVlFSVkpUUlZSZlVFeFZSMGxPWDFaRlVsTkpUMDRnZlNCbWNtOXRJRndpTGk5dFlXNXBabVZ6ZEZ3aU8xeHVYRzVsZUhCdmNuUWdhVzUwWlhKbVlXTmxJRk4xY0dWeWMyVjBVR0YwWTJoR2FXeGxJSHRjYmlBZ0x5b3FJRkpsYkdGMGFYWmxJSEJoZEdnZ2QybDBhR2x1SUhSb1pTQjBZWEpuWlhRZ1pHbHlaV04wYjNKNUxpQXFMMXh1SUNCd1lYUm9PaUJ6ZEhKcGJtYzdYRzRnSUM4cUtpQkdhV3hsSUdOdmJuUmxiblJ6TGlBcUwxeHVJQ0JqYjI1MFpXNTBPaUJ6ZEhKcGJtYzdYRzRnSUM4cUtpQlhhR1YwYUdWeUlIUnZJRzFoY21zZ2RHaGxJR1pwYkdVZ1pYaGxZM1YwWVdKc1pTQnZiaUJRVDFOSldDNGdLaTljYmlBZ1pYaGxZM1YwWVdKc1pUODZJR0p2YjJ4bFlXNDdYRzU5WEc1Y2JtTnZibk4wSUVGUVVFeFpYMUJCVkVOSVgxQlpJRDBnWUNNaEwzVnpjaTlpYVc0dlpXNTJJSEI1ZEdodmJqTmNibHh1Wm5KdmJTQmZYMloxZEhWeVpWOWZJR2x0Y0c5eWRDQmhibTV2ZEdGMGFXOXVjMXh1WEc1cGJYQnZjblFnWVhKbmNHRnljMlZjYm1sdGNHOXlkQ0J5WlZ4dWFXMXdiM0owSUhONWMxeHVabkp2YlNCd1lYUm9iR2xpSUdsdGNHOXlkQ0JRWVhSb1hHNWNibHh1UmxKUFRsUkZUa1JmUmtsTVJTQTlJRkJoZEdnb1hDSnpkWEJsY25ObGRDMW1jbTl1ZEdWdVpDOXpjbU12WlcxaVpXUmtaV1F2YVc1a1pYZ3VkSE40WENJcFhHNVRSRXRmUmtsTVJTQTlJRkJoZEdnb1hDSnpkWEJsY25ObGRDMWxiV0psWkdSbFpDMXpaR3N2YzNKakwybHVaR1Y0TG5SelhDSXBYRzVjYmx4dVkyeGhjM01nVUdGMFkyaEZjbkp2Y2loU2RXNTBhVzFsUlhKeWIzSXBPbHh1SUNBZ0lIQmhjM05jYmx4dVhHNWtaV1lnY21Wd2JHRmpaVjl2Ym1ObEtGeHVJQ0FnSUdOdmJuUmxiblE2SUhOMGNpeGNiaUFnSUNCdmJHUTZJSE4wY2l4Y2JpQWdJQ0J1WlhjNklITjBjaXhjYmlBZ0lDQmtaWE5qY21sd2RHbHZiam9nYzNSeUxGeHVLU0F0UGlCemRISTZYRzRnSUNBZ1kyOTFiblFnUFNCamIyNTBaVzUwTG1OdmRXNTBLRzlzWkNsY2JseHVJQ0FnSUdsbUlHTnZkVzUwSUNFOUlERTZYRzRnSUNBZ0lDQWdJSEpoYVhObElGQmhkR05vUlhKeWIzSW9YRzRnSUNBZ0lDQWdJQ0FnSUNCbVhDSjdaR1Z6WTNKcGNIUnBiMjU5T2lCbGVIQmxZM1JsWkNCbGVHRmpkR3g1SUc5dVpTQnZZMk4xY25KbGJtTmxMQ0JtYjNWdVpDQjdZMjkxYm5SOVhDSmNiaUFnSUNBZ0lDQWdLVnh1WEc0Z0lDQWdjbVYwZFhKdUlHTnZiblJsYm5RdWNtVndiR0ZqWlNodmJHUXNJRzVsZHl3Z01TbGNibHh1WEc1a1pXWWdjbVZ3YkdGalpWOXlaV2RsZUY5dmJtTmxLRnh1SUNBZ0lHTnZiblJsYm5RNklITjBjaXhjYmlBZ0lDQndZWFIwWlhKdU9pQnlaUzVRWVhSMFpYSnVXM04wY2wwc1hHNGdJQ0FnY21Wd2JHRmpaVzFsYm5RNklITjBjaXhjYmlBZ0lDQmtaWE5qY21sd2RHbHZiam9nYzNSeUxGeHVLU0F0UGlCemRISTZYRzRnSUNBZ2RYQmtZWFJsWkN3Z1kyOTFiblFnUFNCd1lYUjBaWEp1TG5OMVltNG9jbVZ3YkdGalpXMWxiblFzSUdOdmJuUmxiblFzSUdOdmRXNTBQVEVwWEc1Y2JpQWdJQ0JwWmlCamIzVnVkQ0FoUFNBeE9seHVJQ0FnSUNBZ0lDQnlZV2x6WlNCUVlYUmphRVZ5Y205eUtGeHVJQ0FnSUNBZ0lDQWdJQ0FnWmx3aWUyUmxjMk55YVhCMGFXOXVmVG9nWlhod1pXTjBaV1FnWlhoaFkzUnNlU0J2Ym1VZ2JXRjBZMmdzSUdadmRXNWtJSHRqYjNWdWRIMWNJbHh1SUNBZ0lDQWdJQ0FwWEc1Y2JpQWdJQ0J5WlhSMWNtNGdkWEJrWVhSbFpGeHVYRzVjYm1SbFppQndZWFJqYUY5eVpXRmpkRjlwYlhCdmNuUW9ZMjl1ZEdWdWREb2djM1J5S1NBdFBpQnpkSEk2WEc0Z0lDQWdjbVZoWTNSZmFXMXdiM0owWDNCaGRIUmxjbTRnUFNCeVpTNWpiMjF3YVd4bEtGeHVJQ0FnSUNBZ0lDQnlYQ0pwYlhCdmNuUmNYRnhjY3lwY1hGeGNlMXhjWEZ4ektpaGJYbjFkS3lsY1hGeGNjeXBjWEZ4Y2ZWeGNYRnh6S21aeWIyMWNYRnhjY3lvbmNtVmhZM1FuTzF3aVhHNGdJQ0FnS1Z4dVhHNGdJQ0FnYldGMFkyZ2dQU0J5WldGamRGOXBiWEJ2Y25SZmNHRjBkR1Z5Ymk1elpXRnlZMmdvWTI5dWRHVnVkQ2xjYmx4dUlDQWdJR2xtSUc1dmRDQnRZWFJqYURwY2JpQWdJQ0FnSUNBZ2NtRnBjMlVnVUdGMFkyaEZjbkp2Y2loY0lrTnZkV3hrSUc1dmRDQnNiMk5oZEdVZ2RHaGxJRzVoYldWa0lGSmxZV04wSUdsdGNHOXlkRndpS1Z4dVhHNGdJQ0FnYVcxd2IzSjBjeUE5SUZ0Y2JpQWdJQ0FnSUNBZ2RtRnNkV1V1YzNSeWFYQW9LVnh1SUNBZ0lDQWdJQ0JtYjNJZ2RtRnNkV1VnYVc0Z2JXRjBZMmd1WjNKdmRYQW9NU2t1Y21Wd2JHRmpaU2hjSWx4Y1hGeHVYQ0lzSUZ3aUlGd2lLUzV6Y0d4cGRDaGNJaXhjSWlsY2JpQWdJQ0FnSUNBZ2FXWWdkbUZzZFdVdWMzUnlhWEFvS1Z4dUlDQWdJRjFjYmx4dUlDQWdJSEpsY1hWcGNtVmtYMmx0Y0c5eWRITWdQU0JiWENKc1lYcDVYQ0lzSUZ3aVUzVnpjR1Z1YzJWY0lpd2dYQ0oxYzJWRlptWmxZM1JjSWl3Z1hDSjFjMlZUZEdGMFpWd2lYVnh1WEc0Z0lDQWdabTl5SUhKbGNYVnBjbVZrWDJsdGNHOXlkQ0JwYmlCeVpYRjFhWEpsWkY5cGJYQnZjblJ6T2x4dUlDQWdJQ0FnSUNCcFppQnlaWEYxYVhKbFpGOXBiWEJ2Y25RZ2JtOTBJR2x1SUdsdGNHOXlkSE02WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBiWEJ2Y25SekxtRndjR1Z1WkNoeVpYRjFhWEpsWkY5cGJYQnZjblFwWEc1Y2JpQWdJQ0J5WlhCc1lXTmxiV1Z1ZENBOUlDaGNiaUFnSUNBZ0lDQWdYQ0pwYlhCdmNuUWdlMXhjWEZ4dUlDQmNJbHh1SUNBZ0lDQWdJQ0FySUZ3aUxGeGNYRnh1SUNCY0lpNXFiMmx1S0dsdGNHOXlkSE1wWEc0Z0lDQWdJQ0FnSUNzZ1hDSXNYRnhjWEc1OUlHWnliMjBnSjNKbFlXTjBKenRjSWx4dUlDQWdJQ2xjYmx4dUlDQWdJSEpsZEhWeWJpQW9YRzRnSUNBZ0lDQWdJR052Ym5SbGJuUmJPaUJ0WVhSamFDNXpkR0Z5ZENncFhWeHVJQ0FnSUNBZ0lDQXJJSEpsY0d4aFkyVnRaVzUwWEc0Z0lDQWdJQ0FnSUNzZ1kyOXVkR1Z1ZEZ0dFlYUmphQzVsYm1Rb0tTQTZYVnh1SUNBZ0lDbGNibHh1WEc1a1pXWWdiRzlqWVhSbFgyVnRZbVZrWkdWa1gyTnZiWEJ2Ym1WdWRDaGNiaUFnSUNCamIyNTBaVzUwT2lCemRISXNYRzRwSUMwK0lIUjFjR3hsVzNKbExrMWhkR05vVzNOMGNsMHNJSE4wY2wwNlhHNGdJQ0FnYm1GdFpYTWdQU0JiWEc0Z0lDQWdJQ0FnSUZ3aVJXMWlaV1JrWldSTVlYcDVSR0Z6YUdKdllYSmtVR0ZuWlZ3aUxGeHVJQ0FnSUNBZ0lDQmNJa1Z0WW1Wa1pXUk1ZWHA1UkdGemFHSnZZWEprVUdGblpWd2lMRnh1SUNBZ0lGMWNibHh1SUNBZ0lHWnZjaUJ1WVcxbElHbHVJRzVoYldWek9seHVJQ0FnSUNBZ0lDQndZWFIwWlhKdUlEMGdjbVV1WTI5dGNHbHNaU2hjYmlBZ0lDQWdJQ0FnSUNBZ0lISm1YQ0pqYjI1emRDQjdibUZ0WlgwZ1BTQmNYRnhjS0Z4Y1hGd3BJRDArSUZ4Y1hGeDdleTRxUDF4Y1hGeHVYRnhjWEgxOU8xeGNYRnh1WENKY2JpQWdJQ0FnSUNBZ0lDQWdJSEptWENJb1B6MWpiMjV6ZENCRmJXSmxaR1JsWkZKdmRYUmxLVndpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdjbVV1UkU5VVFVeE1MRnh1SUNBZ0lDQWdJQ0FwWEc1Y2JpQWdJQ0FnSUNBZ2JXRjBZMmdnUFNCd1lYUjBaWEp1TG5ObFlYSmphQ2hqYjI1MFpXNTBLVnh1WEc0Z0lDQWdJQ0FnSUdsbUlHMWhkR05vT2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHMWhkR05vTENCdVlXMWxYRzVjYmlBZ0lDQnlZV2x6WlNCUVlYUmphRVZ5Y205eUtGeHVJQ0FnSUNBZ0lDQmNJa052ZFd4a0lHNXZkQ0JtYVc1a0lFVnRZbVZrWkdWa1RHRjZlVVJoYzJoaWIyRnlaRkJoWjJVZ1ltVm1iM0psSUVWdFltVmtaR1ZrVW05MWRHVmNJbHh1SUNBZ0lDbGNibHh1WEc1a1pXWWdjR0YwWTJoZlpuSnZiblJsYm1Rb1puSnZiblJsYm1SZmNHRjBhRG9nVUdGMGFDa2dMVDRnVG05dVpUcGNiaUFnSUNCamIyNTBaVzUwSUQwZ1puSnZiblJsYm1SZmNHRjBhQzV5WldGa1gzUmxlSFFvWlc1amIyUnBibWM5WENKMWRHWXRPRndpS1Z4dVhHNGdJQ0FnYVdZZ1hDSlRWVkJGVWxORlZGOVRWMGxVUTBoQlFreEZYMFZOUWtWRVgxQkJWRU5JWENJZ2FXNGdZMjl1ZEdWdWREcGNiaUFnSUNBZ0lDQWdjSEpwYm5Rb1psd2lRV3h5WldGa2VTQndZWFJqYUdWa09pQjdabkp2Ym5SbGJtUmZjR0YwYUgxY0lpbGNiaUFnSUNBZ0lDQWdjbVYwZFhKdVhHNWNiaUFnSUNCamIyNTBaVzUwSUQwZ2NHRjBZMmhmY21WaFkzUmZhVzF3YjNKMEtHTnZiblJsYm5RcFhHNWNiaUFnSUNCamIyMXdiMjVsYm5SZmJXRjBZMmdzSUdOdmJYQnZibVZ1ZEY5dVlXMWxJRDBnYkc5allYUmxYMlZ0WW1Wa1pHVmtYMk52YlhCdmJtVnVkQ2hjYmlBZ0lDQWdJQ0FnWTI5dWRHVnVkRnh1SUNBZ0lDbGNibHh1SUNBZ0lISmxjR3hoWTJWdFpXNTBYMk52YlhCdmJtVnVkQ0E5SUZ4Y1lDOHZJRk5WVUVWU1UwVlVYMU5YU1ZSRFNFRkNURVZmUlUxQ1JVUmZVRUZVUTBoY2JpOHZYRzR2THlCQmJHeHZkM01nZEdobElHVjRhWE4wYVc1bklHVnRZbVZrWkdWa0lGTjFjR1Z5YzJWMElHUnZZM1Z0Wlc1MElIUnZJSEpsY0d4aFkyVWdSR0Z6YUdKdllYSmtVR0ZuWlZ4dUx5OGdkMmwwYUc5MWRDQnVZWFpwWjJGMGFXNW5JRzl5SUhKbFkzSmxZWFJwYm1jZ2RHaGxJR2xtY21GdFpTNWNiaTh2WEc0dkx5QlRaV04xY21sMGVUcGNiaTh2SUMwZ1ZHaHBjeUJ0WlhSb2IyUWdhWE1nWlhod2IzTmxaQ0J2Ym14NUlIUm9jbTkxWjJnZ1UzVndaWEp6WlhRbmN5QmxlR2x6ZEdsdVp5QlRkMmwwWTJoaWIyRnlaRnh1THk4Z0lDQk5aWE56WVdkbFEyaGhibTVsYkM1Y2JpOHZJQzBnVkdobElHaHZjM1FnWVhCd2JHbGpZWFJwYjI0Z2JYVnpkQ0J2WW5SaGFXNGdZU0JuZFdWemRDQjBiMnRsYmlCbWIzSWdkR2hsSUhSaGNtZGxkQ0JrWVhOb1ltOWhjbVF1WEc0dkx5QXRJRk4xY0dWeWMyVjBKM01nYm05eWJXRnNJRUZzYkc5M1pXUWdSRzl0WVdsdWN5QjJZV3hwWkdGMGFXOXVJSEpsYldGcGJuTWdhVzRnWldabVpXTjBMbHh1WEc1cGJuUmxjbVpoWTJVZ1UzZHBkR05vUkdGemFHSnZZWEprVUdGNWJHOWhaQ0I3WEc0Z0lHUmhjMmhpYjJGeVpFbGtPaUJ6ZEhKcGJtYzdYRzRnSUdkMVpYTjBWRzlyWlc0NklITjBjbWx1Wnp0Y2JuMWNibHh1YVc1MFpYSm1ZV05sSUZOM2FYUmphRVJoYzJoaWIyRnlaRkpsYzNWc2RDQjdYRzRnSUdSaGMyaGliMkZ5WkVsa09pQnpkSEpwYm1jN1hHNGdJR0ZqWTJWd2RHVmtPaUIwY25WbE8xeHVmVnh1WEc1MGVYQmxJRVJoYzJoaWIyRnlaRk4zYVhSamFFaGhibVJzWlhJZ1BTQW9YRzRnSUhCaGVXeHZZV1E2SUZOM2FYUmphRVJoYzJoaWIyRnlaRkJoZVd4dllXUXNYRzRwSUQwK0lGQnliMjFwYzJVOFUzZHBkR05vUkdGemFHSnZZWEprVW1WemRXeDBQanRjYmx4dWJHVjBJR1JoYzJoaWIyRnlaRk4zYVhSamFFaGhibVJzWlhJNklFUmhjMmhpYjJGeVpGTjNhWFJqYUVoaGJtUnNaWElnZkNCMWJtUmxabWx1WldRN1hHNWNibU52Ym5OMElGeGNKSHRqYjIxd2IyNWxiblJmYm1GdFpYMGdQU0FvS1NBOVBpQjdYRzRnSUdOdmJuTjBJSFZwUTI5dVptbG5JRDBnZFhObFZXbERiMjVtYVdjb0tUdGNibHh1SUNCamIyNXpkQ0JiWkdGemFHSnZZWEprU1dRc0lITmxkRVJoYzJoaWIyRnlaRWxrWFNBOUlIVnpaVk4wWVhSbFBITjBjbWx1WnlCOElHNTFiR3crS0Z4dUlDQWdJR0p2YjNSemRISmhjRVJoZEdFdVpXMWlaV1JrWldRaExtUmhjMmhpYjJGeVpGOXBaQ3hjYmlBZ0tUdGNibHh1SUNCMWMyVkZabVpsWTNRb0tDa2dQVDRnZTF4dUlDQWdJR1JoYzJoaWIyRnlaRk4zYVhSamFFaGhibVJzWlhJZ1BTQmhjM2x1WXlBb2UxeHVJQ0FnSUNBZ1pHRnphR0p2WVhKa1NXUTZJSEpsY1hWbGMzUmxaRVJoYzJoaWIyRnlaRWxrTEZ4dUlDQWdJQ0FnWjNWbGMzUlViMnRsYml4Y2JpQWdJQ0I5T2lCVGQybDBZMmhFWVhOb1ltOWhjbVJRWVhsc2IyRmtLU0E5UGlCN1hHNGdJQ0FnSUNCamIyNXpkQ0J1WlhoMFJHRnphR0p2WVhKa1NXUWdQU0J5WlhGMVpYTjBaV1JFWVhOb1ltOWhjbVJKWkM1MGNtbHRLQ2s3WEc1Y2JpQWdJQ0FnSUdsbUlDZ2hibVY0ZEVSaGMyaGliMkZ5WkVsa0tTQjdYRzRnSUNBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpaGNiaUFnSUNBZ0lDQWdJQ0FuWkdGemFHSnZZWEprU1dRZ2JYVnpkQ0JpWlNCaElHNXZiaTFsYlhCMGVTQnpkSEpwYm1jbkxGeHVJQ0FnSUNBZ0lDQXBPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0JwWmlBb1hHNGdJQ0FnSUNBZ0lIUjVjR1Z2WmlCbmRXVnpkRlJ2YTJWdUlDRTlQU0FuYzNSeWFXNW5KeUI4ZkZ4dUlDQWdJQ0FnSUNCbmRXVnpkRlJ2YTJWdUxuUnlhVzBvS1M1c1pXNW5kR2dnUFQwOUlEQmNiaUFnSUNBZ0lDa2dlMXh1SUNBZ0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9YRzRnSUNBZ0lDQWdJQ0FnSjJkMVpYTjBWRzlyWlc0Z2JYVnpkQ0JpWlNCaElHNXZiaTFsYlhCMGVTQnpkSEpwYm1jbkxGeHVJQ0FnSUNBZ0lDQXBPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0J6WlhSRVlYTm9ZbTloY21SSlpDaHVkV3hzS1R0Y2JseHVJQ0FnSUNBZ1pHbHpjR3hoZVdWa1ZXNWhkWFJvYjNKcGVtVmtWRzloYzNRZ1BTQm1ZV3h6WlR0Y2JseHVJQ0FnSUNBZ2MyVjBkWEJIZFdWemRFTnNhV1Z1ZENobmRXVnpkRlJ2YTJWdUtUdGNibHh1SUNBZ0lDQWdZWGRoYVhRZ2JtVjNJRkJ5YjIxcGMyVThkbTlwWkQ0b2NtVnpiMngyWlNBOVBpQjdYRzRnSUNBZ0lDQWdJSGRwYm1SdmR5NXlaWEYxWlhOMFFXNXBiV0YwYVc5dVJuSmhiV1VvS0NrZ1BUNGdjbVZ6YjJ4MlpTZ3BLVHRjYmlBZ0lDQWdJSDBwTzF4dVhHNGdJQ0FnSUNCelpYUkVZWE5vWW05aGNtUkpaQ2h1WlhoMFJHRnphR0p2WVhKa1NXUXBPMXh1WEc0Z0lDQWdJQ0J5WlhSMWNtNGdlMXh1SUNBZ0lDQWdJQ0JrWVhOb1ltOWhjbVJKWkRvZ2JtVjRkRVJoYzJoaWIyRnlaRWxrTEZ4dUlDQWdJQ0FnSUNCaFkyTmxjSFJsWkRvZ2RISjFaU3hjYmlBZ0lDQWdJSDA3WEc0Z0lDQWdmVHRjYmx4dUlDQWdJSEpsZEhWeWJpQW9LU0E5UGlCN1hHNGdJQ0FnSUNCa1lYTm9ZbTloY21SVGQybDBZMmhJWVc1a2JHVnlJRDBnZFc1a1pXWnBibVZrTzF4dUlDQWdJSDA3WEc0Z0lIMHNJRnRkS1R0Y2JseHVJQ0IxYzJWRlptWmxZM1FvS0NrZ1BUNGdlMXh1SUNBZ0lHbG1JQ2doZFdsRGIyNW1hV2MvTG1WdGFYUkVZWFJoVFdGemEzTXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQjFibVJsWm1sdVpXUTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2JHVjBJSEJ5WlhacGIzVnpSR0YwWVUxaGMyc2dQU0J6ZEc5eVpTNW5aWFJUZEdGMFpTZ3BMbVJoZEdGTllYTnJPMXh1WEc0Z0lDQWdjbVYwZFhKdUlITjBiM0psTG5OMVluTmpjbWxpWlNnb0tTQTlQaUI3WEc0Z0lDQWdJQ0JqYjI1emRDQmpkWEp5Wlc1MFJHRjBZVTFoYzJzZ1BTQnpkRzl5WlM1blpYUlRkR0YwWlNncExtUmhkR0ZOWVhOck8xeHVYRzRnSUNBZ0lDQnBaaUFvY0hKbGRtbHZkWE5FWVhSaFRXRnpheUFoUFQwZ1kzVnljbVZ1ZEVSaGRHRk5ZWE5yS1NCN1hHNGdJQ0FnSUNBZ0lGTjNhWFJqYUdKdllYSmtMbVZ0YVhRb0oyOWljMlZ5ZG1WRVlYUmhUV0Z6YXljc0lIdGNiaUFnSUNBZ0lDQWdJQ0F1TGk1amRYSnlaVzUwUkdGMFlVMWhjMnNzWEc0Z0lDQWdJQ0FnSUNBZ0xpNHVaMlYwUkdGMFlVMWhjMnREYUdGdVoyVlVjbWxuWjJWeUtGeHVJQ0FnSUNBZ0lDQWdJQ0FnWTNWeWNtVnVkRVJoZEdGTllYTnJMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2NISmxkbWx2ZFhORVlYUmhUV0Z6YXl4Y2JpQWdJQ0FnSUNBZ0lDQXBMRnh1SUNBZ0lDQWdJQ0I5S1R0Y2JseHVJQ0FnSUNBZ0lDQndjbVYyYVc5MWMwUmhkR0ZOWVhOcklEMGdZM1Z5Y21WdWRFUmhkR0ZOWVhOck8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgwcE8xeHVJQ0I5TENCYmRXbERiMjVtYVdjL0xtVnRhWFJFWVhSaFRXRnphM05kS1R0Y2JseHVJQ0JwWmlBb0lXUmhjMmhpYjJGeVpFbGtLU0I3WEc0Z0lDQWdjbVYwZFhKdUlEeE1iMkZrYVc1bklDOCtPMXh1SUNCOVhHNWNiaUFnY21WMGRYSnVJQ2hjYmlBZ0lDQThUR0Y2ZVVSaGMyaGliMkZ5WkZCaFoyVmNiaUFnSUNBZ0lHdGxlVDE3WkdGemFHSnZZWEprU1dSOVhHNGdJQ0FnSUNCcFpFOXlVMngxWnoxN1pHRnphR0p2WVhKa1NXUjlYRzRnSUNBZ0x6NWNiaUFnS1R0Y2JuMDdYRzVjWEdCY2JseHVJQ0FnSUdOdmJuUmxiblFnUFNBb1hHNGdJQ0FnSUNBZ0lHTnZiblJsYm5SYk9pQmpiMjF3YjI1bGJuUmZiV0YwWTJndWMzUmhjblFvS1YxY2JpQWdJQ0FnSUNBZ0t5QnlaWEJzWVdObGJXVnVkRjlqYjIxd2IyNWxiblJjYmlBZ0lDQWdJQ0FnS3lCamIyNTBaVzUwVzJOdmJYQnZibVZ1ZEY5dFlYUmphQzVsYm1Rb0tTQTZYVnh1SUNBZ0lDbGNibHh1SUNBZ0lITjNhWFJqYUdKdllYSmtYMkZ1WTJodmNsOWpZVzVrYVdSaGRHVnpJRDBnVzF4dUlDQWdJQ0FnSUNBb1hHNGdJQ0FnSUNBZ0lDQWdJQ0JjSWlBZ0lDQlRkMmwwWTJoaWIyRnlaQzVrWldacGJtVk5aWFJvYjJRb1hDSmNiaUFnSUNBZ0lDQWdJQ0FnSUZ3aUoyZGxkRk5qY205c2JGTnBlbVVuTENCbGJXSmxaR1JsWkVGd2FTNW5aWFJUWTNKdmJHeFRhWHBsS1R0Y0lseHVJQ0FnSUNBZ0lDQXBMRnh1SUNBZ0lDQWdJQ0FvWEc0Z0lDQWdJQ0FnSUNBZ0lDQmNJaUFnSUNCVGQybDBZMmhpYjJGeVpDNWtaV1pwYm1WTlpYUm9iMlFvWEZ4Y1hHNWNJbHh1SUNBZ0lDQWdJQ0FnSUNBZ1hDSWdJQ0FnSUNBbloyVjBVMk55YjJ4c1UybDZaU2NzWEZ4Y1hHNWNJbHh1SUNBZ0lDQWdJQ0FnSUNBZ1hDSWdJQ0FnSUNCbGJXSmxaR1JsWkVGd2FTNW5aWFJUWTNKdmJHeFRhWHBsTEZ4Y1hGeHVYQ0pjYmlBZ0lDQWdJQ0FnSUNBZ0lGd2lJQ0FnSUNrN1hDSmNiaUFnSUNBZ0lDQWdLU3hjYmlBZ0lDQmRYRzVjYmlBZ0lDQnpkMmwwWTJoaWIyRnlaRjl0WlhSb2IyUWdQU0JjSWx3aVhDSWdJQ0FnVTNkcGRHTm9ZbTloY21RdVpHVm1hVzVsVFdWMGFHOWtLRnh1SUNBZ0lDQWdKM04zYVhSamFFUmhjMmhpYjJGeVpDY3NYRzRnSUNBZ0lDQmhjM2x1WXlBb1hHNGdJQ0FnSUNBZ0lIQmhlV3h2WVdRNklGTjNhWFJqYUVSaGMyaGliMkZ5WkZCaGVXeHZZV1FzWEc0Z0lDQWdJQ0FwT2lCUWNtOXRhWE5sUEZOM2FYUmphRVJoYzJoaWIyRnlaRkpsYzNWc2RENGdQVDRnZTF4dUlDQWdJQ0FnSUNCcFppQW9JV1JoYzJoaWIyRnlaRk4zYVhSamFFaGhibVJzWlhJcElIdGNiaUFnSUNBZ0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9YRzRnSUNBZ0lDQWdJQ0FnSUNBblZHaGxJR1Z0WW1Wa1pHVmtJR1JoYzJoaWIyRnlaQ0JwY3lCdWIzUWdjbVZoWkhrZ2RHOGdjM2RwZEdOb0p5eGNiaUFnSUNBZ0lDQWdJQ0FwTzF4dUlDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHUmhjMmhpYjJGeVpGTjNhWFJqYUVoaGJtUnNaWElvY0dGNWJHOWhaQ2s3WEc0Z0lDQWdJQ0I5TEZ4dUlDQWdJQ2s3WEc1Y2Jsd2lYQ0pjSWx4dVhHNGdJQ0FnWVc1amFHOXlYMlp2ZFc1a0lEMGdSbUZzYzJWY2JseHVJQ0FnSUdadmNpQmhibU5vYjNJZ2FXNGdjM2RwZEdOb1ltOWhjbVJmWVc1amFHOXlYMk5oYm1ScFpHRjBaWE02WEc0Z0lDQWdJQ0FnSUdsbUlHTnZiblJsYm5RdVkyOTFiblFvWVc1amFHOXlLU0E5UFNBeE9seHVJQ0FnSUNBZ0lDQWdJQ0FnWTI5dWRHVnVkQ0E5SUdOdmJuUmxiblF1Y21Wd2JHRmpaU2hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm1Ob2IzSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM2RwZEdOb1ltOWhjbVJmYldWMGFHOWtJQ3NnWVc1amFHOXlMRnh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJREVzWEc0Z0lDQWdJQ0FnSUNBZ0lDQXBYRzRnSUNBZ0lDQWdJQ0FnSUNCaGJtTm9iM0pmWm05MWJtUWdQU0JVY25WbFhHNGdJQ0FnSUNBZ0lDQWdJQ0JpY21WaGExeHVYRzRnSUNBZ2FXWWdibTkwSUdGdVkyaHZjbDltYjNWdVpEcGNiaUFnSUNBZ0lDQWdjbUZwYzJVZ1VHRjBZMmhGY25KdmNpaGNiaUFnSUNBZ0lDQWdJQ0FnSUZ3aVEyOTFiR1FnYm05MElHeHZZMkYwWlNCMGFHVWdaMlYwVTJOeWIyeHNVMmw2WlNCVGQybDBZMmhpYjJGeVpDQnRaWFJvYjJSY0lseHVJQ0FnSUNBZ0lDQXBYRzVjYmlBZ0lDQm1jbTl1ZEdWdVpGOXdZWFJvTG5keWFYUmxYM1JsZUhRb1kyOXVkR1Z1ZEN3Z1pXNWpiMlJwYm1jOVhDSjFkR1l0T0Z3aUtWeHVJQ0FnSUhCeWFXNTBLR1pjSWxCaGRHTm9aV1E2SUh0bWNtOXVkR1Z1WkY5d1lYUm9mVndpS1Z4dVhHNWNibVJsWmlCd1lYUmphRjluZFdWemRGOTBiMnRsYmw5bVpYUmphRjkwZVhCbEtHTnZiblJsYm5RNklITjBjaWtnTFQ0Z2MzUnlPbHh1SUNBZ0lHTmhibVJwWkdGMFpYTWdQU0JiWEc0Z0lDQWdJQ0FnSUZ3aVpYaHdiM0owSUhSNWNHVWdSM1ZsYzNSVWIydGxia1psZEdOb1JtNGdQU0FvS1NBOVBpQlFjbTl0YVhObFBITjBjbWx1Wno0N1hDSXNYRzRnSUNBZ0lDQWdJQ2hjYmlBZ0lDQWdJQ0FnSUNBZ0lGd2laWGh3YjNKMElIUjVjR1VnUjNWbGMzUlViMnRsYmtabGRHTm9SbTRnUFNCY0lseHVJQ0FnSUNBZ0lDQWdJQ0FnWENJb0tTQTlQaUJRY205dGFYTmxQSE4wY21sdVp6NDdYQ0pjYmlBZ0lDQWdJQ0FnS1N4Y2JpQWdJQ0JkWEc1Y2JpQWdJQ0J5WlhCc1lXTmxiV1Z1ZENBOUlGd2lYQ0pjSWk4dklGTlZVRVZTVTBWVVgxTlhTVlJEU0VGQ1RFVmZSVTFDUlVSZlUwUkxYMUJCVkVOSVhHNHZMMXh1THk4Z1pHRnphR0p2WVhKa1NXUWdhWE1nZFc1a1pXWnBibVZrSUdadmNpQjBhR1VnYVc1cGRHbGhiQ0JrWVhOb1ltOWhjbVFnWW05dmRITjBjbUZ3TGx4dUx5OGdRV1owWlhJZ1lTQnpkV05qWlhOelpuVnNJR1JoYzJoaWIyRnlaQ0J6ZDJsMFkyZ3NJSFJ2YTJWdUlISmxabkpsYzJobGN5QnlaV05sYVhabElIUm9aU0JoWTNScGRtVmNiaTh2SUdSaGMyaGliMkZ5WkNCVlZVbEVMbHh1Wlhod2IzSjBJSFI1Y0dVZ1IzVmxjM1JVYjJ0bGJrWmxkR05vUm00Z1BTQW9YRzRnSUdSaGMyaGliMkZ5WkVsa1B6b2djM1J5YVc1bkxGeHVLU0E5UGlCUWNtOXRhWE5sUEhOMGNtbHVaejQ3WENKY0lsd2lYRzVjYmlBZ0lDQm1iM0lnWTJGdVpHbGtZWFJsSUdsdUlHTmhibVJwWkdGMFpYTTZYRzRnSUNBZ0lDQWdJR2xtSUdOdmJuUmxiblF1WTI5MWJuUW9ZMkZ1Wkdsa1lYUmxLU0E5UFNBeE9seHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR052Ym5SbGJuUXVjbVZ3YkdGalpTaGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpZVzVrYVdSaGRHVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ3YkdGalpXMWxiblFzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTVN4Y2JpQWdJQ0FnSUNBZ0lDQWdJQ2xjYmx4dUlDQWdJSEpoYVhObElGQmhkR05vUlhKeWIzSW9YQ0pEYjNWc1pDQnViM1FnYkc5allYUmxJRWQxWlhOMFZHOXJaVzVHWlhSamFFWnVYQ0lwWEc1Y2JseHVaR1ZtSUhCaGRHTm9YMlZ0WW1Wa1pHVmtYMlJoYzJoaWIyRnlaRjkwZVhCbEtHTnZiblJsYm5RNklITjBjaWtnTFQ0Z2MzUnlPbHh1SUNBZ0lIUjVjR1ZmY0dGMGRHVnliaUE5SUhKbExtTnZiWEJwYkdVb1hHNGdJQ0FnSUNBZ0lISmNJaWhsZUhCdmNuUmNYRnhjY3lzb1B6cHBiblJsY21aaFkyVjhkSGx3WlNsY1hGeGNjeXRGYldKbFpHUmxaRVJoYzJoaWIyRnlaRndpWEc0Z0lDQWdJQ0FnSUhKY0lpNHFQMXhjWEZ4N0tTZ3VLajhwS0Z4Y1hGeHVYRnhjWEgwN0tWd2lMRnh1SUNBZ0lDQWdJQ0J5WlM1RVQxUkJURXdzWEc0Z0lDQWdLVnh1WEc0Z0lDQWdiV0YwWTJnZ1BTQjBlWEJsWDNCaGRIUmxjbTR1YzJWaGNtTm9LR052Ym5SbGJuUXBYRzVjYmlBZ0lDQnBaaUJ1YjNRZ2JXRjBZMmc2WEc0Z0lDQWdJQ0FnSUhKaGFYTmxJRkJoZEdOb1JYSnliM0lvWEc0Z0lDQWdJQ0FnSUNBZ0lDQmNJa052ZFd4a0lHNXZkQ0JzYjJOaGRHVWdkR2hsSUVWdFltVmtaR1ZrUkdGemFHSnZZWEprSUhCMVlteHBZeUIwZVhCbFhDSmNiaUFnSUNBZ0lDQWdLVnh1WEc0Z0lDQWdZbTlrZVNBOUlHMWhkR05vTG1keWIzVndLRElwWEc1Y2JpQWdJQ0JwWmlCY0luTjNhWFJqYUVSaGMyaGliMkZ5WkRwY0lpQnBiaUJpYjJSNU9seHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1kyOXVkR1Z1ZEZ4dVhHNGdJQ0FnYldWMGFHOWtJRDBnWENKY0lsd2lYRzRnSUM4cUtseHVJQ0FnS2lCU1pYQnNZV05sY3lCRVlYTm9ZbTloY21SUVlXZGxJR2x1SUhSb1pTQmxlR2x6ZEdsdVp5QnBabkpoYldVZ1pHOWpkVzFsYm5RdVhHNGdJQ0FxWEc0Z0lDQXFJRlJvWlNCMllXeDFaU0J0ZFhOMElHSmxJSFJvWlNCMFlYSm5aWFFnWkdGemFHSnZZWEprSUZWVlNVUXZhV1FnWVdOalpYQjBaV1FnWW5sY2JpQWdJQ29nUkdGemFHSnZZWEprVUdGblpTd2dibTkwSUhSb1pTQmxiV0psWkdSbFpDMWpiMjVtYVdkMWNtRjBhVzl1SUZWVlNVUWdkWE5sWkNCcGJpQjBhR1ZjYmlBZ0lDb2dhVzVwZEdsaGJDQXZaVzFpWldSa1pXUXZPblYxYVdRZ1ZWSk1MbHh1SUNBZ0tpOWNiaUFnYzNkcGRHTm9SR0Z6YUdKdllYSmtPaUFvWEc0Z0lDQWdaR0Z6YUdKdllYSmtTV1E2SUhOMGNtbHVaeXhjYmlBZ0tTQTlQaUJRY205dGFYTmxQSHRjYmlBZ0lDQmtZWE5vWW05aGNtUkpaRG9nYzNSeWFXNW5PMXh1SUNBZ0lHRmpZMlZ3ZEdWa09pQjBjblZsTzF4dUlDQjlQanRjYmx3aVhDSmNJbHh1WEc0Z0lDQWdkWEJrWVhSbFpGOTBlWEJsSUQwZ0tGeHVJQ0FnSUNBZ0lDQnRZWFJqYUM1bmNtOTFjQ2d4S1Z4dUlDQWdJQ0FnSUNBcklHSnZaSGt1Y25OMGNtbHdLQ2xjYmlBZ0lDQWdJQ0FnS3lCY0lseGNYRnh1WENKY2JpQWdJQ0FnSUNBZ0t5QnRaWFJvYjJRdWNuTjBjbWx3S0NsY2JpQWdJQ0FnSUNBZ0t5QnRZWFJqYUM1bmNtOTFjQ2d6S1Z4dUlDQWdJQ2xjYmx4dUlDQWdJSEpsZEhWeWJpQW9YRzRnSUNBZ0lDQWdJR052Ym5SbGJuUmJPaUJ0WVhSamFDNXpkR0Z5ZENncFhWeHVJQ0FnSUNBZ0lDQXJJSFZ3WkdGMFpXUmZkSGx3WlZ4dUlDQWdJQ0FnSUNBcklHTnZiblJsYm5SYmJXRjBZMmd1Wlc1a0tDa2dPbDFjYmlBZ0lDQXBYRzVjYmx4dVpHVm1JSEJoZEdOb1gybHVhWFJwWVd4ZlozVmxjM1JmZEc5clpXNWZabVYwWTJnb1kyOXVkR1Z1ZERvZ2MzUnlLU0F0UGlCemRISTZYRzRnSUNBZ1kyRnVaR2xrWVhSbGN5QTlJRnRjYmlBZ0lDQWdJQ0FnWENKbVpYUmphRWQxWlhOMFZHOXJaVzRvS1N4Y0lpeGNiaUFnSUNBZ0lDQWdYQ0poZDJGcGRDQm1aWFJqYUVkMVpYTjBWRzlyWlc0b0tTeGNJaXhjYmlBZ0lDQmRYRzVjYmlBZ0lDQm1iM0lnWTJGdVpHbGtZWFJsSUdsdUlHTmhibVJwWkdGMFpYTTZYRzRnSUNBZ0lDQWdJR2xtSUdOdmJuUmxiblF1WTI5MWJuUW9ZMkZ1Wkdsa1lYUmxLU0ErUFNBeE9seHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR052Ym5SbGJuUXVjbVZ3YkdGalpTaGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpZVzVrYVdSaGRHVXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZMkZ1Wkdsa1lYUmxMbkpsY0d4aFkyVW9YRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUZ3aVptVjBZMmhIZFdWemRGUnZhMlZ1S0NsY0lpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWENKbVpYUmphRWQxWlhOMFZHOXJaVzRvZFc1a1pXWnBibVZrS1Z3aUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDa3NYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdNU3hjYmlBZ0lDQWdJQ0FnSUNBZ0lDbGNibHh1SUNBZ0lISmhhWE5sSUZCaGRHTm9SWEp5YjNJb1hHNGdJQ0FnSUNBZ0lGd2lRMjkxYkdRZ2JtOTBJR3h2WTJGMFpTQjBhR1VnYVc1cGRHbGhiQ0JtWlhSamFFZDFaWE4wVkc5clpXNGdZMkZzYkZ3aVhHNGdJQ0FnS1Z4dVhHNWNibVJsWmlCd1lYUmphRjluZFdWemRGOTBiMnRsYmw5eVpXWnlaWE5vS0dOdmJuUmxiblE2SUhOMGNpa2dMVDRnYzNSeU9seHVJQ0FnSUhCaGRIUmxjbTV6SUQwZ1cxeHVJQ0FnSUNBZ0lDQnlaUzVqYjIxd2FXeGxLRnh1SUNBZ0lDQWdJQ0FnSUNBZ2Nsd2lZWE41Ym1NZ1puVnVZM1JwYjI0Z2NtVm1jbVZ6YUVkMVpYTjBWRzlyWlc1Y1hGeGNLRnhjWEZ3cElGeGNYRng3WEZ4Y1hITXFYQ0pjYmlBZ0lDQWdJQ0FnSUNBZ0lISmNJbU52Ym5OMElHNWxkMGQxWlhOMFZHOXJaVzRnUFNCaGQyRnBkQ0JtWlhSamFFZDFaWE4wVkc5clpXNWNYRnhjS0Z4Y1hGd3BPMXhjWEZ4ektsd2lYRzRnSUNBZ0lDQWdJQ0FnSUNCeVhDSnZkWEpRYjNKMFhGeGNYQzVsYldsMFhGeGNYQ2hjSWx4dUlDQWdJQ0FnSUNBZ0lDQWdjbHdpSjJkMVpYTjBWRzlyWlc0bkxGeGNYRnh6S2x4Y1hGeDdYRnhjWEhNcVozVmxjM1JVYjJ0bGJqcGNYRnhjY3lwdVpYZEhkV1Z6ZEZSdmEyVnVYRnhjWEhNcVhGeGNYSDFjSWx4dUlDQWdJQ0FnSUNBZ0lDQWdjbHdpWEZ4Y1hDazdYRnhjWEhNcVhDSmNiaUFnSUNBZ0lDQWdJQ0FnSUhKY0luTmxkRlJwYldWdmRYUmNYRnhjS0Z3aVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WENKeVpXWnlaWE5vUjNWbGMzUlViMnRsYml4Y1hGeGNjeXBjSWx4dUlDQWdJQ0FnSUNBZ0lDQWdjbHdpWjJWMFIzVmxjM1JVYjJ0bGJsSmxabkpsYzJoVWFXMXBibWRjWEZ4Y0tHNWxkMGQxWlhOMFZHOXJaVzVjWEZ4Y0tWd2lYRzRnSUNBZ0lDQWdJQ0FnSUNCeVhDSmNYRnhjS1R0Y1hGeGNjeXBjSWx4dUlDQWdJQ0FnSUNBZ0lDQWdjbHdpWEZ4Y1hIMWNJaXhjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxMa1JQVkVGTVRDeGNiaUFnSUNBZ0lDQWdLU3hjYmlBZ0lDQWdJQ0FnY21VdVkyOXRjR2xzWlNoY2JpQWdJQ0FnSUNBZ0lDQWdJSEpjSW1OdmJuTjBJSEpsWm5KbGMyaEhkV1Z6ZEZSdmEyVnVJRDBnWVhONWJtTWdYRnhjWENoY1hGeGNLU0E5UGlCY1hGeGNlMXhjWEZ4ektsd2lYRzRnSUNBZ0lDQWdJQ0FnSUNCeVhDSmpiMjV6ZENCdVpYZEhkV1Z6ZEZSdmEyVnVJRDBnWVhkaGFYUWdabVYwWTJoSGRXVnpkRlJ2YTJWdVhGeGNYQ2hjWEZ4Y0tUdGNYRnhjY3lwY0lseHVJQ0FnSUNBZ0lDQWdJQ0FnY2x3aWIzVnlVRzl5ZEZ4Y1hGd3VaVzFwZEZ4Y1hGd29YQ0pjYmlBZ0lDQWdJQ0FnSUNBZ0lISmNJaWRuZFdWemRGUnZhMlZ1Snl4Y1hGeGNjeXBjWEZ4Y2UxeGNYRnh6S21kMVpYTjBWRzlyWlc0NlhGeGNYSE1xYm1WM1IzVmxjM1JVYjJ0bGJseGNYRnh6S2x4Y1hGeDlYQ0pjYmlBZ0lDQWdJQ0FnSUNBZ0lISmNJbHhjWEZ3cE8xeGNYRnh6S2x3aVhHNGdJQ0FnSUNBZ0lDQWdJQ0J5WENKelpYUlVhVzFsYjNWMFhGeGNYQ2hjSWx4dUlDQWdJQ0FnSUNBZ0lDQWdjbHdpY21WbWNtVnphRWQxWlhOMFZHOXJaVzRzWEZ4Y1hITXFYQ0pjYmlBZ0lDQWdJQ0FnSUNBZ0lISmNJbWRsZEVkMVpYTjBWRzlyWlc1U1pXWnlaWE5vVkdsdGFXNW5YRnhjWENodVpYZEhkV1Z6ZEZSdmEyVnVYRnhjWENsY0lseHVJQ0FnSUNBZ0lDQWdJQ0FnY2x3aVhGeGNYQ2s3WEZ4Y1hITXFYQ0pjYmlBZ0lDQWdJQ0FnSUNBZ0lISmNJbHhjWEZ4OU8xd2lMRnh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVXVSRTlVUVV4TUxGeHVJQ0FnSUNBZ0lDQXBMRnh1SUNBZ0lGMWNibHh1SUNBZ0lISmxjR3hoWTJWdFpXNTBJRDBnWENKY0lsd2liR1YwSUdGamRHbDJaVVJoYzJoaWIyRnlaRWxrT2lCemRISnBibWNnZkNCMWJtUmxabWx1WldRN1hHNWNiaUFnWVhONWJtTWdablZ1WTNScGIyNGdjbVZtY21WemFFZDFaWE4wVkc5clpXNG9LU0I3WEc0Z0lDQWdZMjl1YzNRZ2JtVjNSM1ZsYzNSVWIydGxiaUE5SUdGM1lXbDBJR1psZEdOb1IzVmxjM1JVYjJ0bGJpaGNiaUFnSUNBZ0lHRmpkR2wyWlVSaGMyaGliMkZ5WkVsa0xGeHVJQ0FnSUNrN1hHNWNiaUFnSUNCdmRYSlFiM0owTG1WdGFYUW9KMmQxWlhOMFZHOXJaVzRuTENCN1hHNGdJQ0FnSUNCbmRXVnpkRlJ2YTJWdU9pQnVaWGRIZFdWemRGUnZhMlZ1TEZ4dUlDQWdJSDBwTzF4dVhHNGdJQ0FnYzJWMFZHbHRaVzkxZENoY2JpQWdJQ0FnSUhKbFpuSmxjMmhIZFdWemRGUnZhMlZ1TEZ4dUlDQWdJQ0FnWjJWMFIzVmxjM1JVYjJ0bGJsSmxabkpsYzJoVWFXMXBibWNvYm1WM1IzVmxjM1JVYjJ0bGJpa3NYRzRnSUNBZ0tUdGNiaUFnZlZ3aVhDSmNJbHh1WEc0Z0lDQWdabTl5SUhCaGRIUmxjbTRnYVc0Z2NHRjBkR1Z5Ym5NNlhHNGdJQ0FnSUNBZ0lIVndaR0YwWldRc0lHTnZkVzUwSUQwZ2NHRjBkR1Z5Ymk1emRXSnVLRnh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVndiR0ZqWlcxbGJuUXNYRzRnSUNBZ0lDQWdJQ0FnSUNCamIyNTBaVzUwTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdZMjkxYm5ROU1TeGNiaUFnSUNBZ0lDQWdLVnh1WEc0Z0lDQWdJQ0FnSUdsbUlHTnZkVzUwSUQwOUlERTZYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnZFhCa1lYUmxaRnh1WEc0Z0lDQWdjbUZwYzJVZ1VHRjBZMmhGY25KdmNpaGNiaUFnSUNBZ0lDQWdYQ0pEYjNWc1pDQnViM1FnYkc5allYUmxJSFJvWlNCbmRXVnpkQzEwYjJ0bGJpQnlaV1p5WlhOb0lHWjFibU4wYVc5dVhDSmNiaUFnSUNBcFhHNWNibHh1WkdWbUlIQmhkR05vWDNOa2ExOW1kVzVqZEdsdmJuTW9ZMjl1ZEdWdWREb2djM1J5S1NBdFBpQnpkSEk2WEc0Z0lDQWdZVzVqYUc5eVgyTmhibVJwWkdGMFpYTWdQU0JiWEc0Z0lDQWdJQ0FnSUNoY2JpQWdJQ0FnSUNBZ0lDQWdJRndpSUNCamIyNXpkQ0JuWlhSVFkzSnZiR3hUYVhwbElEMGdLQ2tnUFQ0Z1hDSmNiaUFnSUNBZ0lDQWdJQ0FnSUZ3aWIzVnlVRzl5ZEM1blpYUThVMmw2WlQ0b0oyZGxkRk5qY205c2JGTnBlbVVuS1R0Y0lseHVJQ0FnSUNBZ0lDQXBMRnh1SUNBZ0lDQWdJQ0FvWEc0Z0lDQWdJQ0FnSUNBZ0lDQmNJaUFnWTI5dWMzUWdaMlYwVTJOeWIyeHNVMmw2WlNBOUlDZ3BJRDArWEZ4Y1hHNWNJbHh1SUNBZ0lDQWdJQ0FnSUNBZ1hDSWdJQ0FnYjNWeVVHOXlkQzVuWlhROFUybDZaVDRvSjJkbGRGTmpjbTlzYkZOcGVtVW5LVHRjSWx4dUlDQWdJQ0FnSUNBcExGeHVJQ0FnSUYxY2JseHVJQ0FnSUhOM2FYUmphRjltZFc1amRHbHZiaUE5SUZ3aVhDSmNJaUFnWTI5dWMzUWdjM2RwZEdOb1JHRnphR0p2WVhKa0lEMGdZWE41Ym1NZ0tGeHVJQ0FnSUdSaGMyaGliMkZ5WkVsa09pQnpkSEpwYm1jc1hHNGdJQ2s2SUZCeWIyMXBjMlU4ZTF4dUlDQWdJR1JoYzJoaWIyRnlaRWxrT2lCemRISnBibWM3WEc0Z0lDQWdZV05qWlhCMFpXUTZJSFJ5ZFdVN1hHNGdJSDArSUQwK0lIdGNiaUFnSUNCamIyNXpkQ0J1YjNKdFlXeHBlbVZrUkdGemFHSnZZWEprU1dRZ1BTQmtZWE5vWW05aGNtUkpaQzUwY21sdEtDazdYRzVjYmlBZ0lDQnBaaUFvSVc1dmNtMWhiR2w2WldSRVlYTm9ZbTloY21SSlpDa2dlMXh1SUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtGeHVJQ0FnSUNBZ0lDQW5aR0Z6YUdKdllYSmtTV1FnYlhWemRDQmlaU0JoSUc1dmJpMWxiWEIwZVNCemRISnBibWNuTEZ4dUlDQWdJQ0FnS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JqYjI1emRDQm5kV1Z6ZEZSdmEyVnVJRDBnWVhkaGFYUWdabVYwWTJoSGRXVnpkRlJ2YTJWdUtGeHVJQ0FnSUNBZ2JtOXliV0ZzYVhwbFpFUmhjMmhpYjJGeVpFbGtMRnh1SUNBZ0lDazdYRzVjYmlBZ0lDQmpiMjV6ZENCeVpYTjFiSFFnUFNCaGQyRnBkQ0J2ZFhKUWIzSjBMbWRsZER4N1hHNGdJQ0FnSUNCa1lYTm9ZbTloY21SSlpEb2djM1J5YVc1bk8xeHVJQ0FnSUNBZ1lXTmpaWEIwWldRNklIUnlkV1U3WEc0Z0lDQWdmVDRvSjNOM2FYUmphRVJoYzJoaWIyRnlaQ2NzSUh0Y2JpQWdJQ0FnSUdSaGMyaGliMkZ5WkVsa09pQnViM0p0WVd4cGVtVmtSR0Z6YUdKdllYSmtTV1FzWEc0Z0lDQWdJQ0JuZFdWemRGUnZhMlZ1TEZ4dUlDQWdJSDBwTzF4dVhHNGdJQ0FnWVdOMGFYWmxSR0Z6YUdKdllYSmtTV1FnUFNCdWIzSnRZV3hwZW1Wa1JHRnphR0p2WVhKa1NXUTdYRzVjYmlBZ0lDQnlaWFIxY200Z2NtVnpkV3gwTzF4dUlDQjlPMXh1WEc1Y0lsd2lYQ0pjYmx4dUlDQWdJR1p2Y2lCaGJtTm9iM0lnYVc0Z1lXNWphRzl5WDJOaGJtUnBaR0YwWlhNNlhHNGdJQ0FnSUNBZ0lHbG1JR052Ym5SbGJuUXVZMjkxYm5Rb1lXNWphRzl5S1NBOVBTQXhPbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdOdmJuUmxiblF1Y21Wd2JHRmpaU2hjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoYm1Ob2IzSXNYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjM2RwZEdOb1gyWjFibU4wYVc5dUlDc2dZVzVqYUc5eUxGeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lERXNYRzRnSUNBZ0lDQWdJQ0FnSUNBcFhHNWNiaUFnSUNCeVlXbHpaU0JRWVhSamFFVnljbTl5S0Z4dUlDQWdJQ0FnSUNCY0lrTnZkV3hrSUc1dmRDQnNiMk5oZEdVZ2RHaGxJRk5FU3lCblpYUlRZM0p2Ykd4VGFYcGxJR1oxYm1OMGFXOXVYQ0pjYmlBZ0lDQXBYRzVjYmx4dVpHVm1JSEJoZEdOb1gzTmthMTl5WlhSMWNtNWZiMkpxWldOMEtHTnZiblJsYm5RNklITjBjaWtnTFQ0Z2MzUnlPbHh1SUNBZ0lHTmhibVJwWkdGMFpYTWdQU0JiWEc0Z0lDQWdJQ0FnSUZ3aUlDQWdJSE5sZEZSb1pXMWxUVzlrWlN4Y1hGeGNiaUFnZlR0Y0lpeGNiaUFnSUNBZ0lDQWdYQ0lnSUNBZ2MyVjBWR2hsYldWTmIyUmxMRnhjWEZ4dUlDQWdJSFZ1Ylc5MWJuUXNYRnhjWEc0Z0lIMDdYQ0lzWEc0Z0lDQWdJQ0FnSUZ3aUlDQWdJSFZ1Ylc5MWJuUXNYRnhjWEc0Z0lDQWdjMlYwVkdobGJXVk5iMlJsTEZ4Y1hGeHVJQ0I5TzF3aUxGeHVJQ0FnSUYxY2JseHVJQ0FnSUdadmNpQmpZVzVrYVdSaGRHVWdhVzRnWTJGdVpHbGtZWFJsY3pwY2JpQWdJQ0FnSUNBZ2FXWWdZMjl1ZEdWdWRDNWpiM1Z1ZENoallXNWthV1JoZEdVcElEMDlJREU2WEc0Z0lDQWdJQ0FnSUNBZ0lDQnNhVzVsY3lBOUlHTmhibVJwWkdGMFpTNXpjR3hwZEd4cGJtVnpLQ2xjYmx4dUlDQWdJQ0FnSUNBZ0lDQWdZMnh2YzJsdVp5QTlJR3hwYm1WekxuQnZjQ2dwWEc0Z0lDQWdJQ0FnSUNBZ0lDQmliMlI1SUQwZ1hDSmNYRnhjYmx3aUxtcHZhVzRvYkdsdVpYTXBYRzVjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCamIyNTBaVzUwTG5KbGNHeGhZMlVvWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTJGdVpHbGtZWFJsTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdKdlpIbGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQXJJRndpWEZ4Y1hHNWNJbHh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ3NnWENJZ0lDQWdjM2RwZEdOb1JHRnphR0p2WVhKa0xGeGNYRnh1WENKY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBcklHTnNiM05wYm1jc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ01TeGNiaUFnSUNBZ0lDQWdJQ0FnSUNsY2JseHVJQ0FnSUhKaGFYTmxJRkJoZEdOb1JYSnliM0lvWEc0Z0lDQWdJQ0FnSUZ3aVEyOTFiR1FnYm05MElHeHZZMkYwWlNCMGFHVWdSVzFpWldSa1pXUkVZWE5vWW05aGNtUWdjbVYwZFhKdUlHOWlhbVZqZEZ3aVhHNGdJQ0FnS1Z4dVhHNWNibVJsWmlCd1lYUmphRjl6Wkdzb2MyUnJYM0JoZEdnNklGQmhkR2dwSUMwK0lFNXZibVU2WEc0Z0lDQWdZMjl1ZEdWdWRDQTlJSE5rYTE5d1lYUm9MbkpsWVdSZmRHVjRkQ2hsYm1OdlpHbHVaejFjSW5WMFppMDRYQ0lwWEc1Y2JpQWdJQ0JwWmlCY0lsTlZVRVZTVTBWVVgxTlhTVlJEU0VGQ1RFVmZSVTFDUlVSZlUwUkxYMUJCVkVOSVhDSWdhVzRnWTI5dWRHVnVkRHBjYmlBZ0lDQWdJQ0FnY0hKcGJuUW9abHdpUVd4eVpXRmtlU0J3WVhSamFHVmtPaUI3YzJSclgzQmhkR2g5WENJcFhHNGdJQ0FnSUNBZ0lISmxkSFZ5Ymx4dVhHNGdJQ0FnWTI5dWRHVnVkQ0E5SUhCaGRHTm9YMmQxWlhOMFgzUnZhMlZ1WDJabGRHTm9YM1I1Y0dVb1kyOXVkR1Z1ZENsY2JpQWdJQ0JqYjI1MFpXNTBJRDBnY0dGMFkyaGZaVzFpWldSa1pXUmZaR0Z6YUdKdllYSmtYM1I1Y0dVb1kyOXVkR1Z1ZENsY2JpQWdJQ0JqYjI1MFpXNTBJRDBnY0dGMFkyaGZhVzVwZEdsaGJGOW5kV1Z6ZEY5MGIydGxibDltWlhSamFDaGpiMjUwWlc1MEtWeHVJQ0FnSUdOdmJuUmxiblFnUFNCd1lYUmphRjluZFdWemRGOTBiMnRsYmw5eVpXWnlaWE5vS0dOdmJuUmxiblFwWEc0Z0lDQWdZMjl1ZEdWdWRDQTlJSEJoZEdOb1gzTmthMTltZFc1amRHbHZibk1vWTI5dWRHVnVkQ2xjYmlBZ0lDQmpiMjUwWlc1MElEMGdjR0YwWTJoZmMyUnJYM0psZEhWeWJsOXZZbXBsWTNRb1kyOXVkR1Z1ZENsY2JseHVJQ0FnSUhOa2ExOXdZWFJvTG5keWFYUmxYM1JsZUhRb1kyOXVkR1Z1ZEN3Z1pXNWpiMlJwYm1jOVhDSjFkR1l0T0Z3aUtWeHVJQ0FnSUhCeWFXNTBLR1pjSWxCaGRHTm9aV1E2SUh0elpHdGZjR0YwYUgxY0lpbGNibHh1WEc1a1pXWWdiV0ZwYmlncElDMCtJR2x1ZERwY2JpQWdJQ0J3WVhKelpYSWdQU0JoY21kd1lYSnpaUzVCY21kMWJXVnVkRkJoY25ObGNpaGNiaUFnSUNBZ0lDQWdaR1Z6WTNKcGNIUnBiMjQ5S0Z4dUlDQWdJQ0FnSUNBZ0lDQWdYQ0pCY0hCc2VTQjBhR1VnYzNkcGRHTm9ZV0pzWlMxa1lYTm9ZbTloY21RZ2NHRjBZMmdnZEc4Z1lTQmNJbHh1SUNBZ0lDQWdJQ0FnSUNBZ1hDSlRkWEJsY25ObGRDQTJMakV1ZUNCemIzVnlZMlVnWTJobFkydHZkWFF1WENKY2JpQWdJQ0FnSUNBZ0tWeHVJQ0FnSUNsY2JseHVJQ0FnSUhCaGNuTmxjaTVoWkdSZllYSm5kVzFsYm5Rb1hHNGdJQ0FnSUNBZ0lGd2ljM1Z3WlhKelpYUmZjbTl2ZEZ3aUxGeHVJQ0FnSUNBZ0lDQjBlWEJsUFZCaGRHZ3NYRzRnSUNBZ0lDQWdJR2hsYkhBOVhDSlFZWFJvSUhSdklIUm9aU0JCY0dGamFHVWdVM1Z3WlhKelpYUWdjMjkxY21ObElHTm9aV05yYjNWMFhDSXNYRzRnSUNBZ0tWeHVYRzRnSUNBZ1lYSm5jeUE5SUhCaGNuTmxjaTV3WVhKelpWOWhjbWR6S0NsY2JpQWdJQ0J5YjI5MElEMGdZWEpuY3k1emRYQmxjbk5sZEY5eWIyOTBMbkpsYzI5c2RtVW9LVnh1WEc0Z0lDQWdabkp2Ym5SbGJtUmZjR0YwYUNBOUlISnZiM1FnTHlCR1VrOU9WRVZPUkY5R1NVeEZYRzRnSUNBZ2MyUnJYM0JoZEdnZ1BTQnliMjkwSUM4Z1UwUkxYMFpKVEVWY2JseHVJQ0FnSUcxcGMzTnBibWNnUFNCYlhHNGdJQ0FnSUNBZ0lIQmhkR2hjYmlBZ0lDQWdJQ0FnWm05eUlIQmhkR2dnYVc0Z1cyWnliMjUwWlc1a1gzQmhkR2dzSUhOa2ExOXdZWFJvWFZ4dUlDQWdJQ0FnSUNCcFppQnViM1FnY0dGMGFDNWxlR2x6ZEhNb0tWeHVJQ0FnSUYxY2JseHVJQ0FnSUdsbUlHMXBjM05wYm1jNlhHNGdJQ0FnSUNBZ0lIQnlhVzUwS0Z4dUlDQWdJQ0FnSUNBZ0lDQWdYQ0pVYUdVZ2RHRnlaMlYwSUdSdlpYTWdibTkwSUdGd2NHVmhjaUIwYnlCaVpTQmhJR052YlhCaGRHbGliR1VnWENKY2JpQWdJQ0FnSUNBZ0lDQWdJRndpVTNWd1pYSnpaWFFnYzI5MWNtTmxJR05vWldOcmIzVjBMbHdpTEZ4dUlDQWdJQ0FnSUNBZ0lDQWdabWxzWlQxemVYTXVjM1JrWlhKeUxGeHVJQ0FnSUNBZ0lDQXBYRzVjYmlBZ0lDQWdJQ0FnWm05eUlHMXBjM05wYm1kZmNHRjBhQ0JwYmlCdGFYTnphVzVuT2x4dUlDQWdJQ0FnSUNBZ0lDQWdjSEpwYm5Rb1psd2lUV2x6YzJsdVp6b2dlMjFwYzNOcGJtZGZjR0YwYUgxY0lpd2dabWxzWlQxemVYTXVjM1JrWlhKeUtWeHVYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQXlYRzVjYmlBZ0lDQjBjbms2WEc0Z0lDQWdJQ0FnSUhCaGRHTm9YMlp5YjI1MFpXNWtLR1p5YjI1MFpXNWtYM0JoZEdncFhHNGdJQ0FnSUNBZ0lIQmhkR05vWDNOa2F5aHpaR3RmY0dGMGFDbGNiaUFnSUNCbGVHTmxjSFFnVUdGMFkyaEZjbkp2Y2lCaGN5Qmxjbkp2Y2pwY2JpQWdJQ0FnSUNBZ2NISnBiblFvWmx3aVVHRjBZMmdnWm1GcGJHVmtPaUI3WlhKeWIzSjlYQ0lzSUdacGJHVTljM2x6TG5OMFpHVnljaWxjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJREZjYmx4dUlDQWdJSEJ5YVc1MEtGd2lVR0YwWTJnZ1kyOXRjR3hsZEdWa0lITjFZMk5sYzNObWRXeHNlUzVjSWlsY2JpQWdJQ0J5WlhSMWNtNGdNRnh1WEc1Y2JtbG1JRjlmYm1GdFpWOWZJRDA5SUZ3aVgxOXRZV2x1WDE5Y0lqcGNiaUFnSUNCeVlXbHpaU0JUZVhOMFpXMUZlR2wwS0cxaGFXNG9LU2xjYm1BN1hHNWNibU52Ym5OMElGWkZVa2xHV1Y5UVFWUkRTRjlUU0NBOUlHQWpJUzkxYzNJdlltbHVMMlZ1ZGlCaVlYTm9YRzVjYm5ObGRDQXRaWFZ2SUhCcGNHVm1ZV2xzWEc1Y2JsTlZVRVZTVTBWVVgxSlBUMVE5WEZ3a2V6RTZQMVZ6WVdkbE9pQjJaWEpwWm5sZmNHRjBZMmd1YzJnZ0wzQmhkR2d2ZEc4dmMzVndaWEp6WlhSOVhHNWNia1pTVDA1VVJVNUVYMFpKVEVVOVhDSWtVMVZRUlZKVFJWUmZVazlQVkM5emRYQmxjbk5sZEMxbWNtOXVkR1Z1WkM5emNtTXZaVzFpWldSa1pXUXZhVzVrWlhndWRITjRYQ0pjYmxORVMxOUdTVXhGUFZ3aUpGTlZVRVZTVTBWVVgxSlBUMVF2YzNWd1pYSnpaWFF0WlcxaVpXUmtaV1F0YzJSckwzTnlZeTlwYm1SbGVDNTBjMXdpWEc1Y2JuUmxjM1FnTFdZZ1hDSWtSbEpQVGxSRlRrUmZSa2xNUlZ3aVhHNTBaWE4wSUMxbUlGd2lKRk5FUzE5R1NVeEZYQ0pjYmx4dVozSmxjQ0F0Y1NCY1hGeGNYRzRnSUZ3aVUxVlFSVkpUUlZSZlUxZEpWRU5JUVVKTVJWOUZUVUpGUkY5UVFWUkRTRndpSUZ4Y1hGeGNiaUFnWENJa1JsSlBUbFJGVGtSZlJrbE1SVndpWEc1Y2JtZHlaWEFnTFhFZ1hGeGNYRnh1SUNCY0lpZHpkMmwwWTJoRVlYTm9ZbTloY21RblhDSWdYRnhjWEZ4dUlDQmNJaVJHVWs5T1ZFVk9SRjlHU1V4RlhDSmNibHh1WjNKbGNDQXRjU0JjWEZ4Y1hHNGdJRndpWkdGemFHSnZZWEprVTNkcGRHTm9TR0Z1Wkd4bGNsd2lJRnhjWEZ4Y2JpQWdYQ0lrUmxKUFRsUkZUa1JmUmtsTVJWd2lYRzVjYm1keVpYQWdMWEVnWEZ4Y1hGeHVJQ0JjSWxOVlVFVlNVMFZVWDFOWFNWUkRTRUZDVEVWZlJVMUNSVVJmVTBSTFgxQkJWRU5JWENJZ1hGeGNYRnh1SUNCY0lpUlRSRXRmUmtsTVJWd2lYRzVjYm1keVpYQWdMWEVnWEZ4Y1hGeHVJQ0JjSW5OM2FYUmphRVJoYzJoaWIyRnlaRHBjSWlCY1hGeGNYRzRnSUZ3aUpGTkVTMTlHU1V4RlhDSmNibHh1WjNKbGNDQXRjU0JjWEZ4Y1hHNGdJRndpWVdOMGFYWmxSR0Z6YUdKdllYSmtTV1JjSWlCY1hGeGNYRzRnSUZ3aUpGTkVTMTlHU1V4RlhDSmNibHh1WjNKbGNDQXRjU0JjWEZ4Y1hHNGdJRndpWm1WMFkyaEhkV1Z6ZEZSdmEyVnVLRndpSUZ4Y1hGeGNiaUFnWENJa1UwUkxYMFpKVEVWY0lseHVYRzVsWTJodklGd2lWR2hsSUhOM2FYUmphR0ZpYkdVdFpHRnphR0p2WVhKa0lIQmhkR05vSUdseklIQnlaWE5sYm5RdVhDSmNibUE3WEc1Y2JtTnZibk4wSUVKVlNVeEVYMU5FUzE5VFNDQTlJR0FqSVM5MWMzSXZZbWx1TDJWdWRpQmlZWE5vWEc1Y2JuTmxkQ0F0WlhWdklIQnBjR1ZtWVdsc1hHNWNibE5WVUVWU1UwVlVYMUpQVDFROVhGd2tlekU2UDFWellXZGxPaUJpZFdsc1pDMXpaR3N1YzJnZ0wzQmhkR2d2ZEc4dmMzVndaWEp6WlhSOVhHNWNibE5FUzE5U1QwOVVQVndpSkZOVlVFVlNVMFZVWDFKUFQxUXZjM1Z3WlhKelpYUXRaVzFpWldSa1pXUXRjMlJyWENKY2JseHVhV1lnV3lBaElDMW1JRndpSkZORVMxOVNUMDlVTDNCaFkydGhaMlV1YW5OdmJsd2lJRjA3SUhSb1pXNWNiaUFnWldOb2J5QmNJazFwYzNOcGJtY2dVMFJMSUhCaFkydGhaMlU2SUNSVFJFdGZVazlQVkZ3aUlENG1NbHh1SUNCbGVHbDBJREZjYm1acFhHNWNibU5rSUZ3aUpGTkVTMTlTVDA5VVhDSmNibHh1Ym5CdElHTnBYRzVjYm01d2JTQnlkVzRnWW5WcGJHUmNibHh1WldOb2IxeHVaV05vYnlCY0lrVnRZbVZrWkdWa0lGTkVTeUJpZFdsc1pDQmpiMjF3YkdWMFpXUXVYQ0pjYm1WamFHOGdYQ0pQZFhSd2RYUWdaR2x5WldOMGIzSjVPbHdpWEc1bWFXNWtJQzRnWEZ4Y1hGeHVJQ0F0YldGNFpHVndkR2dnTWlCY1hGeGNYRzRnSUMxMGVYQmxJR1FnWEZ4Y1hGeHVJQ0JjWEZ4Y0tDQXRibUZ0WlNCa2FYTjBJQzF2SUMxdVlXMWxJR3hwWWlCY1hGeGNLU0JjWEZ4Y1hHNGdJQzF3Y21sdWRGeHVZRHRjYmx4dVkyOXVjM1FnUWxWSlRFUmZSbEpQVGxSRlRrUmZVMGdnUFNCZ0l5RXZkWE55TDJKcGJpOWxibllnWW1GemFGeHVYRzV6WlhRZ0xXVjFieUJ3YVhCbFptRnBiRnh1WEc1VFZWQkZVbE5GVkY5U1QwOVVQVnhjSkhzeE9qOVZjMkZuWlRvZ1luVnBiR1F0YzNWd1pYSnpaWFF0Wm5KdmJuUmxibVF1YzJnZ0wzQmhkR2d2ZEc4dmMzVndaWEp6WlhSOVhHNWNia1pTVDA1VVJVNUVYMUpQVDFROVhDSWtVMVZRUlZKVFJWUmZVazlQVkM5emRYQmxjbk5sZEMxbWNtOXVkR1Z1WkZ3aVhHNWNibWxtSUZzZ0lTQXRaaUJjSWlSR1VrOU9WRVZPUkY5U1QwOVVMM0JoWTJ0aFoyVXVhbk52Ymx3aUlGMDdJSFJvWlc1Y2JpQWdaV05vYnlCY0lrMXBjM05wYm1jZ1UzVndaWEp6WlhRZ1puSnZiblJsYm1RNklDUkdVazlPVkVWT1JGOVNUMDlVWENJZ1BpWXlYRzRnSUdWNGFYUWdNVnh1Wm1sY2JseHVZMlFnWENJa1JsSlBUbFJGVGtSZlVrOVBWRndpWEc1Y2JtNXdiU0JqYVZ4dVhHNXVjRzBnY25WdUlHSjFhV3hrWEc1Y2JtVmphRzhnWENKVGRYQmxjbk5sZENCbWNtOXVkR1Z1WkNCaWRXbHNaQ0JqYjIxd2JHVjBaV1F1WENKY2JtQTdYRzVjYm1OdmJuTjBJRkJCVkVOSVgwRk9SRjlDVlVsTVJGOVRTQ0E5SUdBaklTOTFjM0l2WW1sdUwyVnVkaUJpWVhOb1hHNWNibk5sZENBdFpYVnZJSEJwY0dWbVlXbHNYRzVjYmxOVlVFVlNVMFZVWDFKUFQxUTlYRndrZXpFNlAxVnpZV2RsT2lCd1lYUmphQzFoYm1RdFluVnBiR1F1YzJnZ0wzQmhkR2d2ZEc4dmMzVndaWEp6WlhSOVhHNWNibE5EVWtsUVZGOUVTVkk5SkNoY2JpQWdZMlFnWENJa0tHUnBjbTVoYldVZ1hDSmNYQ1I3UWtGVFNGOVRUMVZTUTBWYk1GMTlYQ0lwWENKY2JpQWdjSGRrWEc0cFhHNWNibEJTVDBwRlExUmZVazlQVkQwa0tGeHVJQ0JqWkNCY0lpUlRRMUpKVUZSZlJFbFNMeTR1WENKY2JpQWdjSGRrWEc0cFhHNWNibkI1ZEdodmJqTWdYRnhjWEZ4dUlDQmNJaVJRVWs5S1JVTlVYMUpQVDFRdmNHRjBZMmhsY3k5aGNIQnNlVjl6ZFhCbGNuTmxkRjgyWHpGZmNHRjBZMmd1Y0hsY0lpQmNYRnhjWEc0Z0lGd2lKRk5WVUVWU1UwVlVYMUpQVDFSY0lseHVYRzVjSWlSUVVrOUtSVU5VWDFKUFQxUXZjR0YwWTJobGN5OTJaWEpwWm5sZmNHRjBZMmd1YzJoY0lpQmNYRnhjWEc0Z0lGd2lKRk5WVUVWU1UwVlVYMUpQVDFSY0lseHVYRzVjSWlSVFExSkpVRlJmUkVsU0wySjFhV3hrTFhOa2F5NXphRndpSUZ4Y1hGeGNiaUFnWENJa1UxVlFSVkpUUlZSZlVrOVBWRndpWEc1Y2Jsd2lKRk5EVWtsUVZGOUVTVkl2WW5WcGJHUXRjM1Z3WlhKelpYUXRabkp2Ym5SbGJtUXVjMmhjSWlCY1hGeGNYRzRnSUZ3aUpGTlZVRVZTVTBWVVgxSlBUMVJjSWx4dVhHNWxZMmh2WEc1bFkyaHZJRndpVUdGMFkyZ2dZVzVrSUdaeWIyNTBaVzVrSUdKMWFXeGtjeUJqYjIxd2JHVjBaV1F1WENKY2JtQTdYRzVjYm1OdmJuTjBJRUpWU1V4RVgwUlBRMHRGVWw5VFNDQTlJR0FqSVM5MWMzSXZZbWx1TDJWdWRpQmlZWE5vWEc1Y2JuTmxkQ0F0WlhWdklIQnBjR1ZtWVdsc1hHNWNibE5WVUVWU1UwVlVYMUpQVDFROVhGd2tlekU2UDFWellXZGxPaUJpZFdsc1pDMWtiMk5yWlhJdGFXMWhaMlV1YzJnZ0wzQmhkR2d2ZEc4dmMzVndaWEp6WlhRZ1cybHRZV2RsTFhSaFoxMTlYRzVKVFVGSFJWOVVRVWM5WEZ3a2V6STZMV3h2WTJGc0wzTjFjR1Z5YzJWMExYTjNhWFJqYUdGaWJHVTZOaTR4TGpCOVhHNWNibE5EVWtsUVZGOUVTVkk5SkNoY2JpQWdZMlFnWENJa0tHUnBjbTVoYldVZ1hDSmNYQ1I3UWtGVFNGOVRUMVZTUTBWYk1GMTlYQ0lwWENKY2JpQWdjSGRrWEc0cFhHNWNibEJTVDBwRlExUmZVazlQVkQwa0tGeHVJQ0JqWkNCY0lpUlRRMUpKVUZSZlJFbFNMeTR1WENKY2JpQWdjSGRrWEc0cFhHNWNibkI1ZEdodmJqTWdYRnhjWEZ4dUlDQmNJaVJRVWs5S1JVTlVYMUpQVDFRdmNHRjBZMmhsY3k5aGNIQnNlVjl6ZFhCbGNuTmxkRjgyWHpGZmNHRjBZMmd1Y0hsY0lpQmNYRnhjWEc0Z0lGd2lKRk5WVUVWU1UwVlVYMUpQVDFSY0lseHVYRzVjSWlSUVVrOUtSVU5VWDFKUFQxUXZjR0YwWTJobGN5OTJaWEpwWm5sZmNHRjBZMmd1YzJoY0lpQmNYRnhjWEc0Z0lGd2lKRk5WVUVWU1UwVlVYMUpQVDFSY0lseHVYRzVqWkNCY0lpUlRWVkJGVWxORlZGOVNUMDlVWENKY2JseHVaRzlqYTJWeUlHSjFhV3hrSUZ4Y1hGeGNiaUFnTFMxMFlYSm5aWFFnYkdWaGJpQmNYRnhjWEc0Z0lDMHRkR0ZuSUZ3aUpFbE5RVWRGWDFSQlIxd2lJRnhjWEZ4Y2JpQWdMbHh1WEc1bFkyaHZJRndpUW5WcGJIUWdSRzlqYTJWeUlHbHRZV2RsT2lBa1NVMUJSMFZmVkVGSFhDSmNibUE3WEc1Y2JtTnZibk4wSUZKRlFVUk5SU0E5SUdBaklDUjdVMVZRUlZKVFJWUmZVRXhWUjBsT1gwbEVmVnh1WEc1TmRXeDBhUzEwWlc1aGJuUXNJRzl5WnkxaFoyNXZjM1JwWXlCVGRYQmxjbk5sZENCa1lYTm9ZbTloY21RZ1pXMWlaV1FnY0d4MVoybHVJQ2h3WVhSamFDMWhibVF0WW5WcGJHUWdjM1J5WVhSbFoza3BMbHh1WEc1VWFHbHpJR2x6SUc1dmRDQmhJR2RsYm1WeVlYUmxaQ0J3YkhWbmFXNGdiR2xyWlNCMGFHVWdTMmxpWVc1aElIWmhjbWxoYm5RdUlFbHVjM1JsWVdRc0lFUmxZMkZtSUdodmJHUnpYRzV3WVhSamFDQnpZM0pwY0hSeklIUm9ZWFFnYlc5a2FXWjVJRk4xY0dWeWMyVjBKM01nYVc1MFpYSnVZV3dnWlcxaVpXUmtaV1FnWm5KdmJuUmxibVFnWVc1a0lHVnRZbVZrWkdWa1hHNVRSRXNnYzI5MWNtTmxJR1pwYkdWeklIUnZJR0ZrWkNCaElGeGNZSE4zYVhSamFFUmhjMmhpYjJGeVpGeGNZQ0J0WlhSb2IyUXVJRlJvWlNCbGVHbHpkR2x1WnlCcFpuSmhiV1ZjYm1Wc1pXMWxiblFzSUdSdlkzVnRaVzUwTENCamIyNTBaVzUwVjJsdVpHOTNMQ0JTWldGamRDQnlkVzUwYVcxbExDQmhibVFnVTNkcGRHTm9ZbTloY21RZ1RXVnpjMkZuWlVOb1lXNXVaV3hjYm1GeVpTQndjbVZ6WlhKMlpXUWdZV055YjNOeklHUmhjMmhpYjJGeVpDQnpkMmwwWTJobGN5NWNibHh1SXlNZ1YyaGhkQ0JwZENCd1lYUmphR1Z6WEc1Y2JpMGdYRnhnYzNWd1pYSnpaWFF0Wm5KdmJuUmxibVF2YzNKakwyVnRZbVZrWkdWa0wybHVaR1Y0TG5SemVGeGNZQ0RpZ0pRZ1lXUmtjeUJjWEdCemQybDBZMmhFWVhOb1ltOWhjbVJjWEdBZ2RHOGdkR2hsWEc0Z0lGTjNhWFJqYUdKdllYSmtJR05vWVc1dVpXdzdJSEpsY0d4aFkyVnpJRzl1YkhrZ1hGeGdSR0Z6YUdKdllYSmtVR0ZuWlZ4Y1lDNWNiaTBnWEZ4Z2MzVndaWEp6WlhRdFpXMWlaV1JrWldRdGMyUnJMM055WXk5cGJtUmxlQzUwYzF4Y1lDRGlnSlFnWVdSa2MxeHVJQ0JjWEdCbGJXSmxaR1JsWkVSaGMyaGliMkZ5WkM1emQybDBZMmhFWVhOb1ltOWhjbVFvWkdGemFHSnZZWEprU1dRcFhGeGdPeUJ5WlhGMVpYTjBjeUJoSUdkMVpYTjBJSFJ2YTJWdUlHWnZjbHh1SUNCMGFHVWdjMlZzWldOMFpXUWdaR0Z6YUdKdllYSmtPeUJ5WldaeVpYTm9aWE1nWm5WMGRYSmxJR2QxWlhOMElIUnZhMlZ1Y3lCbWIzSWdkR2hsSUdGamRHbDJaU0JrWVhOb1ltOWhjbVF1WEc1Y2JpTWpJRUoxYVd4a1hHNWNibHhjWUZ4Y1lGeGNZR0poYzJoY2JpTWdRWEJ3YkhrZ2NHRjBZMmdnS3lCMlpYSnBabmtnS3lCaWRXbHNaQ0JUUkVzZ0t5QmlkV2xzWkNCbWNtOXVkR1Z1WkZ4dVluVnBiR1F2Y0dGMFkyZ3RZVzVrTFdKMWFXeGtMbk5vSUM5d1lYUm9MM1J2TDNOMWNHVnljMlYwWEc1Y2JpTWdUM0lnWW5WcGJHUWdZU0JFYjJOclpYSWdhVzFoWjJWY2JtSjFhV3hrTDJKMWFXeGtMV1J2WTJ0bGNpMXBiV0ZuWlM1emFDQXZjR0YwYUM5MGJ5OXpkWEJsY25ObGRDQnlaV2RwYzNSeWVTNWxlR0Z0Y0d4bExtTnZiUzl6ZFhCbGNuTmxkQzF6ZDJsMFkyaGhZbXhsT2pZdU1TNHdYRzVjWEdCY1hHQmNYR0JjYmx4dVZHaGxJSEJoZEdOb1pXUWdVMFJMSUcxMWMzUWdZbVVnY0dGamEyVmtJR0Z1WkNCcGJuTjBZV3hzWldRZ2FXNTBieUIwYUdVZ1FXNW5kV3hoY2lCaGNIQnNhV05oZEdsdmJqcGNibHh1WEZ4Z1hGeGdYRnhnWW1GemFGeHVZMlFnTDNCaGRHZ3ZkRzh2YzNWd1pYSnpaWFF2YzNWd1pYSnpaWFF0WlcxaVpXUmtaV1F0YzJSclhHNXVjRzBnWTJrZ0ppWWdibkJ0SUhKMWJpQmlkV2xzWkNBbUppQnVjRzBnY0dGamExeHVZMlFnTDNCaGRHZ3ZkRzh2WVc1bmRXeGhjaTFoY0hCY2JtNXdiU0JwYm5OMFlXeHNJQzl3WVhSb0wzUnZMM04xY0dWeWMyVjBMM04xY0dWeWMyVjBMV1Z0WW1Wa1pHVmtMWE5rYXk5emRYQmxjbk5sZEMxMWFTMWxiV0psWkdSbFpDMXpaR3N0S2k1MFozcGNibHhjWUZ4Y1lGeGNZRnh1WEc1V1pYSnphVzl1T2lBa2UxTlZVRVZTVTBWVVgxQk1WVWRKVGw5V1JWSlRTVTlPZlZ4dVlEdGNibHh1THlvcVhHNGdLaUJTWlhSMWNtNXpJSFJvWlNCbWRXeHNJSE5sZENCdlppQndZWFJqYUNCaGJtUWdZblZwYkdRZ2MyTnlhWEIwSUdacGJHVnpMbHh1SUNvdlhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z2MzVndaWEp6WlhSUVlYUmphRVpwYkdWektDazZJRk4xY0dWeWMyVjBVR0YwWTJoR2FXeGxXMTBnZTF4dUlDQnlaWFIxY200Z1cxeHVJQ0FnSUhzZ2NHRjBhRG9nWENKd1lYUmphR1Z6TDJGd2NHeDVYM04xY0dWeWMyVjBYelpmTVY5d1lYUmphQzV3ZVZ3aUxDQmpiMjUwWlc1ME9pQkJVRkJNV1Y5UVFWUkRTRjlRV1N3Z1pYaGxZM1YwWVdKc1pUb2dkSEoxWlNCOUxGeHVJQ0FnSUhzZ2NHRjBhRG9nWENKd1lYUmphR1Z6TDNabGNtbG1lVjl3WVhSamFDNXphRndpTENCamIyNTBaVzUwT2lCV1JWSkpSbGxmVUVGVVEwaGZVMGdzSUdWNFpXTjFkR0ZpYkdVNklIUnlkV1VnZlN4Y2JpQWdJQ0I3SUhCaGRHZzZJRndpWW5WcGJHUXZZblZwYkdRdGMyUnJMbk5vWENJc0lHTnZiblJsYm5RNklFSlZTVXhFWDFORVMxOVRTQ3dnWlhobFkzVjBZV0pzWlRvZ2RISjFaU0I5TEZ4dUlDQWdJSHNnY0dGMGFEb2dYQ0ppZFdsc1pDOWlkV2xzWkMxemRYQmxjbk5sZEMxbWNtOXVkR1Z1WkM1emFGd2lMQ0JqYjI1MFpXNTBPaUJDVlVsTVJGOUdVazlPVkVWT1JGOVRTQ3dnWlhobFkzVjBZV0pzWlRvZ2RISjFaU0I5TEZ4dUlDQWdJSHNnY0dGMGFEb2dYQ0ppZFdsc1pDOXdZWFJqYUMxaGJtUXRZblZwYkdRdWMyaGNJaXdnWTI5dWRHVnVkRG9nVUVGVVEwaGZRVTVFWDBKVlNVeEVYMU5JTENCbGVHVmpkWFJoWW14bE9pQjBjblZsSUgwc1hHNGdJQ0FnZXlCd1lYUm9PaUJjSW1KMWFXeGtMMkoxYVd4a0xXUnZZMnRsY2kxcGJXRm5aUzV6YUZ3aUxDQmpiMjUwWlc1ME9pQkNWVWxNUkY5RVQwTkxSVkpmVTBnc0lHVjRaV04xZEdGaWJHVTZJSFJ5ZFdVZ2ZTeGNiaUFnSUNCN0lIQmhkR2c2SUZ3aVVrVkJSRTFGTG0xa1hDSXNJR052Ym5SbGJuUTZJRkpGUVVSTlJTQjlMRnh1SUNCZE8xeHVmVnh1SWwxOSJdfQ==