@aerokit/sdk 12.44.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.
- package/LICENSE +277 -0
- package/README.md +170 -0
- package/dist/cjs/bpm/deployer.js +57 -0
- package/dist/cjs/bpm/index.js +35 -0
- package/dist/cjs/bpm/process.js +636 -0
- package/dist/cjs/bpm/tasks.js +973 -0
- package/dist/cjs/bpm/values.js +82 -0
- package/dist/cjs/cache/cache.js +64 -0
- package/dist/cjs/cache/index.js +26 -0
- package/dist/cjs/cms/cmis.js +689 -0
- package/dist/cjs/cms/index.js +26 -0
- package/dist/cjs/component/decorators.js +126 -0
- package/dist/cjs/component/index.js +36 -0
- package/dist/cjs/core/configurations.js +110 -0
- package/dist/cjs/core/context.js +47 -0
- package/dist/cjs/core/env.js +45 -0
- package/dist/cjs/core/globals.js +54 -0
- package/dist/cjs/core/index.js +35 -0
- package/dist/cjs/db/dao.js +795 -0
- package/dist/cjs/db/database.js +904 -0
- package/dist/cjs/db/decorators.js +167 -0
- package/dist/cjs/db/index.js +72 -0
- package/dist/cjs/db/insert.js +51 -0
- package/dist/cjs/db/orm.js +245 -0
- package/dist/cjs/db/ormstatements.js +243 -0
- package/dist/cjs/db/procedure.js +112 -0
- package/dist/cjs/db/query.js +57 -0
- package/dist/cjs/db/repository.js +148 -0
- package/dist/cjs/db/sequence.js +59 -0
- package/dist/cjs/db/sql.js +516 -0
- package/dist/cjs/db/store.js +172 -0
- package/dist/cjs/db/translator.js +100 -0
- package/dist/cjs/db/update.js +43 -0
- package/dist/cjs/etcd/client.js +174 -0
- package/dist/cjs/etcd/index.js +26 -0
- package/dist/cjs/extensions/decorators.js +40 -0
- package/dist/cjs/extensions/extensions.js +108 -0
- package/dist/cjs/extensions/index.js +39 -0
- package/dist/cjs/git/client.js +277 -0
- package/dist/cjs/git/index.js +26 -0
- package/dist/cjs/http/client-async.js +224 -0
- package/dist/cjs/http/client.js +145 -0
- package/dist/cjs/http/decorators.js +76 -0
- package/dist/cjs/http/errors/ForbiddenError.js +41 -0
- package/dist/cjs/http/errors/ValidationError.js +41 -0
- package/dist/cjs/http/errors.js +26 -0
- package/dist/cjs/http/index.js +59 -0
- package/dist/cjs/http/request.js +281 -0
- package/dist/cjs/http/response.js +452 -0
- package/dist/cjs/http/rs/resource-common.js +32 -0
- package/dist/cjs/http/rs/resource-http-controller.js +306 -0
- package/dist/cjs/http/rs/resource-mappings.js +130 -0
- package/dist/cjs/http/rs/resource-method.js +218 -0
- package/dist/cjs/http/rs/resource.js +232 -0
- package/dist/cjs/http/rs.js +31 -0
- package/dist/cjs/http/session.js +124 -0
- package/dist/cjs/http/upload.js +144 -0
- package/dist/cjs/http/utils.js +106 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/indexing/index.js +29 -0
- package/dist/cjs/indexing/searcher.js +70 -0
- package/dist/cjs/indexing/writer.js +45 -0
- package/dist/cjs/integrations/index.js +26 -0
- package/dist/cjs/integrations/integrations.js +55 -0
- package/dist/cjs/io/bytes.js +101 -0
- package/dist/cjs/io/files.js +344 -0
- package/dist/cjs/io/image.js +43 -0
- package/dist/cjs/io/index.js +38 -0
- package/dist/cjs/io/streams.js +243 -0
- package/dist/cjs/io/zip.js +251 -0
- package/dist/cjs/job/decorators.js +40 -0
- package/dist/cjs/job/index.js +39 -0
- package/dist/cjs/job/scheduler.js +347 -0
- package/dist/cjs/junit/index.js +18 -0
- package/dist/cjs/junit/junit.js +67 -0
- package/dist/cjs/kafka/consumer.js +70 -0
- package/dist/cjs/kafka/index.js +29 -0
- package/dist/cjs/kafka/producer.js +70 -0
- package/dist/cjs/log/index.js +26 -0
- package/dist/cjs/log/logging.js +174 -0
- package/dist/cjs/mail/client.js +153 -0
- package/dist/cjs/mail/index.js +26 -0
- package/dist/cjs/messaging/consumer.js +83 -0
- package/dist/cjs/messaging/decorators.js +40 -0
- package/dist/cjs/messaging/index.js +42 -0
- package/dist/cjs/messaging/producer.js +81 -0
- package/dist/cjs/mongodb/client.js +627 -0
- package/dist/cjs/mongodb/dao.js +390 -0
- package/dist/cjs/mongodb/index.js +36 -0
- package/dist/cjs/net/decorators.js +40 -0
- package/dist/cjs/net/index.js +42 -0
- package/dist/cjs/net/soap.js +228 -0
- package/dist/cjs/net/websockets.js +151 -0
- package/dist/cjs/net/wrappers/onClose.js +2 -0
- package/dist/cjs/net/wrappers/onError.js +2 -0
- package/dist/cjs/net/wrappers/onMessage.js +2 -0
- package/dist/cjs/net/wrappers/onOpen.js +2 -0
- package/dist/cjs/pdf/index.js +26 -0
- package/dist/cjs/pdf/pdf.js +160 -0
- package/dist/cjs/platform/command.js +47 -0
- package/dist/cjs/platform/engines.js +70 -0
- package/dist/cjs/platform/index.js +47 -0
- package/dist/cjs/platform/lifecycle.js +49 -0
- package/dist/cjs/platform/os.js +51 -0
- package/dist/cjs/platform/problems.js +127 -0
- package/dist/cjs/platform/registry.js +319 -0
- package/dist/cjs/platform/repository.js +498 -0
- package/dist/cjs/platform/workspace.js +574 -0
- package/dist/cjs/qldb/index.js +26 -0
- package/dist/cjs/qldb/qldb.js +24 -0
- package/dist/cjs/rabbitmq/consumer.js +50 -0
- package/dist/cjs/rabbitmq/index.js +29 -0
- package/dist/cjs/rabbitmq/producer.js +38 -0
- package/dist/cjs/redis/client.js +190 -0
- package/dist/cjs/redis/index.js +26 -0
- package/dist/cjs/security/decorators.js +48 -0
- package/dist/cjs/security/index.js +40 -0
- package/dist/cjs/security/oauth.js +75 -0
- package/dist/cjs/security/user.js +88 -0
- package/dist/cjs/template/engines.js +139 -0
- package/dist/cjs/template/index.js +26 -0
- package/dist/cjs/utils/alphanumeric.js +107 -0
- package/dist/cjs/utils/base64.js +104 -0
- package/dist/cjs/utils/converter.js +78 -0
- package/dist/cjs/utils/digest.js +167 -0
- package/dist/cjs/utils/escape.js +160 -0
- package/dist/cjs/utils/hex.js +104 -0
- package/dist/cjs/utils/index.js +68 -0
- package/dist/cjs/utils/jsonpath.js +489 -0
- package/dist/cjs/utils/qrcode.js +41 -0
- package/dist/cjs/utils/url.js +82 -0
- package/dist/cjs/utils/utf8.js +61 -0
- package/dist/cjs/utils/uuid.js +48 -0
- package/dist/cjs/utils/xml.js +57 -0
- package/dist/dts/bpm/deployer.d.ts +29 -0
- package/dist/dts/bpm/index.d.ts +8 -0
- package/dist/dts/bpm/process.d.ts +433 -0
- package/dist/dts/bpm/tasks.d.ts +2022 -0
- package/dist/dts/bpm/values.d.ts +38 -0
- package/dist/dts/cache/cache.d.ts +30 -0
- package/dist/dts/cache/index.d.ts +2 -0
- package/dist/dts/cms/cmis.d.ts +413 -0
- package/dist/dts/cms/index.d.ts +2 -0
- package/dist/dts/component/decorators.d.ts +52 -0
- package/dist/dts/component/index.d.ts +2 -0
- package/dist/dts/core/configurations.d.ts +65 -0
- package/dist/dts/core/context.d.ts +19 -0
- package/dist/dts/core/env.d.ts +23 -0
- package/dist/dts/core/globals.d.ts +30 -0
- package/dist/dts/core/index.d.ts +8 -0
- package/dist/dts/db/dao.d.ts +8 -0
- package/dist/dts/db/database.d.ts +507 -0
- package/dist/dts/db/decorators.d.ts +89 -0
- package/dist/dts/db/index.d.ts +25 -0
- package/dist/dts/db/insert.d.ts +32 -0
- package/dist/dts/db/orm.d.ts +44 -0
- package/dist/dts/db/ormstatements.d.ts +4 -0
- package/dist/dts/db/procedure.d.ts +25 -0
- package/dist/dts/db/query.d.ts +48 -0
- package/dist/dts/db/repository.d.ts +64 -0
- package/dist/dts/db/sequence.d.ts +34 -0
- package/dist/dts/db/sql.d.ts +267 -0
- package/dist/dts/db/store.d.ts +138 -0
- package/dist/dts/db/translator.d.ts +26 -0
- package/dist/dts/db/update.d.ts +21 -0
- package/dist/dts/etcd/client.d.ts +92 -0
- package/dist/dts/etcd/index.d.ts +2 -0
- package/dist/dts/extensions/decorators.d.ts +11 -0
- package/dist/dts/extensions/extensions.d.ts +41 -0
- package/dist/dts/extensions/index.d.ts +4 -0
- package/dist/dts/git/client.d.ts +478 -0
- package/dist/dts/git/index.d.ts +2 -0
- package/dist/dts/http/client-async.d.ts +158 -0
- package/dist/dts/http/client.d.ts +180 -0
- package/dist/dts/http/decorators.d.ts +11 -0
- package/dist/dts/http/errors/ForbiddenError.d.ts +20 -0
- package/dist/dts/http/errors/ValidationError.d.ts +20 -0
- package/dist/dts/http/errors.d.ts +2 -0
- package/dist/dts/http/index.d.ts +16 -0
- package/dist/dts/http/request.d.ts +158 -0
- package/dist/dts/http/response.d.ts +281 -0
- package/dist/dts/http/rs/resource-common.d.ts +11 -0
- package/dist/dts/http/rs/resource-http-controller.d.ts +43 -0
- package/dist/dts/http/rs/resource-mappings.d.ts +70 -0
- package/dist/dts/http/rs/resource-method.d.ts +206 -0
- package/dist/dts/http/rs/resource.d.ts +126 -0
- package/dist/dts/http/rs.d.ts +4 -0
- package/dist/dts/http/session.d.ts +81 -0
- package/dist/dts/http/upload.d.ts +100 -0
- package/dist/dts/http/utils.d.ts +54 -0
- package/dist/dts/index.d.ts +0 -0
- package/dist/dts/indexing/index.d.ts +4 -0
- package/dist/dts/indexing/searcher.d.ts +47 -0
- package/dist/dts/indexing/writer.d.ts +22 -0
- package/dist/dts/integrations/index.d.ts +2 -0
- package/dist/dts/integrations/integrations.d.ts +118 -0
- package/dist/dts/io/bytes.d.ts +56 -0
- package/dist/dts/io/files.d.ts +261 -0
- package/dist/dts/io/image.d.ts +22 -0
- package/dist/dts/io/index.d.ts +10 -0
- package/dist/dts/io/streams.d.ts +172 -0
- package/dist/dts/io/zip.d.ts +178 -0
- package/dist/dts/job/decorators.d.ts +11 -0
- package/dist/dts/job/index.d.ts +4 -0
- package/dist/dts/job/scheduler.d.ts +250 -0
- package/dist/dts/junit/index.d.ts +1 -0
- package/dist/dts/junit/junit.d.ts +50 -0
- package/dist/dts/kafka/consumer.d.ts +48 -0
- package/dist/dts/kafka/index.d.ts +4 -0
- package/dist/dts/kafka/producer.d.ts +50 -0
- package/dist/dts/log/index.d.ts +2 -0
- package/dist/dts/log/logging.d.ts +102 -0
- package/dist/dts/mail/client.d.ts +90 -0
- package/dist/dts/mail/index.d.ts +2 -0
- package/dist/dts/messaging/consumer.d.ts +61 -0
- package/dist/dts/messaging/decorators.d.ts +11 -0
- package/dist/dts/messaging/index.d.ts +6 -0
- package/dist/dts/messaging/producer.d.ts +59 -0
- package/dist/dts/mongodb/client.d.ts +367 -0
- package/dist/dts/mongodb/dao.d.ts +24 -0
- package/dist/dts/mongodb/index.d.ts +2 -0
- package/dist/dts/net/decorators.d.ts +11 -0
- package/dist/dts/net/index.d.ts +6 -0
- package/dist/dts/net/soap.d.ts +115 -0
- package/dist/dts/net/websockets.d.ts +100 -0
- package/dist/dts/net/wrappers/onClose.d.ts +0 -0
- package/dist/dts/net/wrappers/onError.d.ts +0 -0
- package/dist/dts/net/wrappers/onMessage.d.ts +0 -0
- package/dist/dts/net/wrappers/onOpen.d.ts +0 -0
- package/dist/dts/pdf/index.d.ts +2 -0
- package/dist/dts/pdf/pdf.d.ts +72 -0
- package/dist/dts/platform/command.d.ts +41 -0
- package/dist/dts/platform/engines.d.ts +35 -0
- package/dist/dts/platform/index.d.ts +16 -0
- package/dist/dts/platform/lifecycle.d.ts +22 -0
- package/dist/dts/platform/os.d.ts +23 -0
- package/dist/dts/platform/problems.d.ts +114 -0
- package/dist/dts/platform/registry.d.ts +227 -0
- package/dist/dts/platform/repository.d.ts +354 -0
- package/dist/dts/platform/workspace.d.ts +421 -0
- package/dist/dts/qldb/index.d.ts +2 -0
- package/dist/dts/qldb/qldb.d.ts +1 -0
- package/dist/dts/rabbitmq/consumer.d.ts +25 -0
- package/dist/dts/rabbitmq/index.d.ts +4 -0
- package/dist/dts/rabbitmq/producer.d.ts +15 -0
- package/dist/dts/redis/client.d.ts +134 -0
- package/dist/dts/redis/index.d.ts +2 -0
- package/dist/dts/security/decorators.d.ts +4 -0
- package/dist/dts/security/index.d.ts +5 -0
- package/dist/dts/security/oauth.d.ts +39 -0
- package/dist/dts/security/user.d.ts +51 -0
- package/dist/dts/template/engines.d.ts +98 -0
- package/dist/dts/template/index.d.ts +2 -0
- package/dist/dts/utils/alphanumeric.d.ts +39 -0
- package/dist/dts/utils/base64.d.ts +48 -0
- package/dist/dts/utils/converter.d.ts +44 -0
- package/dist/dts/utils/digest.d.ts +50 -0
- package/dist/dts/utils/escape.d.ts +110 -0
- package/dist/dts/utils/hex.d.ts +48 -0
- package/dist/dts/utils/index.d.ts +23 -0
- package/dist/dts/utils/jsonpath.d.ts +22 -0
- package/dist/dts/utils/qrcode.d.ts +16 -0
- package/dist/dts/utils/url.d.ts +50 -0
- package/dist/dts/utils/utf8.d.ts +33 -0
- package/dist/dts/utils/uuid.d.ts +21 -0
- package/dist/dts/utils/xml.d.ts +22 -0
- package/dist/esm/bpm/deployer.mjs +38 -0
- package/dist/esm/bpm/index.mjs +15 -0
- package/dist/esm/bpm/process.mjs +617 -0
- package/dist/esm/bpm/tasks.mjs +954 -0
- package/dist/esm/bpm/values.mjs +63 -0
- package/dist/esm/cache/cache.mjs +45 -0
- package/dist/esm/cache/index.mjs +6 -0
- package/dist/esm/cms/cmis.mjs +660 -0
- package/dist/esm/cms/index.mjs +6 -0
- package/dist/esm/component/decorators.mjs +107 -0
- package/dist/esm/component/index.mjs +6 -0
- package/dist/esm/core/configurations.mjs +91 -0
- package/dist/esm/core/context.mjs +28 -0
- package/dist/esm/core/env.mjs +26 -0
- package/dist/esm/core/globals.mjs +35 -0
- package/dist/esm/core/index.mjs +15 -0
- package/dist/esm/db/dao.mjs +775 -0
- package/dist/esm/db/database.mjs +885 -0
- package/dist/esm/db/decorators.mjs +148 -0
- package/dist/esm/db/index.mjs +42 -0
- package/dist/esm/db/insert.mjs +32 -0
- package/dist/esm/db/orm.mjs +225 -0
- package/dist/esm/db/ormstatements.mjs +223 -0
- package/dist/esm/db/procedure.mjs +93 -0
- package/dist/esm/db/query.mjs +38 -0
- package/dist/esm/db/repository.mjs +129 -0
- package/dist/esm/db/sequence.mjs +40 -0
- package/dist/esm/db/sql.mjs +497 -0
- package/dist/esm/db/store.mjs +153 -0
- package/dist/esm/db/translator.mjs +81 -0
- package/dist/esm/db/update.mjs +24 -0
- package/dist/esm/etcd/client.mjs +155 -0
- package/dist/esm/etcd/index.mjs +6 -0
- package/dist/esm/extensions/decorators.mjs +21 -0
- package/dist/esm/extensions/extensions.mjs +89 -0
- package/dist/esm/extensions/index.mjs +9 -0
- package/dist/esm/git/client.mjs +258 -0
- package/dist/esm/git/index.mjs +6 -0
- package/dist/esm/http/client-async.mjs +205 -0
- package/dist/esm/http/client.mjs +126 -0
- package/dist/esm/http/decorators.mjs +47 -0
- package/dist/esm/http/errors/ForbiddenError.mjs +22 -0
- package/dist/esm/http/errors/ValidationError.mjs +22 -0
- package/dist/esm/http/errors.mjs +7 -0
- package/dist/esm/http/index.mjs +29 -0
- package/dist/esm/http/request.mjs +262 -0
- package/dist/esm/http/response.mjs +433 -0
- package/dist/esm/http/rs/resource-common.mjs +13 -0
- package/dist/esm/http/rs/resource-http-controller.mjs +287 -0
- package/dist/esm/http/rs/resource-mappings.mjs +111 -0
- package/dist/esm/http/rs/resource-method.mjs +199 -0
- package/dist/esm/http/rs/resource.mjs +213 -0
- package/dist/esm/http/rs.mjs +12 -0
- package/dist/esm/http/session.mjs +105 -0
- package/dist/esm/http/upload.mjs +125 -0
- package/dist/esm/http/utils.mjs +87 -0
- package/dist/esm/index.mjs +1 -0
- package/dist/esm/indexing/index.mjs +9 -0
- package/dist/esm/indexing/searcher.mjs +51 -0
- package/dist/esm/indexing/writer.mjs +26 -0
- package/dist/esm/integrations/index.mjs +6 -0
- package/dist/esm/integrations/integrations.mjs +36 -0
- package/dist/esm/io/bytes.mjs +82 -0
- package/dist/esm/io/files.mjs +325 -0
- package/dist/esm/io/image.mjs +24 -0
- package/dist/esm/io/index.mjs +18 -0
- package/dist/esm/io/streams.mjs +224 -0
- package/dist/esm/io/zip.mjs +232 -0
- package/dist/esm/job/decorators.mjs +21 -0
- package/dist/esm/job/index.mjs +9 -0
- package/dist/esm/job/scheduler.mjs +328 -0
- package/dist/esm/junit/index.mjs +2 -0
- package/dist/esm/junit/junit.mjs +48 -0
- package/dist/esm/kafka/consumer.mjs +51 -0
- package/dist/esm/kafka/index.mjs +9 -0
- package/dist/esm/kafka/producer.mjs +51 -0
- package/dist/esm/log/index.mjs +6 -0
- package/dist/esm/log/logging.mjs +155 -0
- package/dist/esm/mail/client.mjs +134 -0
- package/dist/esm/mail/index.mjs +6 -0
- package/dist/esm/messaging/consumer.mjs +64 -0
- package/dist/esm/messaging/decorators.mjs +21 -0
- package/dist/esm/messaging/index.mjs +12 -0
- package/dist/esm/messaging/producer.mjs +62 -0
- package/dist/esm/mongodb/client.mjs +608 -0
- package/dist/esm/mongodb/dao.mjs +360 -0
- package/dist/esm/mongodb/index.mjs +7 -0
- package/dist/esm/net/decorators.mjs +21 -0
- package/dist/esm/net/index.mjs +12 -0
- package/dist/esm/net/soap.mjs +209 -0
- package/dist/esm/net/websockets.mjs +132 -0
- package/dist/esm/net/wrappers/onClose.mjs +2 -0
- package/dist/esm/net/wrappers/onError.mjs +2 -0
- package/dist/esm/net/wrappers/onMessage.mjs +2 -0
- package/dist/esm/net/wrappers/onOpen.mjs +2 -0
- package/dist/esm/pdf/index.mjs +6 -0
- package/dist/esm/pdf/pdf.mjs +141 -0
- package/dist/esm/platform/command.mjs +28 -0
- package/dist/esm/platform/engines.mjs +51 -0
- package/dist/esm/platform/index.mjs +27 -0
- package/dist/esm/platform/lifecycle.mjs +30 -0
- package/dist/esm/platform/os.mjs +32 -0
- package/dist/esm/platform/problems.mjs +108 -0
- package/dist/esm/platform/registry.mjs +300 -0
- package/dist/esm/platform/repository.mjs +479 -0
- package/dist/esm/platform/workspace.mjs +555 -0
- package/dist/esm/qldb/index.mjs +6 -0
- package/dist/esm/qldb/qldb.mjs +5 -0
- package/dist/esm/rabbitmq/consumer.mjs +31 -0
- package/dist/esm/rabbitmq/index.mjs +9 -0
- package/dist/esm/rabbitmq/producer.mjs +19 -0
- package/dist/esm/redis/client.mjs +171 -0
- package/dist/esm/redis/index.mjs +6 -0
- package/dist/esm/security/decorators.mjs +29 -0
- package/dist/esm/security/index.mjs +10 -0
- package/dist/esm/security/oauth.mjs +56 -0
- package/dist/esm/security/user.mjs +69 -0
- package/dist/esm/template/engines.mjs +120 -0
- package/dist/esm/template/index.mjs +6 -0
- package/dist/esm/utils/alphanumeric.mjs +88 -0
- package/dist/esm/utils/base64.mjs +85 -0
- package/dist/esm/utils/converter.mjs +59 -0
- package/dist/esm/utils/digest.mjs +148 -0
- package/dist/esm/utils/escape.mjs +141 -0
- package/dist/esm/utils/hex.mjs +85 -0
- package/dist/esm/utils/index.mjs +38 -0
- package/dist/esm/utils/jsonpath.mjs +470 -0
- package/dist/esm/utils/qrcode.mjs +22 -0
- package/dist/esm/utils/url.mjs +63 -0
- package/dist/esm/utils/utf8.mjs +42 -0
- package/dist/esm/utils/uuid.mjs +29 -0
- package/dist/esm/utils/xml.mjs +38 -0
- package/package.json +58 -0
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { globals } from "@aerokit/sdk/core";
|
|
2
|
+
import { Client } from "./client";
|
|
3
|
+
import * as dirigibleOrm from "@aerokit/sdk/db/orm";
|
|
4
|
+
import { Logging } from "@aerokit/sdk/log";
|
|
5
|
+
import { Configurations } from "@aerokit/sdk/core";
|
|
6
|
+
const dbUri = Configurations.get("DIRIGIBLE_MONGODB_CLIENT_URI", "mongodb://localhost:27017");
|
|
7
|
+
const mongoClient = new Client(dbUri, null, null);
|
|
8
|
+
const db = mongoClient.getDB();
|
|
9
|
+
class DAO {
|
|
10
|
+
constructor(orm, logCtxName = "mongodb.dao") {
|
|
11
|
+
this.orm = dirigibleOrm.get(orm);
|
|
12
|
+
let loggerName = logCtxName;
|
|
13
|
+
if (this.orm.table) {
|
|
14
|
+
loggerName = "mongodb.dao." + this.orm.table.toLowerCase();
|
|
15
|
+
}
|
|
16
|
+
this.$log = Logging.getLogger(loggerName);
|
|
17
|
+
}
|
|
18
|
+
notify(event, ...a) {
|
|
19
|
+
var func = this[event];
|
|
20
|
+
if (!this[event])
|
|
21
|
+
return;
|
|
22
|
+
if (typeof func !== "function")
|
|
23
|
+
throw Error("Illegal argument. Not a function: " + func);
|
|
24
|
+
var args = [].slice.call(arguments);
|
|
25
|
+
func.apply(this, args.slice(1));
|
|
26
|
+
}
|
|
27
|
+
//Prepare a JSON object for insert into DB
|
|
28
|
+
createNoSQLEntity(entity) {
|
|
29
|
+
var persistentItem = {};
|
|
30
|
+
var mandatories = this.orm.getMandatoryProperties();
|
|
31
|
+
for (var i = 0; i < mandatories.length; i++) {
|
|
32
|
+
if (mandatories[i].dbValue) {
|
|
33
|
+
persistentItem[mandatories[i].name] = mandatories[i].dbValue.apply(this, [entity[mandatories[i].name], entity]);
|
|
34
|
+
} else {
|
|
35
|
+
persistentItem[mandatories[i].name] = entity[mandatories[i].name];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
var optionals = this.orm.getOptionalProperties();
|
|
39
|
+
for (var i = 0; i < optionals.length; i++) {
|
|
40
|
+
if (optionals[i].dbValue !== void 0) {
|
|
41
|
+
persistentItem[optionals[i].name] = optionals[i].dbValue.apply(this, [entity[optionals[i].name], entity]);
|
|
42
|
+
} else {
|
|
43
|
+
persistentItem[optionals[i].name] = entity[optionals[i].name] === void 0 ? null : entity[optionals[i].name];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
var msgIdSegment = persistentItem[this.orm.getPrimaryKey().name] ? "[" + persistentItem[this.orm.getPrimaryKey().name] + "]" : "";
|
|
47
|
+
this.$log.info("Transformation to {} DB JSON object finished", this.orm.table + msgIdSegment);
|
|
48
|
+
return persistentItem;
|
|
49
|
+
}
|
|
50
|
+
validateEntity(entity, skip) {
|
|
51
|
+
if (entity === void 0 || entity === null) {
|
|
52
|
+
throw new Error("Illegal argument: entity is " + entity);
|
|
53
|
+
}
|
|
54
|
+
if (skip) {
|
|
55
|
+
if (skip.constructor !== Array) {
|
|
56
|
+
skip = [skip];
|
|
57
|
+
}
|
|
58
|
+
for (var j = 0; j < skip.length; j++) {
|
|
59
|
+
skip[j];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
var mandatories = this.orm.getMandatoryProperties();
|
|
63
|
+
for (var i = 0; i < mandatories.length; i++) {
|
|
64
|
+
var propName = mandatories[i].name;
|
|
65
|
+
if (skip && skip.indexOf(propName) > -1 || mandatories[i].type.toUpperCase() === "BOOLEAN")
|
|
66
|
+
continue;
|
|
67
|
+
var propValue = entity[propName];
|
|
68
|
+
if (propValue === void 0 || propValue === null) {
|
|
69
|
+
throw new Error("Illegal " + propName + " attribute value in " + this.orm.table + " entity: " + propValue);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
insert(_entity) {
|
|
74
|
+
var entities = _entity;
|
|
75
|
+
if (_entity.constructor !== Array) {
|
|
76
|
+
entities = [_entity];
|
|
77
|
+
}
|
|
78
|
+
this.$log.info("Inserting {} {}", this.orm.table, entities.length === 1 ? "entity" : "entities");
|
|
79
|
+
var updatedRecordCount = 0;
|
|
80
|
+
var ids = [];
|
|
81
|
+
for (var i = 0; i < entities.length; i++) {
|
|
82
|
+
var entity = entities[i];
|
|
83
|
+
this.validateEntity(entity, [this.orm.getPrimaryKey().name]);
|
|
84
|
+
var dbEntity = this.createNoSQLEntity(entity);
|
|
85
|
+
try {
|
|
86
|
+
var collection = db.getCollection(this.orm.table);
|
|
87
|
+
var id = collection.getNextId();
|
|
88
|
+
dbEntity[this.orm.getPrimaryKey().name] = id;
|
|
89
|
+
dbEntity["_id"] = id;
|
|
90
|
+
collection.insert(dbEntity);
|
|
91
|
+
updatedRecordCount++;
|
|
92
|
+
this.notify("afterInsert", dbEntity);
|
|
93
|
+
this.notify("beforeInsertAssociationSets", dbEntity);
|
|
94
|
+
if (updatedRecordCount > 0) {
|
|
95
|
+
ids.push(dbEntity[this.orm.getPrimaryKey().name]);
|
|
96
|
+
this.$log.info("{}[] entity inserted", this.orm.table, dbEntity[this.orm.getPrimaryKey().name]);
|
|
97
|
+
} else {
|
|
98
|
+
this.$log.info("No changes incurred in {}", this.orm.table);
|
|
99
|
+
}
|
|
100
|
+
} catch (e) {
|
|
101
|
+
this.$log.error("Inserting {} {} failed", this.orm.table, entities.length === 1 ? "entity" : "entities", e);
|
|
102
|
+
this.$log.info("Rolling back changes after failed {}[{}] insert. ", this.orm.table, dbEntity[this.orm.getPrimaryKey().name]);
|
|
103
|
+
if (dbEntity[this.orm.getPrimaryKey().name]) {
|
|
104
|
+
try {
|
|
105
|
+
this.remove(dbEntity[this.orm.getPrimaryKey().name]);
|
|
106
|
+
} catch (err) {
|
|
107
|
+
this.$log.error("Could not rollback changes after failed {}[{}] insert. ", this.orm.table, dbEntity[this.orm.getPrimaryKey().name], err);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
throw e;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (_entity.constructor !== Array)
|
|
114
|
+
return ids[0];
|
|
115
|
+
else
|
|
116
|
+
return ids;
|
|
117
|
+
}
|
|
118
|
+
// update entity from a JSON object. Returns the id of the updated entity.
|
|
119
|
+
update(entity) {
|
|
120
|
+
this.$log.info("Updating {}[{}] entity", this.orm.table, entity !== void 0 ? entity[this.orm.getPrimaryKey().name] : entity);
|
|
121
|
+
if (entity === void 0 || entity === null) {
|
|
122
|
+
throw new Error("Illegal argument: entity is " + entity);
|
|
123
|
+
}
|
|
124
|
+
var ignoredProperties = this.orm.getMandatoryProperties().filter(function(property) {
|
|
125
|
+
return property.allowedOps && property.allowedOps.indexOf("update") < 0;
|
|
126
|
+
}).map(function(property) {
|
|
127
|
+
return property.name;
|
|
128
|
+
});
|
|
129
|
+
this.validateEntity(entity, ignoredProperties);
|
|
130
|
+
var dbEntity = this.createNoSQLEntity(entity);
|
|
131
|
+
dbEntity[this.orm.getPrimaryKey().name] = entity["_id"];
|
|
132
|
+
dbEntity["_id"] = entity["_id"];
|
|
133
|
+
try {
|
|
134
|
+
this.notify("beforeUpdateEntity", dbEntity);
|
|
135
|
+
var collection = db.getCollection(this.orm.table);
|
|
136
|
+
collection.update({ "_id": entity["_id"] }, dbEntity);
|
|
137
|
+
this.$log.info("{}[{}] entity updated", this.orm.table, dbEntity[this.orm.getPrimaryKey().name]);
|
|
138
|
+
return this;
|
|
139
|
+
} catch (e) {
|
|
140
|
+
this.$log.error("Updating {}[{}] failed", this.orm.table, entity !== void 0 ? entity[this.orm.getPrimaryKey().name] : entity, e);
|
|
141
|
+
throw e;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// delete entity by id, or array of ids, or delete all (if not argument is provided).
|
|
145
|
+
remove(id) {
|
|
146
|
+
var ids = [];
|
|
147
|
+
if (arguments.length === 0) {
|
|
148
|
+
ids = this.list({
|
|
149
|
+
"$select": [this.orm.getPrimaryKey().name]
|
|
150
|
+
}).map(function(ent) {
|
|
151
|
+
return ent[this.orm.getPrimaryKey().name];
|
|
152
|
+
}.bind(this));
|
|
153
|
+
} else {
|
|
154
|
+
if (arguments[0].constructor !== Array) {
|
|
155
|
+
ids = [arguments[0]];
|
|
156
|
+
} else {
|
|
157
|
+
ids = arguments[0];
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
this.$log.info("Deleting " + this.orm.table + (ids !== void 0 && ids.length === 1 ? "[" + ids[0] + "] entity" : ids.length + " entities"));
|
|
161
|
+
for (var i = 0; i < ids.length; i++) {
|
|
162
|
+
var id = ids[i];
|
|
163
|
+
if (ids.length > 1)
|
|
164
|
+
this.$log.info("Deleting {}[{}] entity", this.orm.table, id);
|
|
165
|
+
if (id === void 0 || id === null) {
|
|
166
|
+
throw new Error("Illegal argument for id parameter:" + id);
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
this.notify("beforeRemoveEntity", id);
|
|
170
|
+
var collection = db.getCollection(this.orm.table);
|
|
171
|
+
collection.remove({ "_id": id });
|
|
172
|
+
} catch (e) {
|
|
173
|
+
this.$log.error("Deleting {}[{}] entity failed", this.orm.table, id, e);
|
|
174
|
+
throw e;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
expand(expansionPath, context) {
|
|
179
|
+
this.$log.info("Expanding for association path {} and context entity {}", expansionPath, (typeof arguments[1] !== "object" ? "id " : "") + JSON.stringify(arguments[1]));
|
|
180
|
+
throw Error("Not implemented.");
|
|
181
|
+
}
|
|
182
|
+
/*
|
|
183
|
+
Reads a single entity by id, parsed into JSON object.
|
|
184
|
+
If requested as expanded the returned entity will comprise associated (dependent) entities too. Expand can be a string tha tis a valid association name defined in this dao orm or
|
|
185
|
+
an array of such names.
|
|
186
|
+
*/
|
|
187
|
+
find(id, expand, select) {
|
|
188
|
+
if (typeof arguments[0] === "object") {
|
|
189
|
+
id = arguments[0].id;
|
|
190
|
+
expand = arguments[0].$expand || arguments[0].expand;
|
|
191
|
+
select = arguments[0].$select || arguments[0].select;
|
|
192
|
+
}
|
|
193
|
+
this.$log.info("Finding {}[{}] entity with list parameters expand[{}], select[{}]", this.orm.table, id, expand, select);
|
|
194
|
+
if (id === void 0 || id === null) {
|
|
195
|
+
throw new Error("Illegal argument for id parameter:" + id);
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
var entity;
|
|
199
|
+
if (select !== void 0) {
|
|
200
|
+
if (select.constructor !== Array) {
|
|
201
|
+
if (select.constructor === String) {
|
|
202
|
+
select = select.split(",").map(function(sel) {
|
|
203
|
+
if (sel.constructor !== String)
|
|
204
|
+
throw Error("Illegal argument: select array components are expected ot be strings but found " + typeof sel);
|
|
205
|
+
return sel.trim();
|
|
206
|
+
});
|
|
207
|
+
} else {
|
|
208
|
+
throw Error("Illegal argument: select is expected to be string or array of strings but was " + typeof select);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (select !== void 0 && expand !== void 0) {
|
|
213
|
+
select.push(this.orm.getPrimaryKey().name);
|
|
214
|
+
}
|
|
215
|
+
var params = {};
|
|
216
|
+
params["_id"] = id;
|
|
217
|
+
var collection = db.getCollection(this.orm.table);
|
|
218
|
+
if (select !== void 0) {
|
|
219
|
+
entity = collection.find(params, select);
|
|
220
|
+
} else {
|
|
221
|
+
entity = collection.findOneById(id);
|
|
222
|
+
}
|
|
223
|
+
if (entity) {
|
|
224
|
+
this.$log.info("{}[{}] entity found", this.orm.table, id);
|
|
225
|
+
this.notify("afterFound", entity);
|
|
226
|
+
} else {
|
|
227
|
+
this.$log.info("{}[{}] entity not found", this.orm.table, id);
|
|
228
|
+
}
|
|
229
|
+
return entity;
|
|
230
|
+
} catch (e) {
|
|
231
|
+
this.$log.error("Finding {}[{}] entitiy failed.", this.orm.table, id, e);
|
|
232
|
+
throw e;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
count() {
|
|
236
|
+
this.$log.info("Counting " + this.orm.table + " entities");
|
|
237
|
+
var count = 0;
|
|
238
|
+
try {
|
|
239
|
+
var collection = db.getCollection(this.orm.table);
|
|
240
|
+
count = collection.count();
|
|
241
|
+
} catch (e) {
|
|
242
|
+
this.$log.error("Counting {} entities failed", this.orm.table, e);
|
|
243
|
+
throw e;
|
|
244
|
+
}
|
|
245
|
+
this.$log.info("{} {} entities counted", String(count), this.orm.table);
|
|
246
|
+
return count;
|
|
247
|
+
}
|
|
248
|
+
/*
|
|
249
|
+
* list parameters:
|
|
250
|
+
* - $expand
|
|
251
|
+
* - $filter
|
|
252
|
+
* - $select
|
|
253
|
+
* - $sort
|
|
254
|
+
* - $order
|
|
255
|
+
* - $limit
|
|
256
|
+
* - $offset
|
|
257
|
+
*/
|
|
258
|
+
list(settings) {
|
|
259
|
+
settings = settings || {};
|
|
260
|
+
var expand = settings.$expand || settings.expand;
|
|
261
|
+
if (expand !== void 0) {
|
|
262
|
+
if (expand.constructor !== Array) {
|
|
263
|
+
if (expand.constructor === String) {
|
|
264
|
+
if (expand.indexOf(",") > -1) {
|
|
265
|
+
settings.$expand = expand.split(",").map(function(exp) {
|
|
266
|
+
if (exp.constructor !== String)
|
|
267
|
+
throw Error("Illegal argument: expand array components are expected ot be strings but found " + typeof exp);
|
|
268
|
+
return exp.trim();
|
|
269
|
+
});
|
|
270
|
+
} else {
|
|
271
|
+
settings.$expand = [expand];
|
|
272
|
+
}
|
|
273
|
+
} else {
|
|
274
|
+
throw Error("Illegal argument: expand is expected to be string or array of strings but was " + typeof expand);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
var select = settings.$select || settings.select;
|
|
279
|
+
if (select !== void 0) {
|
|
280
|
+
if (select.constructor !== Array) {
|
|
281
|
+
if (select.constructor === String) {
|
|
282
|
+
if (select.indexOf(",") > -1) {
|
|
283
|
+
settings.$select = select.split(",").map(function(exp) {
|
|
284
|
+
if (exp.constructor !== String)
|
|
285
|
+
throw Error("Illegal argument: select array components are expected ot be strings but found " + typeof exp);
|
|
286
|
+
return exp.trim();
|
|
287
|
+
});
|
|
288
|
+
} else {
|
|
289
|
+
settings.$select = [select];
|
|
290
|
+
}
|
|
291
|
+
} else {
|
|
292
|
+
throw Error("Illegal argument: select is expected to be string or array of strings but was " + typeof expand);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
var listArgs = [];
|
|
297
|
+
for (var key in settings) {
|
|
298
|
+
listArgs.push(" " + key + "[" + settings[key] + "]");
|
|
299
|
+
}
|
|
300
|
+
this.$log.info("Listing {} entity collection with list operators: {}", this.orm.table, listArgs.join(","));
|
|
301
|
+
if (settings.$select !== void 0 && expand !== void 0) {
|
|
302
|
+
settings.$select.push(this.orm.getPrimaryKey().name);
|
|
303
|
+
}
|
|
304
|
+
if (settings.$filter) {
|
|
305
|
+
if (settings.$filter.indexOf(",") > -1) {
|
|
306
|
+
settings.$filter = settings.$filter.split(",");
|
|
307
|
+
} else {
|
|
308
|
+
settings.$filter = [settings.$filter];
|
|
309
|
+
}
|
|
310
|
+
settings.$filter = settings.$filter.filter(function(filterField) {
|
|
311
|
+
var prop = this.ormstatements.orm.getProperty(filterField);
|
|
312
|
+
if (prop === void 0 || prop.type.toUpperCase() !== "VARCHAR" || settings[prop.name] === void 0)
|
|
313
|
+
return false;
|
|
314
|
+
settings[prop.name] = "%" + settings[prop.name] + "%";
|
|
315
|
+
return true;
|
|
316
|
+
}.bind(this));
|
|
317
|
+
}
|
|
318
|
+
try {
|
|
319
|
+
var entities = [];
|
|
320
|
+
var collection = db.getCollection(this.orm.table);
|
|
321
|
+
var cursor = collection.find();
|
|
322
|
+
while (cursor.hasNext()) {
|
|
323
|
+
entities.push(cursor.next());
|
|
324
|
+
}
|
|
325
|
+
this.$log.info("{} {} entities found", entities.length, this.orm.table);
|
|
326
|
+
return entities;
|
|
327
|
+
} catch (e) {
|
|
328
|
+
this.$log.error("Listing {} entities failed.", this.orm.table, e);
|
|
329
|
+
throw e;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
existsTable() {
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
createTable() {
|
|
336
|
+
}
|
|
337
|
+
dropTable() {
|
|
338
|
+
return this;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
function create(oDefinition, logCtxName, dataSourceName, databaseType) {
|
|
342
|
+
var orm;
|
|
343
|
+
orm = oDefinition;
|
|
344
|
+
var productName = globals.get(databaseType + "_" + dataSourceName);
|
|
345
|
+
if (!productName) {
|
|
346
|
+
productName = "MongoDB";
|
|
347
|
+
globals.set(databaseType + "_" + dataSourceName, productName);
|
|
348
|
+
}
|
|
349
|
+
return new DAO(orm, logCtxName);
|
|
350
|
+
}
|
|
351
|
+
;
|
|
352
|
+
function dao(oDefinition, logCtxName, dataSourceName, databaseType) {
|
|
353
|
+
return create(oDefinition, logCtxName, dataSourceName, databaseType);
|
|
354
|
+
}
|
|
355
|
+
export {
|
|
356
|
+
DAO,
|
|
357
|
+
create,
|
|
358
|
+
dao
|
|
359
|
+
};
|
|
360
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL21vbmdvZGIvZGFvLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgZ2xvYmFscyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvY29yZVwiXG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tIFwiLi9jbGllbnRcIlxuaW1wb3J0ICogYXMgZGlyaWdpYmxlT3JtIGZyb20gXCJAYWVyb2tpdC9zZGsvZGIvb3JtXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9sb2dcIjtcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25zIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9jb3JlXCI7XG5cbmNvbnN0IGRiVXJpID0gQ29uZmlndXJhdGlvbnMuZ2V0KFwiRElSSUdJQkxFX01PTkdPREJfQ0xJRU5UX1VSSVwiLCBcIm1vbmdvZGI6Ly9sb2NhbGhvc3Q6MjcwMTdcIik7XG5cbmNvbnN0IG1vbmdvQ2xpZW50ID0gbmV3IENsaWVudChkYlVyaSwgbnVsbCwgbnVsbCk7XG5jb25zdCBkYiA9IG1vbmdvQ2xpZW50LmdldERCKCk7XG5cbmV4cG9ydCBjbGFzcyBEQU8ge1xuICAgIHByaXZhdGUgb3JtOiBhbnk7XG4gICAgJGxvZztcblxuICAgIGNvbnN0cnVjdG9yKG9ybTogYW55LCBsb2dDdHhOYW1lOiBzdHJpbmcgPSAnbW9uZ29kYi5kYW8nKSB7XG4gICAgICAgIHRoaXMub3JtID0gZGlyaWdpYmxlT3JtLmdldChvcm0pO1xuXG4gICAgICAgIGxldCBsb2dnZXJOYW1lID0gbG9nQ3R4TmFtZTtcbiAgICAgICAgaWYgKHRoaXMub3JtLnRhYmxlKSB7XG4gICAgICAgICAgICBsb2dnZXJOYW1lID0gJ21vbmdvZGIuZGFvLicgKyAodGhpcy5vcm0udGFibGUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4kbG9nID0gTG9nZ2luZy5nZXRMb2dnZXIobG9nZ2VyTmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5vdGlmeShldmVudCwgLi4uYSk6IHZvaWQge1xuICAgICAgICB2YXIgZnVuYyA9IHRoaXNbZXZlbnRdO1xuICAgICAgICBpZiAoIXRoaXNbZXZlbnRdKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICB0aHJvdyBFcnJvcignSWxsZWdhbCBhcmd1bWVudC4gTm90IGEgZnVuY3Rpb246ICcgKyBmdW5jKTtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgIGZ1bmMuYXBwbHkodGhpcywgYXJncy5zbGljZSgxKSk7XG4gICAgfVxuXG4gICAgLy9QcmVwYXJlIGEgSlNPTiBvYmplY3QgZm9yIGluc2VydCBpbnRvIERCXG4gICAgcHVibGljIGNyZWF0ZU5vU1FMRW50aXR5KGVudGl0eSk6IGFueSB7XG4gICAgICAgIHZhciBwZXJzaXN0ZW50SXRlbSA9IHt9O1xuICAgICAgICB2YXIgbWFuZGF0b3JpZXMgPSB0aGlzLm9ybS5nZXRNYW5kYXRvcnlQcm9wZXJ0aWVzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFuZGF0b3JpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChtYW5kYXRvcmllc1tpXS5kYlZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcGVyc2lzdGVudEl0ZW1bbWFuZGF0b3JpZXNbaV0ubmFtZV0gPSBtYW5kYXRvcmllc1tpXS5kYlZhbHVlLmFwcGx5KHRoaXMsIFtlbnRpdHlbbWFuZGF0b3JpZXNbaV0ubmFtZV0sIGVudGl0eV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZXJzaXN0ZW50SXRlbVttYW5kYXRvcmllc1tpXS5uYW1lXSA9IGVudGl0eVttYW5kYXRvcmllc1tpXS5uYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgb3B0aW9uYWxzID0gdGhpcy5vcm0uZ2V0T3B0aW9uYWxQcm9wZXJ0aWVzKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9uYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9uYWxzW2ldLmRiVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBlcnNpc3RlbnRJdGVtW29wdGlvbmFsc1tpXS5uYW1lXSA9IG9wdGlvbmFsc1tpXS5kYlZhbHVlLmFwcGx5KHRoaXMsIFtlbnRpdHlbb3B0aW9uYWxzW2ldLm5hbWVdLCBlbnRpdHldKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVyc2lzdGVudEl0ZW1bb3B0aW9uYWxzW2ldLm5hbWVdID0gZW50aXR5W29wdGlvbmFsc1tpXS5uYW1lXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGVudGl0eVtvcHRpb25hbHNbaV0ubmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1zZ0lkU2VnbWVudCA9IHBlcnNpc3RlbnRJdGVtW3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSA/IFwiW1wiICsgcGVyc2lzdGVudEl0ZW1bdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdICsgXCJdXCIgOiBcIlwiO1xuICAgICAgICB0aGlzLiRsb2cuaW5mbyhcIlRyYW5zZm9ybWF0aW9uIHRvIHt9IERCIEpTT04gb2JqZWN0IGZpbmlzaGVkXCIsICh0aGlzLm9ybS50YWJsZSArIG1zZ0lkU2VnbWVudCkpO1xuICAgICAgICByZXR1cm4gcGVyc2lzdGVudEl0ZW07XG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyB2YWxpZGF0ZUVudGl0eShlbnRpdHksIHNraXApOiB2b2lkIHtcbiAgICAgICAgaWYgKGVudGl0eSA9PT0gdW5kZWZpbmVkIHx8IGVudGl0eSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50OiBlbnRpdHkgaXMgJyArIGVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNraXApIHtcbiAgICAgICAgICAgIGlmIChza2lwLmNvbnN0cnVjdG9yICE9PSBBcnJheSkge1xuICAgICAgICAgICAgICAgIHNraXAgPSBbc2tpcF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNraXAubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBza2lwW2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBtYW5kYXRvcmllcyA9IHRoaXMub3JtLmdldE1hbmRhdG9yeVByb3BlcnRpZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYW5kYXRvcmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHByb3BOYW1lID0gbWFuZGF0b3JpZXNbaV0ubmFtZTtcbiAgICAgICAgICAgIGlmICgoc2tpcCAmJiBza2lwLmluZGV4T2YocHJvcE5hbWUpID4gLTEpIHx8IG1hbmRhdG9yaWVzW2ldLnR5cGUudG9VcHBlckNhc2UoKSA9PT0gJ0JPT0xFQU4nKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgdmFyIHByb3BWYWx1ZSA9IGVudGl0eVtwcm9wTmFtZV07XG4gICAgICAgICAgICBpZiAocHJvcFZhbHVlID09PSB1bmRlZmluZWQgfHwgcHJvcFZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsICcgKyBwcm9wTmFtZSArICcgYXR0cmlidXRlIHZhbHVlIGluICcgKyB0aGlzLm9ybS50YWJsZSArICcgZW50aXR5OiAnICsgcHJvcFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgaW5zZXJ0KF9lbnRpdHkpIHtcbiAgICBcbiAgICAgICAgdmFyIGVudGl0aWVzID0gX2VudGl0eTtcbiAgICAgICAgaWYgKF9lbnRpdHkuY29uc3RydWN0b3IgIT09IEFycmF5KSB7XG4gICAgICAgICAgICBlbnRpdGllcyA9IFtfZW50aXR5XTtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICB0aGlzLiRsb2cuaW5mbygnSW5zZXJ0aW5nIHt9IHt9JywgdGhpcy5vcm0udGFibGUsIChlbnRpdGllcy5sZW5ndGggPT09IDEgPyAnZW50aXR5JyA6ICdlbnRpdGllcycpKTtcbiAgICBcbiAgICAgICAgdmFyIHVwZGF0ZWRSZWNvcmRDb3VudCA9IDA7XG4gICAgICAgIHZhciBpZHMgPSBbXTtcbiAgICBcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIFxuICAgICAgICAgICAgdmFyIGVudGl0eSA9IGVudGl0aWVzW2ldO1xuICAgIFxuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZUVudGl0eShlbnRpdHksIFt0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV0pO1xuICAgIFxuICAgICAgICAgICAgdmFyIGRiRW50aXR5ID0gdGhpcy5jcmVhdGVOb1NRTEVudGl0eShlbnRpdHkpO1xuICAgIFxuICAgICAgICAgICAgdHJ5IHtcbiAgICBcbiAgICAgICAgICAgICAgICB2YXIgY29sbGVjdGlvbiA9IGRiLmdldENvbGxlY3Rpb24odGhpcy5vcm0udGFibGUpO1xuICAgICAgICAgICAgICAgIHZhciBpZCA9IGNvbGxlY3Rpb24uZ2V0TmV4dElkKCk7XG4gICAgXG4gICAgICAgICAgICAgICAgZGJFbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdID0gaWQ7XG4gICAgICAgICAgICAgICAgZGJFbnRpdHlbXCJfaWRcIl0gPSBpZDtcbiAgICBcbiAgICBcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmluc2VydChkYkVudGl0eSk7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFJlY29yZENvdW50Kys7XG4gICAgXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnkoJ2FmdGVySW5zZXJ0JywgZGJFbnRpdHkpO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5KCdiZWZvcmVJbnNlcnRBc3NvY2lhdGlvblNldHMnLCBkYkVudGl0eSk7XG4gICAgXG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRSZWNvcmRDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWRzLnB1c2goZGJFbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmluZm8oJ3t9W10gZW50aXR5IGluc2VydGVkJywgdGhpcy5vcm0udGFibGUsIGRiRW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmluZm8oJ05vIGNoYW5nZXMgaW5jdXJyZWQgaW4ge30nLCB0aGlzLm9ybS50YWJsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgIFxuICAgIFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5lcnJvcihcIkluc2VydGluZyB7fSB7fSBmYWlsZWRcIiwgdGhpcy5vcm0udGFibGUsIChlbnRpdGllcy5sZW5ndGggPT09IDEgPyAnZW50aXR5JyA6ICdlbnRpdGllcycpLCBlKTtcbiAgICAgICAgICAgICAgICB0aGlzLiRsb2cuaW5mbygnUm9sbGluZyBiYWNrIGNoYW5nZXMgYWZ0ZXIgZmFpbGVkIHt9W3t9XSBpbnNlcnQuICcsIHRoaXMub3JtLnRhYmxlLCBkYkVudGl0eVt0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV0pO1xuICAgICAgICAgICAgICAgIGlmIChkYkVudGl0eVt0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKGRiRW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbG9nLmVycm9yKCdDb3VsZCBub3Qgcm9sbGJhY2sgY2hhbmdlcyBhZnRlciBmYWlsZWQge31be31dIGluc2VydC4gJywgdGhpcy5vcm0udGFibGUsIGRiRW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgXG4gICAgICAgIGlmIChfZW50aXR5LmNvbnN0cnVjdG9yICE9PSBBcnJheSlcbiAgICAgICAgICAgIHJldHVybiBpZHNbMF07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBpZHM7XG4gICAgfVxuICAgIFxuICAgIC8vIHVwZGF0ZSBlbnRpdHkgZnJvbSBhIEpTT04gb2JqZWN0LiBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgdXBkYXRlZCBlbnRpdHkuXG4gICAgcHVibGljIHVwZGF0ZShlbnRpdHkpIHtcbiAgICBcbiAgICAgICAgdGhpcy4kbG9nLmluZm8oJ1VwZGF0aW5nIHt9W3t9XSBlbnRpdHknLCB0aGlzLm9ybS50YWJsZSwgZW50aXR5ICE9PSB1bmRlZmluZWQgPyBlbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdIDogZW50aXR5KTtcbiAgICBcbiAgICAgICAgaWYgKGVudGl0eSA9PT0gdW5kZWZpbmVkIHx8IGVudGl0eSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50OiBlbnRpdHkgaXMgJyArIGVudGl0eSk7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgdmFyIGlnbm9yZWRQcm9wZXJ0aWVzID0gdGhpcy5vcm0uZ2V0TWFuZGF0b3J5UHJvcGVydGllcygpXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eS5hbGxvd2VkT3BzICYmIHByb3BlcnR5LmFsbG93ZWRPcHMuaW5kZXhPZigndXBkYXRlJykgPCAwO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5Lm5hbWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUVudGl0eShlbnRpdHksIGlnbm9yZWRQcm9wZXJ0aWVzKTtcbiAgICBcbiAgICAgICAgdmFyIGRiRW50aXR5ID0gdGhpcy5jcmVhdGVOb1NRTEVudGl0eShlbnRpdHkpO1xuICAgICAgICBkYkVudGl0eVt0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV0gPSBlbnRpdHlbXCJfaWRcIl07XG4gICAgICAgIGRiRW50aXR5W1wiX2lkXCJdID0gZW50aXR5W1wiX2lkXCJdO1xuICAgIFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnkoJ2JlZm9yZVVwZGF0ZUVudGl0eScsIGRiRW50aXR5KTtcbiAgICBcbiAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uID0gZGIuZ2V0Q29sbGVjdGlvbih0aGlzLm9ybS50YWJsZSk7XG4gICAgICAgICAgICBjb2xsZWN0aW9uLnVwZGF0ZSh7IFwiX2lkXCI6IGVudGl0eVtcIl9pZFwiXSB9LCBkYkVudGl0eSk7XG4gICAgXG4gICAgICAgICAgICB0aGlzLiRsb2cuaW5mbygne31be31dIGVudGl0eSB1cGRhdGVkJywgdGhpcy5vcm0udGFibGUsIGRiRW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSk7XG4gICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy4kbG9nLmVycm9yKCdVcGRhdGluZyB7fVt7fV0gZmFpbGVkJywgdGhpcy5vcm0udGFibGUsIGVudGl0eSAhPT0gdW5kZWZpbmVkID8gZW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSA6IGVudGl0eSwgZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBcbiAgICAvLyBkZWxldGUgZW50aXR5IGJ5IGlkLCBvciBhcnJheSBvZiBpZHMsIG9yIGRlbGV0ZSBhbGwgKGlmIG5vdCBhcmd1bWVudCBpcyBwcm92aWRlZCkuXG4gICAgcHVibGljIHJlbW92ZShpZCkge1xuICAgIFxuICAgICAgICB2YXIgaWRzID0gW107XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBpZHMgPSB0aGlzLmxpc3Qoe1xuICAgICAgICAgICAgICAgIFwiJHNlbGVjdFwiOiBbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdXG4gICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnRbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHNbMF0uY29uc3RydWN0b3IgIT09IEFycmF5KSB7XG4gICAgICAgICAgICAgICAgaWRzID0gW2FyZ3VtZW50c1swXV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlkcyA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIFxuICAgICAgICB0aGlzLiRsb2cuaW5mbygnRGVsZXRpbmcgJyArIHRoaXMub3JtLnRhYmxlICsgKChpZHMgIT09IHVuZGVmaW5lZCAmJiBpZHMubGVuZ3RoID09PSAxKSA/ICdbJyArIGlkc1swXSArICddIGVudGl0eScgOiBpZHMubGVuZ3RoICsgJyBlbnRpdGllcycpKTtcbiAgICBcbiAgICBcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICBcbiAgICAgICAgICAgIHZhciBpZCA9IGlkc1tpXTtcbiAgICBcbiAgICAgICAgICAgIGlmIChpZHMubGVuZ3RoID4gMSlcbiAgICAgICAgICAgICAgICB0aGlzLiRsb2cuaW5mbygnRGVsZXRpbmcge31be31dIGVudGl0eScsIHRoaXMub3JtLnRhYmxlLCBpZCk7XG4gICAgXG4gICAgICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBhcmd1bWVudCBmb3IgaWQgcGFyYW1ldGVyOicgKyBpZCk7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICB0cnkge1xuICAgIFxuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5KCdiZWZvcmVSZW1vdmVFbnRpdHknLCBpZCk7XG4gICAgXG4gICAgICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSBkYi5nZXRDb2xsZWN0aW9uKHRoaXMub3JtLnRhYmxlKTtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnJlbW92ZSh7IFwiX2lkXCI6IGlkIH0pO1xuICAgIFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJGxvZy5lcnJvcignRGVsZXRpbmcge31be31dIGVudGl0eSBmYWlsZWQnLCB0aGlzLm9ybS50YWJsZSwgaWQsIGUpO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgIH1cbiAgICBcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGV4cGFuZChleHBhbnNpb25QYXRoLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuJGxvZy5pbmZvKCdFeHBhbmRpbmcgZm9yIGFzc29jaWF0aW9uIHBhdGgge30gYW5kIGNvbnRleHQgZW50aXR5IHt9JywgZXhwYW5zaW9uUGF0aCwgKHR5cGVvZiBhcmd1bWVudHNbMV0gIT09ICdvYmplY3QnID8gJ2lkICcgOiAnJykgKyBKU09OLnN0cmluZ2lmeShhcmd1bWVudHNbMV0pKTtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgIH1cbiAgICBcbiAgICAvKiBcbiAgICAgICAgUmVhZHMgYSBzaW5nbGUgZW50aXR5IGJ5IGlkLCBwYXJzZWQgaW50byBKU09OIG9iamVjdC4gXG4gICAgICAgIElmIHJlcXVlc3RlZCBhcyBleHBhbmRlZCB0aGUgcmV0dXJuZWQgZW50aXR5IHdpbGwgY29tcHJpc2UgYXNzb2NpYXRlZCAoZGVwZW5kZW50KSBlbnRpdGllcyB0b28uIEV4cGFuZCBjYW4gYmUgYSBzdHJpbmcgdGhhIHRpcyBhIHZhbGlkIGFzc29jaWF0aW9uIG5hbWUgZGVmaW5lZCBpbiB0aGlzIGRhbyBvcm0gb3JcbiAgICAgICAgYW4gYXJyYXkgb2Ygc3VjaCBuYW1lcy5cbiAgICAqL1xuICAgIHB1YmxpYyBmaW5kKGlkLCBleHBhbmQsIHNlbGVjdCkge1xuICAgIFxuICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlkID0gYXJndW1lbnRzWzBdLmlkO1xuICAgICAgICAgICAgZXhwYW5kID0gYXJndW1lbnRzWzBdLiRleHBhbmQgfHwgYXJndW1lbnRzWzBdLmV4cGFuZDtcbiAgICAgICAgICAgIHNlbGVjdCA9IGFyZ3VtZW50c1swXS4kc2VsZWN0IHx8IGFyZ3VtZW50c1swXS5zZWxlY3Q7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgdGhpcy4kbG9nLmluZm8oJ0ZpbmRpbmcge31be31dIGVudGl0eSB3aXRoIGxpc3QgcGFyYW1ldGVycyBleHBhbmRbe31dLCBzZWxlY3Rbe31dJywgdGhpcy5vcm0udGFibGUsIGlkLCBleHBhbmQsIHNlbGVjdCk7XG4gICAgXG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQgZm9yIGlkIHBhcmFtZXRlcjonICsgaWQpO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgZW50aXR5O1xuICAgICAgICAgICAgaWYgKHNlbGVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdC5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgPSBzZWxlY3Quc3BsaXQoJywnKS5tYXAoZnVuY3Rpb24gKHNlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWwuY29uc3RydWN0b3IgIT09IFN0cmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IHNlbGVjdCBhcnJheSBjb21wb25lbnRzIGFyZSBleHBlY3RlZCBvdCBiZSBzdHJpbmdzIGJ1dCBmb3VuZCAnICsgKHR5cGVvZiBzZWwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IHNlbGVjdCBpcyBleHBlY3RlZCB0byBiZSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyBidXQgd2FzICcgKyAodHlwZW9mIHNlbGVjdCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9lbnN1cmUgdGhhdCBqb2lua2V5cyBmb3IgcmVxdWlyZWQgZXhwYW5kcyBhcmUgYXZhaWxhYmxlIGFuZCBub3QgZmlsdGVyZWQgYnkgc2VsZWN0XG4gICAgICAgICAgICBpZiAoc2VsZWN0ICE9PSB1bmRlZmluZWQgJiYgZXhwYW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3QucHVzaCh0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICB2YXIgcGFyYW1zID0ge307XG4gICAgICAgICAgICBwYXJhbXNbXCJfaWRcIl0gPSBpZDtcbiAgICBcbiAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uID0gZGIuZ2V0Q29sbGVjdGlvbih0aGlzLm9ybS50YWJsZSk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBlbnRpdHkgPSBjb2xsZWN0aW9uLmZpbmQocGFyYW1zLCBzZWxlY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbnRpdHkgPSBjb2xsZWN0aW9uLmZpbmRPbmVCeUlkKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICBcbiAgICAgICAgICAgIGlmIChlbnRpdHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRsb2cuaW5mbygne31be31dIGVudGl0eSBmb3VuZCcsIHRoaXMub3JtLnRhYmxlLCBpZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnkoJ2FmdGVyRm91bmQnLCBlbnRpdHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRsb2cuaW5mbygne31be31dIGVudGl0eSBub3QgZm91bmQnLCB0aGlzLm9ybS50YWJsZSwgaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudGl0eTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy4kbG9nLmVycm9yKFwiRmluZGluZyB7fVt7fV0gZW50aXRpeSBmYWlsZWQuXCIsIHRoaXMub3JtLnRhYmxlLCBpZCwgZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBjb3VudCgpOiBudW1iZXIge1xuICAgIFxuICAgICAgICB0aGlzLiRsb2cuaW5mbygnQ291bnRpbmcgJyArIHRoaXMub3JtLnRhYmxlICsgJyBlbnRpdGllcycpO1xuICAgIFxuICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSBkYi5nZXRDb2xsZWN0aW9uKHRoaXMub3JtLnRhYmxlKTtcbiAgICAgICAgICAgIGNvdW50ID0gY29sbGVjdGlvbi5jb3VudCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLiRsb2cuZXJyb3IoJ0NvdW50aW5nIHt9IGVudGl0aWVzIGZhaWxlZCcsIHRoaXMub3JtLnRhYmxlLCBlKTtcbiAgICAgICAgICAgIC8vIGUuZXJyQ29udGV4dCA9IHBhcmFtZXRlcmljU3RhdGVtZW50LnRvU3RyaW5nKCk7IC8vIFRPRE86IHBhcmFtZXRlcmljU3RhdGVtZW50P1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICB0aGlzLiRsb2cuaW5mbygne30ge30gZW50aXRpZXMgY291bnRlZCcsIFN0cmluZyhjb3VudCksIHRoaXMub3JtLnRhYmxlKTtcbiAgICBcbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH07XG4gICAgXG4gICAgLypcbiAgICAgKiBsaXN0IHBhcmFtZXRlcnM6XG4gICAgICogLSAkZXhwYW5kXG4gICAgICogLSAkZmlsdGVyXG4gICAgICogLSAkc2VsZWN0XG4gICAgICogLSAkc29ydFxuICAgICAqIC0gJG9yZGVyIFxuICAgICAqIC0gJGxpbWl0XG4gICAgICogLSAkb2Zmc2V0XG4gICAgICovXG4gICAgcHVibGljIGxpc3Qoc2V0dGluZ3MpIHtcbiAgICBcbiAgICAgICAgc2V0dGluZ3MgPSBzZXR0aW5ncyB8fCB7fTtcbiAgICBcbiAgICAgICAgdmFyIGV4cGFuZCA9IHNldHRpbmdzLiRleHBhbmQgfHwgc2V0dGluZ3MuZXhwYW5kO1xuICAgICAgICBpZiAoZXhwYW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChleHBhbmQuY29uc3RydWN0b3IgIT09IEFycmF5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cGFuZC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHBhbmQuaW5kZXhPZignLCcpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLiRleHBhbmQgPSBleHBhbmQuc3BsaXQoJywnKS5tYXAoZnVuY3Rpb24gKGV4cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHAuY29uc3RydWN0b3IgIT09IFN0cmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IGV4cGFuZCBhcnJheSBjb21wb25lbnRzIGFyZSBleHBlY3RlZCBvdCBiZSBzdHJpbmdzIGJ1dCBmb3VuZCAnICsgKHR5cGVvZiBleHApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuJGV4cGFuZCA9IFtleHBhbmRdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IGV4cGFuZCBpcyBleHBlY3RlZCB0byBiZSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyBidXQgd2FzICcgKyAodHlwZW9mIGV4cGFuZCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIFxuICAgICAgICB2YXIgc2VsZWN0ID0gc2V0dGluZ3MuJHNlbGVjdCB8fCBzZXR0aW5ncy5zZWxlY3Q7XG4gICAgICAgIGlmIChzZWxlY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHNlbGVjdC5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0LmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdC5pbmRleE9mKCcsJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuJHNlbGVjdCA9IHNlbGVjdC5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoZXhwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cC5jb25zdHJ1Y3RvciAhPT0gU3RyaW5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignSWxsZWdhbCBhcmd1bWVudDogc2VsZWN0IGFycmF5IGNvbXBvbmVudHMgYXJlIGV4cGVjdGVkIG90IGJlIHN0cmluZ3MgYnV0IGZvdW5kICcgKyAodHlwZW9mIGV4cCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHAudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy4kc2VsZWN0ID0gW3NlbGVjdF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignSWxsZWdhbCBhcmd1bWVudDogc2VsZWN0IGlzIGV4cGVjdGVkIHRvIGJlIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzIGJ1dCB3YXMgJyArICh0eXBlb2YgZXhwYW5kKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgXG4gICAgICAgIHZhciBsaXN0QXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgICAgIGxpc3RBcmdzLnB1c2goJyAnICsga2V5ICsgJ1snICsgc2V0dGluZ3Nba2V5XSArICddJyk7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgdGhpcy4kbG9nLmluZm8oJ0xpc3Rpbmcge30gZW50aXR5IGNvbGxlY3Rpb24gd2l0aCBsaXN0IG9wZXJhdG9yczoge30nLCB0aGlzLm9ybS50YWJsZSwgbGlzdEFyZ3Muam9pbignLCcpKTtcbiAgICBcbiAgICAgICAgaWYgKHNldHRpbmdzLiRzZWxlY3QgIT09IHVuZGVmaW5lZCAmJiBleHBhbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2V0dGluZ3MuJHNlbGVjdC5wdXNoKHRoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lKTtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICAvL3NpbXBsaXN0aWMgZmlsdGVyaW5nIG9mIChvbmx5KSBzdHJpbmcgcHJvcGVydGllcyB3aXRoIGxpa2VcbiAgICAgICAgaWYgKHNldHRpbmdzLiRmaWx0ZXIpIHtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy4kZmlsdGVyLmluZGV4T2YoJywnKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgc2V0dGluZ3MuJGZpbHRlciA9IHNldHRpbmdzLiRmaWx0ZXIuc3BsaXQoJywnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0dGluZ3MuJGZpbHRlciA9IFtzZXR0aW5ncy4kZmlsdGVyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldHRpbmdzLiRmaWx0ZXIgPSBzZXR0aW5ncy4kZmlsdGVyLmZpbHRlcihmdW5jdGlvbiAoZmlsdGVyRmllbGQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcCA9IHRoaXMub3Jtc3RhdGVtZW50cy5vcm0uZ2V0UHJvcGVydHkoZmlsdGVyRmllbGQpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSB1bmRlZmluZWQgfHwgcHJvcC50eXBlLnRvVXBwZXJDYXNlKCkgIT09ICdWQVJDSEFSJyB8fCBzZXR0aW5nc1twcm9wLm5hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBzZXR0aW5nc1twcm9wLm5hbWVdID0gJyUnICsgc2V0dGluZ3NbcHJvcC5uYW1lXSArICclJztcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBlbnRpdGllcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSBkYi5nZXRDb2xsZWN0aW9uKHRoaXMub3JtLnRhYmxlKTtcbiAgICAgICAgICAgIHZhciBjdXJzb3IgPSBjb2xsZWN0aW9uLmZpbmQoKTtcbiAgICAgICAgICAgIHdoaWxlIChjdXJzb3IuaGFzTmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgZW50aXRpZXMucHVzaChjdXJzb3IubmV4dCgpKTtcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIHRoaXMuJGxvZy5pbmZvKCd7fSB7fSBlbnRpdGllcyBmb3VuZCcsIGVudGl0aWVzLmxlbmd0aCwgdGhpcy5vcm0udGFibGUpO1xuICAgIFxuICAgICAgICAgICAgcmV0dXJuIGVudGl0aWVzO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLiRsb2cuZXJyb3IoXCJMaXN0aW5nIHt9IGVudGl0aWVzIGZhaWxlZC5cIiwgdGhpcy5vcm0udGFibGUsIGUpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZXhpc3RzVGFibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgY3JlYXRlVGFibGUoKTogdm9pZCB7XG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBkcm9wVGFibGUoKTogREFPIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG4vKipcbiAqIG9EZWZpbml0aW9uIGNhbiBiZSB0YWJsZSBkZWZpbml0aW9uIG9yIHN0YW5kYXJkIG9ybSBkZWZpbml0aW9uIG9iamVjdC4gT3IgaXQgY2FuIGJlIGEgdmFsaWQgcGF0aCB0b1xuICogYSAudGFibGUgZmlsZSwgb3IgYW55IG90aGVyIHRleHQgZmlsZSBjb250aWFuaW5nIGEgc3RhbmRhcmQgZGFvIG9ybSBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKG9EZWZpbml0aW9uLCBsb2dDdHhOYW1lLCBkYXRhU291cmNlTmFtZSwgZGF0YWJhc2VUeXBlKSB7XG4gICAgdmFyIG9ybTtcblxuICAgIG9ybSA9IG9EZWZpbml0aW9uO1xuXG4gICAgdmFyIHByb2R1Y3ROYW1lID0gZ2xvYmFscy5nZXQoZGF0YWJhc2VUeXBlICsgXCJfXCIgKyBkYXRhU291cmNlTmFtZSk7XG4gICAgaWYgKCFwcm9kdWN0TmFtZSkge1xuICAgICAgICBwcm9kdWN0TmFtZSA9IFwiTW9uZ29EQlwiO1xuICAgICAgICBnbG9iYWxzLnNldChkYXRhYmFzZVR5cGUgKyBcIl9cIiArIGRhdGFTb3VyY2VOYW1lLCBwcm9kdWN0TmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEQU8ob3JtLCBsb2dDdHhOYW1lKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkYW8ob0RlZmluaXRpb24sIGxvZ0N0eE5hbWUsIGRhdGFTb3VyY2VOYW1lLCBkYXRhYmFzZVR5cGUpIHtcbiAgICByZXR1cm4gY3JlYXRlKG9EZWZpbml0aW9uLCBsb2dDdHhOYW1lLCBkYXRhU291cmNlTmFtZSwgZGF0YWJhc2VUeXBlKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQUVBLFNBQVMsZUFBZTtBQUN4QixTQUFTLGNBQWM7QUFDdkIsWUFBWSxrQkFBa0I7QUFDOUIsU0FBUyxlQUFlO0FBQ3hCLFNBQVMsc0JBQXNCO0FBRS9CLE1BQU0sUUFBUSxlQUFlLElBQUksZ0NBQWdDLDJCQUEyQjtBQUU1RixNQUFNLGNBQWMsSUFBSSxPQUFPLE9BQU8sTUFBTSxJQUFJO0FBQ2hELE1BQU0sS0FBSyxZQUFZLE1BQU07QUFFdEIsTUFBTSxJQUFJO0FBQUEsRUFJYixZQUFZLEtBQVUsYUFBcUIsZUFBZTtBQUN0RCxTQUFLLE1BQU0sYUFBYSxJQUFJLEdBQUc7QUFFL0IsUUFBSSxhQUFhO0FBQ2pCLFFBQUksS0FBSyxJQUFJLE9BQU87QUFDaEIsbUJBQWEsaUJBQWtCLEtBQUssSUFBSSxNQUFNLFlBQVk7QUFBQSxJQUM5RDtBQUNBLFNBQUssT0FBTyxRQUFRLFVBQVUsVUFBVTtBQUFBLEVBQzVDO0FBQUEsRUFFTyxPQUFPLFVBQVUsR0FBUztBQUM3QixRQUFJLE9BQU8sS0FBSyxLQUFLO0FBQ3JCLFFBQUksQ0FBQyxLQUFLLEtBQUs7QUFDWDtBQUNKLFFBQUksT0FBTyxTQUFTO0FBQ2hCLFlBQU0sTUFBTSx1Q0FBdUMsSUFBSTtBQUMzRCxRQUFJLE9BQU8sQ0FBQyxFQUFFLE1BQU0sS0FBSyxTQUFTO0FBQ2xDLFNBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUM7QUFBQSxFQUNsQztBQUFBO0FBQUEsRUFHTyxrQkFBa0IsUUFBYTtBQUNsQyxRQUFJLGlCQUFpQixDQUFDO0FBQ3RCLFFBQUksY0FBYyxLQUFLLElBQUksdUJBQXVCO0FBQ2xELGFBQVMsSUFBSSxHQUFHLElBQUksWUFBWSxRQUFRLEtBQUs7QUFDekMsVUFBSSxZQUFZLENBQUMsRUFBRSxTQUFTO0FBQ3hCLHVCQUFlLFlBQVksQ0FBQyxFQUFFLElBQUksSUFBSSxZQUFZLENBQUMsRUFBRSxRQUFRLE1BQU0sTUFBTSxDQUFDLE9BQU8sWUFBWSxDQUFDLEVBQUUsSUFBSSxHQUFHLE1BQU0sQ0FBQztBQUFBLE1BQ2xILE9BQU87QUFDSCx1QkFBZSxZQUFZLENBQUMsRUFBRSxJQUFJLElBQUksT0FBTyxZQUFZLENBQUMsRUFBRSxJQUFJO0FBQUEsTUFDcEU7QUFBQSxJQUNKO0FBQ0EsUUFBSSxZQUFZLEtBQUssSUFBSSxzQkFBc0I7QUFDL0MsYUFBUyxJQUFJLEdBQUcsSUFBSSxVQUFVLFFBQVEsS0FBSztBQUN2QyxVQUFJLFVBQVUsQ0FBQyxFQUFFLFlBQVksUUFBVztBQUNwQyx1QkFBZSxVQUFVLENBQUMsRUFBRSxJQUFJLElBQUksVUFBVSxDQUFDLEVBQUUsUUFBUSxNQUFNLE1BQU0sQ0FBQyxPQUFPLFVBQVUsQ0FBQyxFQUFFLElBQUksR0FBRyxNQUFNLENBQUM7QUFBQSxNQUM1RyxPQUFPO0FBQ0gsdUJBQWUsVUFBVSxDQUFDLEVBQUUsSUFBSSxJQUFJLE9BQU8sVUFBVSxDQUFDLEVBQUUsSUFBSSxNQUFNLFNBQVksT0FBTyxPQUFPLFVBQVUsQ0FBQyxFQUFFLElBQUk7QUFBQSxNQUNqSDtBQUFBLElBQ0o7QUFDQSxRQUFJLGVBQWUsZUFBZSxLQUFLLElBQUksY0FBYyxFQUFFLElBQUksSUFBSSxNQUFNLGVBQWUsS0FBSyxJQUFJLGNBQWMsRUFBRSxJQUFJLElBQUksTUFBTTtBQUMvSCxTQUFLLEtBQUssS0FBSyxnREFBaUQsS0FBSyxJQUFJLFFBQVEsWUFBYTtBQUM5RixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRU8sZUFBZSxRQUFRLE1BQVk7QUFDdEMsUUFBSSxXQUFXLFVBQWEsV0FBVyxNQUFNO0FBQ3pDLFlBQU0sSUFBSSxNQUFNLGlDQUFpQyxNQUFNO0FBQUEsSUFDM0Q7QUFDQSxRQUFJLE1BQU07QUFDTixVQUFJLEtBQUssZ0JBQWdCLE9BQU87QUFDNUIsZUFBTyxDQUFDLElBQUk7QUFBQSxNQUNoQjtBQUNBLGVBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDbEMsYUFBSyxDQUFDO0FBQUEsTUFDVjtBQUFBLElBQ0o7QUFDQSxRQUFJLGNBQWMsS0FBSyxJQUFJLHVCQUF1QjtBQUNsRCxhQUFTLElBQUksR0FBRyxJQUFJLFlBQVksUUFBUSxLQUFLO0FBQ3pDLFVBQUksV0FBVyxZQUFZLENBQUMsRUFBRTtBQUM5QixVQUFLLFFBQVEsS0FBSyxRQUFRLFFBQVEsSUFBSSxNQUFPLFlBQVksQ0FBQyxFQUFFLEtBQUssWUFBWSxNQUFNO0FBQy9FO0FBQ0osVUFBSSxZQUFZLE9BQU8sUUFBUTtBQUMvQixVQUFJLGNBQWMsVUFBYSxjQUFjLE1BQU07QUFDL0MsY0FBTSxJQUFJLE1BQU0sYUFBYSxXQUFXLHlCQUF5QixLQUFLLElBQUksUUFBUSxjQUFjLFNBQVM7QUFBQSxNQUM3RztBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUEsRUFFTyxPQUFPLFNBQVM7QUFFbkIsUUFBSSxXQUFXO0FBQ2YsUUFBSSxRQUFRLGdCQUFnQixPQUFPO0FBQy9CLGlCQUFXLENBQUMsT0FBTztBQUFBLElBQ3ZCO0FBRUEsU0FBSyxLQUFLLEtBQUssbUJBQW1CLEtBQUssSUFBSSxPQUFRLFNBQVMsV0FBVyxJQUFJLFdBQVcsVUFBVztBQUVqRyxRQUFJLHFCQUFxQjtBQUN6QixRQUFJLE1BQU0sQ0FBQztBQUVYLGFBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxRQUFRLEtBQUs7QUFFdEMsVUFBSSxTQUFTLFNBQVMsQ0FBQztBQUV2QixXQUFLLGVBQWUsUUFBUSxDQUFDLEtBQUssSUFBSSxjQUFjLEVBQUUsSUFBSSxDQUFDO0FBRTNELFVBQUksV0FBVyxLQUFLLGtCQUFrQixNQUFNO0FBRTVDLFVBQUk7QUFFQSxZQUFJLGFBQWEsR0FBRyxjQUFjLEtBQUssSUFBSSxLQUFLO0FBQ2hELFlBQUksS0FBSyxXQUFXLFVBQVU7QUFFOUIsaUJBQVMsS0FBSyxJQUFJLGNBQWMsRUFBRSxJQUFJLElBQUk7QUFDMUMsaUJBQVMsS0FBSyxJQUFJO0FBR2xCLG1CQUFXLE9BQU8sUUFBUTtBQUMxQjtBQUVBLGFBQUssT0FBTyxlQUFlLFFBQVE7QUFDbkMsYUFBSyxPQUFPLCtCQUErQixRQUFRO0FBRW5ELFlBQUkscUJBQXFCLEdBQUc7QUFDeEIsY0FBSSxLQUFLLFNBQVMsS0FBSyxJQUFJLGNBQWMsRUFBRSxJQUFJLENBQUM7QUFDaEQsZUFBSyxLQUFLLEtBQUssd0JBQXdCLEtBQUssSUFBSSxPQUFPLFNBQVMsS0FBSyxJQUFJLGNBQWMsRUFBRSxJQUFJLENBQUM7QUFBQSxRQUNsRyxPQUFPO0FBQ0gsZUFBSyxLQUFLLEtBQUssNkJBQTZCLEtBQUssSUFBSSxLQUFLO0FBQUEsUUFDOUQ7QUFBQSxNQUdKLFNBQVMsR0FBRztBQUNSLGFBQUssS0FBSyxNQUFNLDBCQUEwQixLQUFLLElBQUksT0FBUSxTQUFTLFdBQVcsSUFBSSxXQUFXLFlBQWEsQ0FBQztBQUM1RyxhQUFLLEtBQUssS0FBSyxxREFBcUQsS0FBSyxJQUFJLE9BQU8sU0FBUyxLQUFLLElBQUksY0FBYyxFQUFFLElBQUksQ0FBQztBQUMzSCxZQUFJLFNBQVMsS0FBSyxJQUFJLGNBQWMsRUFBRSxJQUFJLEdBQUc7QUFDekMsY0FBSTtBQUNBLGlCQUFLLE9BQU8sU0FBUyxLQUFLLElBQUksY0FBYyxFQUFFLElBQUksQ0FBQztBQUFBLFVBQ3ZELFNBQVMsS0FBSztBQUNWLGlCQUFLLEtBQUssTUFBTSwyREFBMkQsS0FBSyxJQUFJLE9BQU8sU0FBUyxLQUFLLElBQUksY0FBYyxFQUFFLElBQUksR0FBRyxHQUFHO0FBQUEsVUFDM0k7QUFBQSxRQUNKO0FBQ0EsY0FBTTtBQUFBLE1BQ1Y7QUFBQSxJQUNKO0FBRUEsUUFBSSxRQUFRLGdCQUFnQjtBQUN4QixhQUFPLElBQUksQ0FBQztBQUFBO0FBRVosYUFBTztBQUFBLEVBQ2Y7QUFBQTtBQUFBLEVBR08sT0FBTyxRQUFRO0FBRWxCLFNBQUssS0FBSyxLQUFLLDBCQUEwQixLQUFLLElBQUksT0FBTyxXQUFXLFNBQVksT0FBTyxLQUFLLElBQUksY0FBYyxFQUFFLElBQUksSUFBSSxNQUFNO0FBRTlILFFBQUksV0FBVyxVQUFhLFdBQVcsTUFBTTtBQUN6QyxZQUFNLElBQUksTUFBTSxpQ0FBaUMsTUFBTTtBQUFBLElBQzNEO0FBRUEsUUFBSSxvQkFBb0IsS0FBSyxJQUFJLHVCQUF1QixFQUNuRCxPQUFPLFNBQVUsVUFBVTtBQUN4QixhQUFPLFNBQVMsY0FBYyxTQUFTLFdBQVcsUUFBUSxRQUFRLElBQUk7QUFBQSxJQUMxRSxDQUFDLEVBQ0EsSUFBSSxTQUFVLFVBQVU7QUFDckIsYUFBTyxTQUFTO0FBQUEsSUFDcEIsQ0FBQztBQUNMLFNBQUssZUFBZSxRQUFRLGlCQUFpQjtBQUU3QyxRQUFJLFdBQVcsS0FBSyxrQkFBa0IsTUFBTTtBQUM1QyxhQUFTLEtBQUssSUFBSSxjQUFjLEVBQUUsSUFBSSxJQUFJLE9BQU8sS0FBSztBQUN0RCxhQUFTLEtBQUssSUFBSSxPQUFPLEtBQUs7QUFFOUIsUUFBSTtBQUNBLFdBQUssT0FBTyxzQkFBc0IsUUFBUTtBQUUxQyxVQUFJLGFBQWEsR0FBRyxjQUFjLEtBQUssSUFBSSxLQUFLO0FBQ2hELGlCQUFXLE9BQU8sRUFBRSxPQUFPLE9BQU8sS0FBSyxFQUFFLEdBQUcsUUFBUTtBQUVwRCxXQUFLLEtBQUssS0FBSyx5QkFBeUIsS0FBSyxJQUFJLE9BQU8sU0FBUyxLQUFLLElBQUksY0FBYyxFQUFFLElBQUksQ0FBQztBQUUvRixhQUFPO0FBQUEsSUFDWCxTQUFTLEdBQUc7QUFDUixXQUFLLEtBQUssTUFBTSwwQkFBMEIsS0FBSyxJQUFJLE9BQU8sV0FBVyxTQUFZLE9BQU8sS0FBSyxJQUFJLGNBQWMsRUFBRSxJQUFJLElBQUksUUFBUSxDQUFDO0FBQ2xJLFlBQU07QUFBQSxJQUNWO0FBQUEsRUFDSjtBQUFBO0FBQUEsRUFHTyxPQUFPLElBQUk7QUFFZCxRQUFJLE1BQU0sQ0FBQztBQUNYLFFBQUksVUFBVSxXQUFXLEdBQUc7QUFDeEIsWUFBTSxLQUFLLEtBQUs7QUFBQSxRQUNaLFdBQVcsQ0FBQyxLQUFLLElBQUksY0FBYyxFQUFFLElBQUk7QUFBQSxNQUM3QyxDQUFDLEVBQUUsSUFBSSxTQUFVLEtBQUs7QUFDbEIsZUFBTyxJQUFJLEtBQUssSUFBSSxjQUFjLEVBQUUsSUFBSTtBQUFBLE1BQzVDLEVBQUUsS0FBSyxJQUFJLENBQUM7QUFBQSxJQUNoQixPQUFPO0FBQ0gsVUFBSSxVQUFVLENBQUMsRUFBRSxnQkFBZ0IsT0FBTztBQUNwQyxjQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFBQSxNQUN2QixPQUFPO0FBQ0gsY0FBTSxVQUFVLENBQUM7QUFBQSxNQUNyQjtBQUFBLElBQ0o7QUFFQSxTQUFLLEtBQUssS0FBSyxjQUFjLEtBQUssSUFBSSxTQUFVLFFBQVEsVUFBYSxJQUFJLFdBQVcsSUFBSyxNQUFNLElBQUksQ0FBQyxJQUFJLGFBQWEsSUFBSSxTQUFTLFlBQVk7QUFHOUksYUFBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUVqQyxVQUFJLEtBQUssSUFBSSxDQUFDO0FBRWQsVUFBSSxJQUFJLFNBQVM7QUFDYixhQUFLLEtBQUssS0FBSywwQkFBMEIsS0FBSyxJQUFJLE9BQU8sRUFBRTtBQUUvRCxVQUFJLE9BQU8sVUFBYSxPQUFPLE1BQU07QUFDakMsY0FBTSxJQUFJLE1BQU0sdUNBQXVDLEVBQUU7QUFBQSxNQUM3RDtBQUVBLFVBQUk7QUFFQSxhQUFLLE9BQU8sc0JBQXNCLEVBQUU7QUFFcEMsWUFBSSxhQUFhLEdBQUcsY0FBYyxLQUFLLElBQUksS0FBSztBQUNoRCxtQkFBVyxPQUFPLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFBQSxNQUVuQyxTQUFTLEdBQUc7QUFDUixhQUFLLEtBQUssTUFBTSxpQ0FBaUMsS0FBSyxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ3RFLGNBQU07QUFBQSxNQUNWO0FBQUEsSUFFSjtBQUFBLEVBRUo7QUFBQSxFQUVPLE9BQU8sZUFBZSxTQUFTO0FBQ2xDLFNBQUssS0FBSyxLQUFLLDJEQUEyRCxnQkFBZ0IsT0FBTyxVQUFVLENBQUMsTUFBTSxXQUFXLFFBQVEsTUFBTSxLQUFLLFVBQVUsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUN2SyxVQUFNLE1BQU0sa0JBQWtCO0FBQUEsRUFDbEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxLQUFLLElBQUksUUFBUSxRQUFRO0FBRTVCLFFBQUksT0FBTyxVQUFVLENBQUMsTUFBTSxVQUFVO0FBQ2xDLFdBQUssVUFBVSxDQUFDLEVBQUU7QUFDbEIsZUFBUyxVQUFVLENBQUMsRUFBRSxXQUFXLFVBQVUsQ0FBQyxFQUFFO0FBQzlDLGVBQVMsVUFBVSxDQUFDLEVBQUUsV0FBVyxVQUFVLENBQUMsRUFBRTtBQUFBLElBQ2xEO0FBRUEsU0FBSyxLQUFLLEtBQUsscUVBQXFFLEtBQUssSUFBSSxPQUFPLElBQUksUUFBUSxNQUFNO0FBRXRILFFBQUksT0FBTyxVQUFhLE9BQU8sTUFBTTtBQUNqQyxZQUFNLElBQUksTUFBTSx1Q0FBdUMsRUFBRTtBQUFBLElBQzdEO0FBRUEsUUFBSTtBQUNBLFVBQUk7QUFDSixVQUFJLFdBQVcsUUFBVztBQUN0QixZQUFJLE9BQU8sZ0JBQWdCLE9BQU87QUFDOUIsY0FBSSxPQUFPLGdCQUFnQixRQUFRO0FBQy9CLHFCQUFTLE9BQU8sTUFBTSxHQUFHLEVBQUUsSUFBSSxTQUFVLEtBQUs7QUFDMUMsa0JBQUksSUFBSSxnQkFBZ0I7QUFDcEIsc0JBQU0sTUFBTSxvRkFBcUYsT0FBTyxHQUFJO0FBQ2hILHFCQUFPLElBQUksS0FBSztBQUFBLFlBQ3BCLENBQUM7QUFBQSxVQUNMLE9BQU87QUFDSCxrQkFBTSxNQUFNLG1GQUFvRixPQUFPLE1BQU87QUFBQSxVQUNsSDtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBRUEsVUFBSSxXQUFXLFVBQWEsV0FBVyxRQUFXO0FBQzlDLGVBQU8sS0FBSyxLQUFLLElBQUksY0FBYyxFQUFFLElBQUk7QUFBQSxNQUM3QztBQUVBLFVBQUksU0FBUyxDQUFDO0FBQ2QsYUFBTyxLQUFLLElBQUk7QUFFaEIsVUFBSSxhQUFhLEdBQUcsY0FBYyxLQUFLLElBQUksS0FBSztBQUNoRCxVQUFJLFdBQVcsUUFBVztBQUN0QixpQkFBUyxXQUFXLEtBQUssUUFBUSxNQUFNO0FBQUEsTUFDM0MsT0FBTztBQUNILGlCQUFTLFdBQVcsWUFBWSxFQUFFO0FBQUEsTUFDdEM7QUFHQSxVQUFJLFFBQVE7QUFDUixhQUFLLEtBQUssS0FBSyx1QkFBdUIsS0FBSyxJQUFJLE9BQU8sRUFBRTtBQUN4RCxhQUFLLE9BQU8sY0FBYyxNQUFNO0FBQUEsTUFDcEMsT0FBTztBQUNILGFBQUssS0FBSyxLQUFLLDJCQUEyQixLQUFLLElBQUksT0FBTyxFQUFFO0FBQUEsTUFDaEU7QUFDQSxhQUFPO0FBQUEsSUFDWCxTQUFTLEdBQUc7QUFDUixXQUFLLEtBQUssTUFBTSxrQ0FBa0MsS0FBSyxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ3ZFLFlBQU07QUFBQSxJQUNWO0FBQUEsRUFDSjtBQUFBLEVBRU8sUUFBZ0I7QUFFbkIsU0FBSyxLQUFLLEtBQUssY0FBYyxLQUFLLElBQUksUUFBUSxXQUFXO0FBRXpELFFBQUksUUFBUTtBQUNaLFFBQUk7QUFDQSxVQUFJLGFBQWEsR0FBRyxjQUFjLEtBQUssSUFBSSxLQUFLO0FBQ2hELGNBQVEsV0FBVyxNQUFNO0FBQUEsSUFDN0IsU0FBUyxHQUFHO0FBQ1IsV0FBSyxLQUFLLE1BQU0sK0JBQStCLEtBQUssSUFBSSxPQUFPLENBQUM7QUFFaEUsWUFBTTtBQUFBLElBQ1Y7QUFFQSxTQUFLLEtBQUssS0FBSywwQkFBMEIsT0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFJLEtBQUs7QUFFdEUsV0FBTztBQUFBLEVBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWU8sS0FBSyxVQUFVO0FBRWxCLGVBQVcsWUFBWSxDQUFDO0FBRXhCLFFBQUksU0FBUyxTQUFTLFdBQVcsU0FBUztBQUMxQyxRQUFJLFdBQVcsUUFBVztBQUN0QixVQUFJLE9BQU8sZ0JBQWdCLE9BQU87QUFDOUIsWUFBSSxPQUFPLGdCQUFnQixRQUFRO0FBQy9CLGNBQUksT0FBTyxRQUFRLEdBQUcsSUFBSSxJQUFJO0FBQzFCLHFCQUFTLFVBQVUsT0FBTyxNQUFNLEdBQUcsRUFBRSxJQUFJLFNBQVUsS0FBSztBQUNwRCxrQkFBSSxJQUFJLGdCQUFnQjtBQUNwQixzQkFBTSxNQUFNLG9GQUFxRixPQUFPLEdBQUk7QUFDaEgscUJBQU8sSUFBSSxLQUFLO0FBQUEsWUFDcEIsQ0FBQztBQUFBLFVBQ0wsT0FBTztBQUNILHFCQUFTLFVBQVUsQ0FBQyxNQUFNO0FBQUEsVUFDOUI7QUFBQSxRQUNKLE9BQU87QUFDSCxnQkFBTSxNQUFNLG1GQUFvRixPQUFPLE1BQU87QUFBQSxRQUNsSDtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBRUEsUUFBSSxTQUFTLFNBQVMsV0FBVyxTQUFTO0FBQzFDLFFBQUksV0FBVyxRQUFXO0FBQ3RCLFVBQUksT0FBTyxnQkFBZ0IsT0FBTztBQUM5QixZQUFJLE9BQU8sZ0JBQWdCLFFBQVE7QUFDL0IsY0FBSSxPQUFPLFFBQVEsR0FBRyxJQUFJLElBQUk7QUFDMUIscUJBQVMsVUFBVSxPQUFPLE1BQU0sR0FBRyxFQUFFLElBQUksU0FBVSxLQUFLO0FBQ3BELGtCQUFJLElBQUksZ0JBQWdCO0FBQ3BCLHNCQUFNLE1BQU0sb0ZBQXFGLE9BQU8sR0FBSTtBQUNoSCxxQkFBTyxJQUFJLEtBQUs7QUFBQSxZQUNwQixDQUFDO0FBQUEsVUFDTCxPQUFPO0FBQ0gscUJBQVMsVUFBVSxDQUFDLE1BQU07QUFBQSxVQUM5QjtBQUFBLFFBQ0osT0FBTztBQUNILGdCQUFNLE1BQU0sbUZBQW9GLE9BQU8sTUFBTztBQUFBLFFBQ2xIO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFFQSxRQUFJLFdBQVcsQ0FBQztBQUNoQixhQUFTLE9BQU8sVUFBVTtBQUN0QixlQUFTLEtBQUssTUFBTSxNQUFNLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRztBQUFBLElBQ3ZEO0FBRUEsU0FBSyxLQUFLLEtBQUssd0RBQXdELEtBQUssSUFBSSxPQUFPLFNBQVMsS0FBSyxHQUFHLENBQUM7QUFFekcsUUFBSSxTQUFTLFlBQVksVUFBYSxXQUFXLFFBQVc7QUFDeEQsZUFBUyxRQUFRLEtBQUssS0FBSyxJQUFJLGNBQWMsRUFBRSxJQUFJO0FBQUEsSUFDdkQ7QUFHQSxRQUFJLFNBQVMsU0FBUztBQUNsQixVQUFJLFNBQVMsUUFBUSxRQUFRLEdBQUcsSUFBSSxJQUFJO0FBQ3BDLGlCQUFTLFVBQVUsU0FBUyxRQUFRLE1BQU0sR0FBRztBQUFBLE1BQ2pELE9BQU87QUFDSCxpQkFBUyxVQUFVLENBQUMsU0FBUyxPQUFPO0FBQUEsTUFDeEM7QUFDQSxlQUFTLFVBQVUsU0FBUyxRQUFRLE9BQU8sU0FBVSxhQUFhO0FBQzlELFlBQUksT0FBTyxLQUFLLGNBQWMsSUFBSSxZQUFZLFdBQVc7QUFDekQsWUFBSSxTQUFTLFVBQWEsS0FBSyxLQUFLLFlBQVksTUFBTSxhQUFhLFNBQVMsS0FBSyxJQUFJLE1BQU07QUFDdkYsaUJBQU87QUFDWCxpQkFBUyxLQUFLLElBQUksSUFBSSxNQUFNLFNBQVMsS0FBSyxJQUFJLElBQUk7QUFDbEQsZUFBTztBQUFBLE1BQ1gsRUFBRSxLQUFLLElBQUksQ0FBQztBQUFBLElBQ2hCO0FBRUEsUUFBSTtBQUNBLFVBQUksV0FBVyxDQUFDO0FBQ2hCLFVBQUksYUFBYSxHQUFHLGNBQWMsS0FBSyxJQUFJLEtBQUs7QUFDaEQsVUFBSSxTQUFTLFdBQVcsS0FBSztBQUM3QixhQUFPLE9BQU8sUUFBUSxHQUFHO0FBQ3JCLGlCQUFTLEtBQUssT0FBTyxLQUFLLENBQUM7QUFBQSxNQUMvQjtBQUVBLFdBQUssS0FBSyxLQUFLLHdCQUF3QixTQUFTLFFBQVEsS0FBSyxJQUFJLEtBQUs7QUFFdEUsYUFBTztBQUFBLElBQ1gsU0FBUyxHQUFHO0FBQ1IsV0FBSyxLQUFLLE1BQU0sK0JBQStCLEtBQUssSUFBSSxPQUFPLENBQUM7QUFDaEUsWUFBTTtBQUFBLElBQ1Y7QUFBQSxFQUNKO0FBQUEsRUFFTyxjQUF1QjtBQUMxQixXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRU8sY0FBb0I7QUFBQSxFQUMzQjtBQUFBLEVBRU8sWUFBaUI7QUFDcEIsV0FBTztBQUFBLEVBQ1g7QUFDSjtBQU1PLFNBQVMsT0FBTyxhQUFhLFlBQVksZ0JBQWdCLGNBQWM7QUFDMUUsTUFBSTtBQUVKLFFBQU07QUFFTixNQUFJLGNBQWMsUUFBUSxJQUFJLGVBQWUsTUFBTSxjQUFjO0FBQ2pFLE1BQUksQ0FBQyxhQUFhO0FBQ2Qsa0JBQWM7QUFDZCxZQUFRLElBQUksZUFBZSxNQUFNLGdCQUFnQixXQUFXO0FBQUEsRUFDaEU7QUFFQSxTQUFPLElBQUksSUFBSSxLQUFLLFVBQVU7QUFDbEM7QUFBQztBQUVNLFNBQVMsSUFBSSxhQUFhLFlBQVksZ0JBQWdCLGNBQWM7QUFDdkUsU0FBTyxPQUFPLGFBQWEsWUFBWSxnQkFBZ0IsWUFBWTtBQUN2RTsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as client from "./client";
|
|
2
|
+
import * as dao from "./dao";
|
|
3
|
+
export {
|
|
4
|
+
client,
|
|
5
|
+
dao
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL21vbmdvZGIvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCAqIGFzIGNsaWVudCBmcm9tIFwiLi9jbGllbnRcIjtcbmV4cG9ydCAqIGFzIGRhbyBmcm9tIFwiLi9kYW9cIjsiXSwKICAibWFwcGluZ3MiOiAiQUFBQSxZQUFZLFlBQVk7QUFDeEIsWUFBWSxTQUFTOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const WEBSOCKET_METADATA_KEY = Symbol("websocket:metadata");
|
|
2
|
+
function Websocket(options) {
|
|
3
|
+
return function(target, context) {
|
|
4
|
+
if (context.kind !== "class") {
|
|
5
|
+
throw new Error(`@Websocket can only be used on classes.`);
|
|
6
|
+
}
|
|
7
|
+
Object.defineProperty(target, WEBSOCKET_METADATA_KEY, {
|
|
8
|
+
value: {
|
|
9
|
+
name: options.name,
|
|
10
|
+
endpoint: options.endpoint
|
|
11
|
+
},
|
|
12
|
+
writable: false,
|
|
13
|
+
configurable: false,
|
|
14
|
+
enumerable: true
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
Websocket
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25ldC9kZWNvcmF0b3JzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBXRUJTT0NLRVRfTUVUQURBVEFfS0VZID0gU3ltYm9sKFwid2Vic29ja2V0Om1ldGFkYXRhXCIpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYnNvY2tldE9wdGlvbnMge1xuICAgIG5hbWU6IHN0cmluZzsgLy8gZS5nLiwgXCJNeVdlYnNjb2tldFwiXG4gICAgZW5kcG9pbnQ6IHN0cmluZzsgICAgICAvLyBlLmcuLCBcIm15LXdzXCJcbn1cblxuLyoqXG4gKiBAV2Vic29ja2V0IGRlY29yYXRvclxuICogTWFya3MgYW4gZW50aXJlIGNsYXNzIGFzIGEgd2Vic29ja2V0XG4gKlxuICogaW50cm9kdWNlZCBpbiBUeXBlU2NyaXB0IDUuMCwgd2hpY2ggZXhwZWN0cyBhIENsYXNzRGVjb3JhdG9yQ29udGV4dCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBXZWJzb2NrZXQob3B0aW9uczogV2Vic29ja2V0T3B0aW9ucykge1xuICAgIFxuICAgIHJldHVybiBmdW5jdGlvbiA8VCBleHRlbmRzIGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55KSA9PiBhbnk+KHRhcmdldDogVCwgY29udGV4dDogQ2xhc3NEZWNvcmF0b3JDb250ZXh0PFQ+KSB7XG4gICAgICAgIFxuICAgICAgICBpZiAoY29udGV4dC5raW5kICE9PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBXZWJzb2NrZXQgY2FuIG9ubHkgYmUgdXNlZCBvbiBjbGFzc2VzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgV0VCU09DS0VUX01FVEFEQVRBX0tFWSwge1xuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgICAgICAgZW5kcG9pbnQ6IG9wdGlvbnMuZW5kcG9pbnRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBQUEsTUFBTSx5QkFBeUIsT0FBTyxvQkFBb0I7QUFhbkQsU0FBUyxVQUFVLFNBQTJCO0FBRWpELFNBQU8sU0FBd0QsUUFBVyxTQUFtQztBQUV6RyxRQUFJLFFBQVEsU0FBUyxTQUFTO0FBQzFCLFlBQU0sSUFBSSxNQUFNLHlDQUF5QztBQUFBLElBQzdEO0FBRUEsV0FBTyxlQUFlLFFBQVEsd0JBQXdCO0FBQUEsTUFDbEQsT0FBTztBQUFBLFFBQ0gsTUFBTSxRQUFRO0FBQUEsUUFDZCxVQUFVLFFBQVE7QUFBQSxNQUN0QjtBQUFBLE1BQ0EsVUFBVTtBQUFBLE1BQ1YsY0FBYztBQUFBLE1BQ2QsWUFBWTtBQUFBLElBQ2hCLENBQUM7QUFBQSxFQUNMO0FBQ0o7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from "./soap";
|
|
2
|
+
import { SOAP } from "./soap";
|
|
3
|
+
export * from "./websockets";
|
|
4
|
+
import { Websockets } from "./websockets";
|
|
5
|
+
import * as decorators from "./decorators";
|
|
6
|
+
export * from "./decorators";
|
|
7
|
+
export {
|
|
8
|
+
decorators,
|
|
9
|
+
SOAP as soap,
|
|
10
|
+
Websockets as websockets
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25ldC9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSBcIi4vc29hcFwiO1xuZXhwb3J0IHsgU09BUCBhcyBzb2FwIH0gZnJvbSBcIi4vc29hcFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vd2Vic29ja2V0c1wiO1xuZXhwb3J0IHsgV2Vic29ja2V0cyBhcyB3ZWJzb2NrZXRzIH0gZnJvbSBcIi4vd2Vic29ja2V0c1wiO1xuZXhwb3J0ICogYXMgZGVjb3JhdG9ycyBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsY0FBYztBQUNkLFNBQWlCLFlBQVk7QUFDN0IsY0FBYztBQUNkLFNBQXVCLGtCQUFrQjtBQUN6QyxZQUFZLGdCQUFnQjtBQUM1QixjQUFjOyIsCiAgIm5hbWVzIjogW10KfQo=
|