@aerokit/sdk 12.80.0 → 12.82.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/dist/cjs/bpm/deployer.js +1 -1
- package/dist/cjs/bpm/index.js +1 -1
- package/dist/cjs/bpm/process.js +1 -1
- package/dist/cjs/bpm/tasks.js +1 -1
- package/dist/cjs/bpm/tracer.js +1 -1
- package/dist/cjs/bpm/values.js +1 -1
- package/dist/cjs/cache/cache.js +1 -1
- package/dist/cjs/cache/index.js +1 -1
- package/dist/cjs/cms/cmis.js +1 -1
- package/dist/cjs/cms/index.js +1 -1
- package/dist/cjs/component/decorators.js +1 -1
- package/dist/cjs/component/index.js +1 -1
- package/dist/cjs/core/configurations.js +1 -1
- package/dist/cjs/core/context.js +1 -1
- package/dist/cjs/core/env.js +1 -1
- package/dist/cjs/core/globals.js +1 -1
- package/dist/cjs/core/index.js +1 -1
- package/dist/cjs/db/dao.js +1 -1
- package/dist/cjs/db/database.js +1 -1
- package/dist/cjs/db/decorators.js +1 -1
- package/dist/cjs/db/index.js +1 -1
- package/dist/cjs/db/insert.js +1 -1
- package/dist/cjs/db/orm.js +1 -1
- package/dist/cjs/db/ormstatements.js +1 -1
- package/dist/cjs/db/procedure.js +1 -1
- package/dist/cjs/db/query.js +1 -1
- package/dist/cjs/db/repository.js +1 -1
- package/dist/cjs/db/sequence.js +1 -1
- package/dist/cjs/db/sql.js +1 -1
- package/dist/cjs/db/store.js +1 -1
- package/dist/cjs/db/translator.js +1 -1
- package/dist/cjs/db/update.js +1 -1
- package/dist/cjs/etcd/client.js +1 -1
- package/dist/cjs/etcd/index.js +1 -1
- package/dist/cjs/extensions/decorators.js +1 -1
- package/dist/cjs/extensions/extensions.js +1 -1
- package/dist/cjs/extensions/index.js +1 -1
- package/dist/cjs/git/client.js +1 -1
- package/dist/cjs/git/index.js +1 -1
- package/dist/cjs/http/client-async.js +1 -1
- package/dist/cjs/http/client.js +1 -1
- package/dist/cjs/http/decorators.js +1 -1
- package/dist/cjs/http/errors/ForbiddenError.js +1 -1
- package/dist/cjs/http/errors/ValidationError.js +1 -1
- package/dist/cjs/http/errors.js +1 -1
- package/dist/cjs/http/index.js +1 -1
- package/dist/cjs/http/request.js +1 -1
- package/dist/cjs/http/response.js +1 -1
- package/dist/cjs/http/rs/resource-http-controller.js +1 -1
- package/dist/cjs/http/rs/resource-mappings.js +1 -1
- package/dist/cjs/http/rs/resource-method.js +1 -1
- package/dist/cjs/http/rs/resource.js +1 -1
- package/dist/cjs/http/rs.js +1 -1
- package/dist/cjs/http/session.js +1 -1
- package/dist/cjs/http/upload.js +1 -1
- package/dist/cjs/http/utils.js +1 -1
- package/dist/cjs/indexing/index.js +1 -1
- package/dist/cjs/indexing/searcher.js +1 -1
- package/dist/cjs/indexing/writer.js +1 -1
- package/dist/cjs/integrations/index.js +1 -1
- package/dist/cjs/integrations/integrations.js +1 -1
- package/dist/cjs/io/bytes.js +1 -1
- package/dist/cjs/io/files.js +1 -1
- package/dist/cjs/io/image.js +1 -1
- package/dist/cjs/io/index.js +1 -1
- package/dist/cjs/io/streams.js +1 -1
- package/dist/cjs/io/zip.js +1 -1
- package/dist/cjs/job/decorators.js +1 -1
- package/dist/cjs/job/index.js +1 -1
- package/dist/cjs/job/scheduler.js +1 -1
- package/dist/cjs/junit/index.js +1 -1
- package/dist/cjs/junit/junit.js +1 -1
- package/dist/cjs/kafka/consumer.js +1 -1
- package/dist/cjs/kafka/index.js +1 -1
- package/dist/cjs/kafka/producer.js +1 -1
- package/dist/cjs/log/index.js +1 -1
- package/dist/cjs/log/logging.js +1 -1
- package/dist/cjs/mail/client.js +1 -1
- package/dist/cjs/mail/index.js +1 -1
- package/dist/cjs/messaging/consumer.js +1 -1
- package/dist/cjs/messaging/decorators.js +1 -1
- package/dist/cjs/messaging/index.js +1 -1
- package/dist/cjs/messaging/producer.js +1 -1
- package/dist/cjs/mongodb/client.js +1 -1
- package/dist/cjs/mongodb/dao.js +1 -1
- package/dist/cjs/mongodb/index.js +1 -1
- package/dist/cjs/net/decorators.js +1 -1
- package/dist/cjs/net/index.js +1 -1
- package/dist/cjs/net/soap.js +1 -1
- package/dist/cjs/net/websockets.js +1 -1
- package/dist/cjs/pdf/index.js +1 -1
- package/dist/cjs/pdf/pdf.js +3 -3
- package/dist/cjs/platform/command.js +1 -1
- package/dist/cjs/platform/engines.js +1 -1
- package/dist/cjs/platform/index.js +1 -1
- package/dist/cjs/platform/lifecycle.js +1 -1
- package/dist/cjs/platform/os.js +1 -1
- package/dist/cjs/platform/problems.js +1 -1
- package/dist/cjs/platform/registry.js +1 -1
- package/dist/cjs/platform/repository.js +1 -1
- package/dist/cjs/platform/workspace.js +1 -1
- package/dist/cjs/qldb/index.js +1 -1
- package/dist/cjs/qldb/qldb.js +1 -1
- package/dist/cjs/rabbitmq/consumer.js +1 -1
- package/dist/cjs/rabbitmq/index.js +1 -1
- package/dist/cjs/rabbitmq/producer.js +1 -1
- package/dist/cjs/redis/client.js +1 -1
- package/dist/cjs/redis/index.js +1 -1
- package/dist/cjs/security/decorators.js +1 -1
- package/dist/cjs/security/index.js +1 -1
- package/dist/cjs/security/oauth.js +1 -1
- package/dist/cjs/security/user.js +1 -1
- package/dist/cjs/template/engines.js +1 -1
- package/dist/cjs/template/index.js +1 -1
- package/dist/cjs/utils/alphanumeric.js +2 -2
- package/dist/cjs/utils/base64.js +1 -1
- package/dist/cjs/utils/converter.js +1 -1
- package/dist/cjs/utils/digest.js +1 -1
- package/dist/cjs/utils/escape.js +1 -1
- package/dist/cjs/utils/hex.js +1 -1
- package/dist/cjs/utils/index.js +1 -1
- package/dist/cjs/utils/jsonpath.js +1 -1
- package/dist/cjs/utils/qrcode.js +1 -1
- package/dist/cjs/utils/url.js +1 -1
- package/dist/cjs/utils/utf8.js +1 -1
- package/dist/cjs/utils/uuid.js +1 -1
- package/dist/cjs/utils/xml.js +1 -1
- package/dist/dts/bpm/deployer.d.ts +35 -3
- package/dist/dts/bpm/index.d.ts +14 -0
- package/dist/dts/bpm/process.d.ts +28 -3
- package/dist/dts/bpm/tasks.d.ts +32 -1
- package/dist/dts/bpm/tracer.d.ts +35 -0
- package/dist/dts/bpm/values.d.ts +17 -3
- package/dist/dts/cache/cache.d.ts +38 -0
- package/dist/dts/cache/index.d.ts +10 -0
- package/dist/dts/cms/cmis.d.ts +28 -3
- package/dist/dts/cms/index.d.ts +10 -0
- package/dist/dts/component/decorators.d.ts +35 -5
- package/dist/dts/component/index.d.ts +10 -0
- package/dist/dts/core/configurations.d.ts +43 -4
- package/dist/dts/core/context.d.ts +35 -2
- package/dist/dts/core/env.d.ts +29 -2
- package/dist/dts/core/globals.d.ts +34 -2
- package/dist/dts/core/index.d.ts +13 -0
- package/dist/dts/db/database.d.ts +34 -0
- package/dist/dts/db/decorators.d.ts +55 -2
- package/dist/dts/db/index.d.ts +19 -0
- package/dist/dts/db/orm.d.ts +43 -0
- package/dist/dts/db/procedure.d.ts +37 -0
- package/dist/dts/db/query.d.ts +25 -1
- package/dist/dts/db/repository.d.ts +52 -0
- package/dist/dts/db/sequence.d.ts +31 -2
- package/dist/dts/db/sql.d.ts +33 -0
- package/dist/dts/db/store.d.ts +27 -0
- package/dist/dts/db/translator.d.ts +34 -1
- package/dist/dts/db/update.d.ts +38 -0
- package/dist/dts/etcd/client.d.ts +36 -0
- package/dist/dts/etcd/index.d.ts +10 -0
- package/dist/dts/extensions/decorators.d.ts +28 -0
- package/dist/dts/extensions/extensions.d.ts +30 -1
- package/dist/dts/extensions/index.d.ts +11 -0
- package/dist/dts/git/client.d.ts +28 -0
- package/dist/dts/git/index.d.ts +10 -0
- package/dist/dts/http/client-async.d.ts +29 -1
- package/dist/dts/http/client.d.ts +29 -1
- package/dist/dts/http/decorators.d.ts +38 -0
- package/dist/dts/http/errors/ForbiddenError.d.ts +6 -2
- package/dist/dts/http/errors/ValidationError.d.ts +6 -2
- package/dist/dts/http/errors.d.ts +14 -0
- package/dist/dts/http/index.d.ts +18 -0
- package/dist/dts/http/request.d.ts +30 -3
- package/dist/dts/http/response.d.ts +40 -3
- package/dist/dts/http/rs/resource-mappings.d.ts +30 -0
- package/dist/dts/http/rs.d.ts +38 -0
- package/dist/dts/http/session.d.ts +34 -3
- package/dist/dts/http/upload.d.ts +27 -2
- package/dist/dts/http/utils.d.ts +42 -0
- package/dist/dts/indexing/index.d.ts +11 -0
- package/dist/dts/indexing/searcher.d.ts +35 -2
- package/dist/dts/indexing/writer.d.ts +23 -2
- package/dist/dts/integrations/index.d.ts +10 -0
- package/dist/dts/integrations/integrations.d.ts +27 -3
- package/dist/dts/io/bytes.d.ts +33 -2
- package/dist/dts/io/files.d.ts +34 -2
- package/dist/dts/io/image.d.ts +27 -2
- package/dist/dts/io/index.d.ts +14 -0
- package/dist/dts/io/streams.d.ts +40 -0
- package/dist/dts/io/zip.d.ts +32 -0
- package/dist/dts/job/decorators.d.ts +29 -0
- package/dist/dts/job/index.d.ts +11 -0
- package/dist/dts/job/scheduler.d.ts +33 -2
- package/dist/dts/junit/index.d.ts +10 -0
- package/dist/dts/junit/junit.d.ts +31 -0
- package/dist/dts/kafka/consumer.d.ts +31 -0
- package/dist/dts/kafka/index.d.ts +11 -0
- package/dist/dts/kafka/producer.d.ts +31 -0
- package/dist/dts/log/index.d.ts +10 -0
- package/dist/dts/log/logging.d.ts +32 -0
- package/dist/dts/mail/client.d.ts +27 -0
- package/dist/dts/mail/index.d.ts +10 -0
- package/dist/dts/messaging/consumer.d.ts +29 -2
- package/dist/dts/messaging/decorators.d.ts +32 -0
- package/dist/dts/messaging/index.d.ts +12 -0
- package/dist/dts/messaging/producer.d.ts +27 -2
- package/dist/dts/mongodb/client.d.ts +37 -0
- package/dist/dts/mongodb/dao.d.ts +53 -0
- package/dist/dts/mongodb/index.d.ts +11 -0
- package/dist/dts/net/decorators.d.ts +27 -0
- package/dist/dts/net/index.d.ts +13 -0
- package/dist/dts/net/soap.d.ts +34 -0
- package/dist/dts/net/websockets.d.ts +34 -0
- package/dist/dts/pdf/index.d.ts +10 -0
- package/dist/dts/pdf/pdf.d.ts +41 -2
- package/dist/dts/platform/command.d.ts +26 -0
- package/dist/dts/platform/engines.d.ts +38 -0
- package/dist/dts/platform/index.d.ts +19 -0
- package/dist/dts/platform/lifecycle.d.ts +29 -0
- package/dist/dts/platform/os.d.ts +30 -0
- package/dist/dts/platform/problems.d.ts +36 -0
- package/dist/dts/platform/registry.d.ts +39 -0
- package/dist/dts/platform/repository.d.ts +40 -0
- package/dist/dts/platform/workspace.d.ts +42 -0
- package/dist/dts/qldb/index.d.ts +12 -0
- package/dist/dts/qldb/qldb.d.ts +14 -0
- package/dist/dts/rabbitmq/consumer.d.ts +24 -3
- package/dist/dts/rabbitmq/index.d.ts +13 -0
- package/dist/dts/rabbitmq/producer.d.ts +20 -3
- package/dist/dts/redis/client.d.ts +31 -3
- package/dist/dts/redis/index.d.ts +12 -0
- package/dist/dts/security/decorators.d.ts +34 -0
- package/dist/dts/security/index.d.ts +14 -0
- package/dist/dts/security/oauth.d.ts +27 -0
- package/dist/dts/security/user.d.ts +39 -0
- package/dist/dts/template/engines.d.ts +31 -0
- package/dist/dts/template/index.d.ts +12 -0
- package/dist/dts/utils/alphanumeric.d.ts +36 -2
- package/dist/dts/utils/base64.d.ts +30 -0
- package/dist/dts/utils/converter.d.ts +37 -2
- package/dist/dts/utils/digest.d.ts +31 -0
- package/dist/dts/utils/escape.d.ts +28 -3
- package/dist/dts/utils/hex.d.ts +30 -0
- package/dist/dts/utils/index.d.ts +23 -0
- package/dist/dts/utils/jsonpath.d.ts +43 -0
- package/dist/dts/utils/qrcode.d.ts +24 -3
- package/dist/dts/utils/url.d.ts +37 -3
- package/dist/dts/utils/utf8.d.ts +34 -3
- package/dist/dts/utils/uuid.d.ts +28 -2
- package/dist/dts/utils/xml.d.ts +31 -2
- package/dist/esm/bpm/deployer.mjs +1 -1
- package/dist/esm/bpm/index.mjs +1 -1
- package/dist/esm/bpm/process.mjs +1 -1
- package/dist/esm/bpm/tasks.mjs +1 -1
- package/dist/esm/bpm/tracer.mjs +1 -1
- package/dist/esm/bpm/values.mjs +1 -1
- package/dist/esm/cache/cache.mjs +1 -1
- package/dist/esm/cache/index.mjs +1 -1
- package/dist/esm/cms/cmis.mjs +1 -1
- package/dist/esm/cms/index.mjs +1 -1
- package/dist/esm/component/decorators.mjs +1 -1
- package/dist/esm/component/index.mjs +1 -1
- package/dist/esm/core/configurations.mjs +1 -1
- package/dist/esm/core/context.mjs +1 -1
- package/dist/esm/core/env.mjs +1 -1
- package/dist/esm/core/globals.mjs +1 -1
- package/dist/esm/core/index.mjs +1 -1
- package/dist/esm/db/dao.mjs +1 -1
- package/dist/esm/db/database.mjs +1 -1
- package/dist/esm/db/decorators.mjs +1 -1
- package/dist/esm/db/index.mjs +1 -1
- package/dist/esm/db/insert.mjs +1 -1
- package/dist/esm/db/orm.mjs +1 -1
- package/dist/esm/db/ormstatements.mjs +1 -1
- package/dist/esm/db/procedure.mjs +1 -1
- package/dist/esm/db/query.mjs +1 -1
- package/dist/esm/db/repository.mjs +1 -1
- package/dist/esm/db/sequence.mjs +1 -1
- package/dist/esm/db/sql.mjs +1 -1
- package/dist/esm/db/store.mjs +1 -1
- package/dist/esm/db/translator.mjs +1 -1
- package/dist/esm/db/update.mjs +1 -1
- package/dist/esm/etcd/client.mjs +1 -1
- package/dist/esm/etcd/index.mjs +1 -1
- package/dist/esm/extensions/decorators.mjs +1 -1
- package/dist/esm/extensions/extensions.mjs +1 -1
- package/dist/esm/extensions/index.mjs +1 -1
- package/dist/esm/git/client.mjs +1 -1
- package/dist/esm/git/index.mjs +1 -1
- package/dist/esm/http/client-async.mjs +1 -1
- package/dist/esm/http/client.mjs +1 -1
- package/dist/esm/http/decorators.mjs +1 -1
- package/dist/esm/http/errors/ForbiddenError.mjs +1 -1
- package/dist/esm/http/errors/ValidationError.mjs +1 -1
- package/dist/esm/http/errors.mjs +1 -1
- package/dist/esm/http/index.mjs +1 -1
- package/dist/esm/http/request.mjs +1 -1
- package/dist/esm/http/response.mjs +1 -1
- package/dist/esm/http/rs/resource-http-controller.mjs +1 -1
- package/dist/esm/http/rs/resource-mappings.mjs +1 -1
- package/dist/esm/http/rs/resource-method.mjs +1 -1
- package/dist/esm/http/rs/resource.mjs +1 -1
- package/dist/esm/http/rs.mjs +1 -1
- package/dist/esm/http/session.mjs +1 -1
- package/dist/esm/http/upload.mjs +1 -1
- package/dist/esm/http/utils.mjs +1 -1
- package/dist/esm/indexing/index.mjs +1 -1
- package/dist/esm/indexing/searcher.mjs +1 -1
- package/dist/esm/indexing/writer.mjs +1 -1
- package/dist/esm/integrations/index.mjs +1 -1
- package/dist/esm/integrations/integrations.mjs +1 -1
- package/dist/esm/io/bytes.mjs +1 -1
- package/dist/esm/io/files.mjs +1 -1
- package/dist/esm/io/image.mjs +1 -1
- package/dist/esm/io/index.mjs +1 -1
- package/dist/esm/io/streams.mjs +1 -1
- package/dist/esm/io/zip.mjs +1 -1
- package/dist/esm/job/decorators.mjs +1 -1
- package/dist/esm/job/index.mjs +1 -1
- package/dist/esm/job/scheduler.mjs +1 -1
- package/dist/esm/junit/index.mjs +1 -1
- package/dist/esm/junit/junit.mjs +1 -1
- package/dist/esm/kafka/consumer.mjs +1 -1
- package/dist/esm/kafka/index.mjs +1 -1
- package/dist/esm/kafka/producer.mjs +1 -1
- package/dist/esm/log/index.mjs +1 -1
- package/dist/esm/log/logging.mjs +1 -1
- package/dist/esm/mail/client.mjs +1 -1
- package/dist/esm/mail/index.mjs +1 -1
- package/dist/esm/messaging/consumer.mjs +1 -1
- package/dist/esm/messaging/decorators.mjs +1 -1
- package/dist/esm/messaging/index.mjs +1 -1
- package/dist/esm/messaging/producer.mjs +1 -1
- package/dist/esm/mongodb/client.mjs +2 -2
- package/dist/esm/mongodb/dao.mjs +1 -1
- package/dist/esm/mongodb/index.mjs +1 -1
- package/dist/esm/net/decorators.mjs +1 -1
- package/dist/esm/net/index.mjs +1 -1
- package/dist/esm/net/soap.mjs +1 -1
- package/dist/esm/net/websockets.mjs +1 -1
- package/dist/esm/pdf/index.mjs +1 -1
- package/dist/esm/pdf/pdf.mjs +3 -3
- package/dist/esm/platform/command.mjs +1 -1
- package/dist/esm/platform/engines.mjs +1 -1
- package/dist/esm/platform/index.mjs +1 -1
- package/dist/esm/platform/lifecycle.mjs +1 -1
- package/dist/esm/platform/os.mjs +1 -1
- package/dist/esm/platform/problems.mjs +1 -1
- package/dist/esm/platform/registry.mjs +1 -1
- package/dist/esm/platform/repository.mjs +1 -1
- package/dist/esm/platform/workspace.mjs +1 -1
- package/dist/esm/qldb/index.mjs +1 -1
- package/dist/esm/qldb/qldb.mjs +1 -1
- package/dist/esm/rabbitmq/consumer.mjs +1 -1
- package/dist/esm/rabbitmq/index.mjs +1 -1
- package/dist/esm/rabbitmq/producer.mjs +1 -1
- package/dist/esm/redis/client.mjs +1 -1
- package/dist/esm/redis/index.mjs +1 -1
- package/dist/esm/security/decorators.mjs +1 -1
- package/dist/esm/security/index.mjs +1 -1
- package/dist/esm/security/oauth.mjs +1 -1
- package/dist/esm/security/user.mjs +1 -1
- package/dist/esm/template/engines.mjs +1 -1
- package/dist/esm/template/index.mjs +1 -1
- package/dist/esm/utils/alphanumeric.mjs +2 -2
- package/dist/esm/utils/base64.mjs +1 -1
- package/dist/esm/utils/converter.mjs +1 -1
- package/dist/esm/utils/digest.mjs +1 -1
- package/dist/esm/utils/escape.mjs +1 -1
- package/dist/esm/utils/hex.mjs +1 -1
- package/dist/esm/utils/index.mjs +1 -1
- package/dist/esm/utils/jsonpath.mjs +1 -1
- package/dist/esm/utils/qrcode.mjs +1 -1
- package/dist/esm/utils/url.mjs +1 -1
- package/dist/esm/utils/utf8.mjs +1 -1
- package/dist/esm/utils/uuid.mjs +1 -1
- package/dist/esm/utils/xml.mjs +1 -1
- package/package.json +1 -1
package/dist/esm/bpm/tasks.mjs
CHANGED
|
@@ -953,4 +953,4 @@ export {
|
|
|
953
953
|
TaskService,
|
|
954
954
|
Tasks
|
|
955
955
|
};
|
|
956
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS90YXNrcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBBUEkgVGFza3NcbiAqL1xuXG5pbXBvcnQgeyBTdHJlYW1zIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9pb1wiO1xuaW1wb3J0IHsgVmFsdWVzIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9icG0vdmFsdWVzXCI7XG5cbmNvbnN0IEJwbUZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5icG0uQnBtRmFjYWRlXCIpO1xuXG5leHBvcnQgY2xhc3MgVGFza3Mge1xuXG5cdHB1YmxpYyBzdGF0aWMgbGlzdCgpOiBUYXNrRGF0YVtdIHtcblx0XHRjb25zdCB0YXNrczogYW55W10gPSBKU09OLnBhcnNlKEJwbUZhY2FkZS5nZXRUYXNrcygpKTtcblx0XHRyZXR1cm4gdGFza3MubWFwKGUgPT4gbmV3IFRhc2tEYXRhKGUpKTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgZ2V0VmFyaWFibGUodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gVmFsdWVzLnBhcnNlVmFsdWUoQnBtRmFjYWRlLmdldFRhc2tWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWxsIHZhcmlhYmxlcy4gVGhpcyB3aWxsIGluY2x1ZGUgYWxsIHZhcmlhYmxlcyBvZiBwYXJlbnQgc2NvcGVzIHRvby5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0VmFyaWFibGVzKHRhc2tJZDogc3RyaW5nKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcChCcG1GYWNhZGUuZ2V0VGFza1ZhcmlhYmxlcyh0YXNrSWQpKTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgc2V0VmFyaWFibGUodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFRhc2tWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIHNldFZhcmlhYmxlcyh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFRhc2tWYXJpYWJsZXModGFza0lkLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWVzTWFwKHZhcmlhYmxlcykpO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBjb21wbGV0ZSh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30pOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUuY29tcGxldGVUYXNrKHRhc2tJZCwgSlNPTi5zdHJpbmdpZnkodmFyaWFibGVzKSk7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGdldFRhc2tTZXJ2aWNlKCk6IFRhc2tTZXJ2aWNlIHtcblx0XHRyZXR1cm4gbmV3IFRhc2tTZXJ2aWNlKEJwbUZhY2FkZS5nZXRCcG1Qcm92aWRlckZsb3dhYmxlKCkuZ2V0VGFza1NlcnZpY2UoKSk7XG5cdH1cbn1cblxuLyoqXG4gKiBTZXJ2aWNlIHdoaWNoIHByb3ZpZGVzIGFjY2VzcyB0byB7QGxpbmsgVGFza30gYW5kIGZvcm0gcmVsYXRlZCBvcGVyYXRpb25zLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tTZXJ2aWNlIHtcblxuXHRwcml2YXRlIHJlYWRvbmx5IHRhc2tTZXJ2aWNlOiBhbnk7XG5cblx0Y29uc3RydWN0b3IodGFza1NlcnZpY2U6IGFueSkge1xuXHRcdHRoaXMudGFza1NlcnZpY2UgPSB0YXNrU2VydmljZTtcblx0fVxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyB0YXNrIHRoYXQgaXMgbm90IHJlbGF0ZWQgdG8gYW55IHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIFxuXHQgKiBUaGUgcmV0dXJuZWQgdGFzayBpcyB0cmFuc2llbnQgYW5kIG11c3QgYmUgc2F2ZWQgd2l0aCB7QGxpbmsgI3NhdmVUYXNrKFRhc2spfSAnbWFudWFsbHknLlxuXHQgKi9cblx0cHVibGljIG5ld1Rhc2sodGFza0lkPzogc3RyaW5nKTogVGFzayB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHRhc2tJZCkpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLm5ld1Rhc2sodGFza0lkKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UubmV3VGFzaygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIGJ1aWxkZXIgZm9yIHRoZSB0YXNrXG5cdCAqIFxuXHQgKiBAcmV0dXJuIHRhc2sgYnVpbGRlclxuXHQgKi9cblx0cHVibGljIGNyZWF0ZVRhc2tCdWlsZGVyKCk6IFRhc2tCdWlsZGVyIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5jcmVhdGVUYXNrQnVpbGRlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSBnaXZlbiB0YXNrIHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgc3RvcmUuIElmIHRoZSB0YXNrIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcGVyc2lzdGVudCBzdG9yZSwgaXQgaXMgdXBkYXRlZC4gQWZ0ZXIgYSBuZXcgdGFzayBoYXMgYmVlbiBzYXZlZCwgdGhlIHRhc2sgaW5zdGFuY2UgcGFzc2VkIGludG8gdGhpc1xuXHQgKiBtZXRob2QgaXMgdXBkYXRlZCB3aXRoIHRoZSBpZCBvZiB0aGUgbmV3bHkgY3JlYXRlZCB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tcblx0ICogICAgICAgICAgICB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwdWJsaWMgc2F2ZVRhc2sodGFzazogVGFzayk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc2F2ZVRhc2sodGFzayk7XG5cdH1cblxuXHQvKipcblx0ICogU2F2ZXMgdGhlIGdpdmVuIHRhc2tzIHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgc3RvcmUuIElmIHRoZSB0YXNrcyBhcmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBwZXJzaXN0ZW50IHN0b3JlLCBpdCBpcyB1cGRhdGVkLiBBZnRlciBhIG5ldyB0YXNrIGhhcyBiZWVuIHNhdmVkLCB0aGUgdGFzayBpbnN0YW5jZSBwYXNzZWQgaW50byB0aGlzXG5cdCAqIG1ldGhvZCBpcyB1cGRhdGVkIHdpdGggdGhlIGlkIG9mIHRoZSBuZXdseSBjcmVhdGVkIHRhc2suXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrTGlzdCB0aGUgbGlzdCBvZiB0YXNrIGluc3RhbmNlcywgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwdWJsaWMgYnVsa1NhdmVUYXNrcyh0YXNrTGlzdDogVGFza1tdKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5idWxrU2F2ZVRhc2tzKHRhc2tMaXN0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBnaXZlbiB0YXNrLCBub3QgZGVsZXRpbmcgaGlzdG9yaWMgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxhdGVkIHRvIHRoaXMgdGFzay5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHRhc2sgdGhhdCB3aWxsIGJlIGRlbGV0ZWQsIGNhbm5vdCBiZSBudWxsLiBJZiBubyB0YXNrIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiB0YXNrSWQsIHRoZSBvcGVyYXRpb24gaXMgaWdub3JlZC5cblx0ICogQHBhcmFtIGNhc2NhZGVcblx0ICogICAgICAgICAgICBJZiBjYXNjYWRlIGlzIHRydWUsIGFsc28gdGhlIGhpc3RvcmljIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhpcyB0YXNrIGlzIGRlbGV0ZWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIHdpdGggZ2l2ZW4gaWQgZG9lcyBub3QgZXhpc3QuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGVsZXRpbmcgdGhlIHRhc2sgb3IgaW4gY2FzZSB0aGUgdGFzayBpcyBwYXJ0IG9mIGEgcnVubmluZyBwcm9jZXNzLlxuXHQgKi9cblx0cHVibGljIGRlbGV0ZVRhc2sodGFza0lkOiBzdHJpbmcsIGNhc2NhZGU/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKGNhc2NhZGUpKSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZVRhc2sodGFza0lkLCBjYXNjYWRlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgYWxsIHRhc2tzIG9mIHRoZSBnaXZlbiBjb2xsZWN0aW9uLCBub3QgZGVsZXRpbmcgaGlzdG9yaWMgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxhdGVkIHRvIHRoZXNlIHRhc2tzLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZHNcblx0ICogICAgICAgICAgICBUaGUgaWQncyBvZiB0aGUgdGFza3MgdGhhdCB3aWxsIGJlIGRlbGV0ZWQsIGNhbm5vdCBiZSBudWxsLiBBbGwgaWQncyBpbiB0aGUgbGlzdCB0aGF0IGRvbid0IGhhdmUgYW4gZXhpc3RpbmcgdGFzayB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqIEBwYXJhbSBjYXNjYWRlXG5cdCAqICAgICAgICAgICAgSWYgY2FzY2FkZSBpcyB0cnVlLCBhbHNvIHRoZSBoaXN0b3JpYyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoaXMgdGFzayBpcyBkZWxldGVkLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBvbmUgb2YgdGhlIHRhc2sgZG9lcyBub3QgZXhpc3QuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGVsZXRpbmcgdGhlIHRhc2tzIG9yIGluIGNhc2Ugb25lIG9mIHRoZSB0YXNrcyBpcyBwYXJ0IG9mIGEgcnVubmluZyBwcm9jZXNzLlxuXHQgKi9cblx0cHVibGljIGRlbGV0ZVRhc2tzKHRhc2tJZHM6IHN0cmluZ1tdLCBjYXNjYWRlPzogYm9vbGVhbik6IHZvaWQge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbChjYXNjYWRlKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrcyh0YXNrSWRzLCBjYXNjYWRlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrcyh0YXNrSWRzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlcyB0aGUgZ2l2ZW4gdGFzaywgbm90IGRlbGV0aW5nIGhpc3RvcmljIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVsYXRlZCB0byB0aGlzIHRhc2suLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgdGFzayB0aGF0IHdpbGwgYmUgZGVsZXRlZCwgY2Fubm90IGJlIG51bGwuIElmIG5vIHRhc2sgZXhpc3RzIHdpdGggdGhlIGdpdmVuIHRhc2tJZCwgdGhlIG9wZXJhdGlvbiBpcyBpZ25vcmVkLlxuXHQgKiBAcGFyYW0gZGVsZXRlUmVhc29uXG5cdCAqICAgICAgICAgICAgcmVhc29uIHRoZSB0YXNrIGlzIGRlbGV0ZWQuIElzIHJlY29yZGVkIGluIGhpc3RvcnksIGlmIGVuYWJsZWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIHdpdGggZ2l2ZW4gaWQgZG9lcyBub3QgZXhpc3QuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGVsZXRpbmcgdGhlIHRhc2sgb3IgaW4gY2FzZSB0aGUgdGFzayBpcyBwYXJ0IG9mIGEgcnVubmluZyBwcm9jZXNzXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlVGFza1dpdGhSZWFzb24odGFza0lkOiBzdHJpbmcsIGRlbGV0ZVJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrKHRhc2tJZCwgZGVsZXRlUmVhc29uKVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgYWxsIHRhc2tzIG9mIHRoZSBnaXZlbiBjb2xsZWN0aW9uLCBub3QgZGVsZXRpbmcgaGlzdG9yaWMgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxhdGVkIHRvIHRoZXNlIHRhc2tzLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZHNcblx0ICogICAgICAgICAgICBUaGUgaWQncyBvZiB0aGUgdGFza3MgdGhhdCB3aWxsIGJlIGRlbGV0ZWQsIGNhbm5vdCBiZSBudWxsLiBBbGwgaWQncyBpbiB0aGUgbGlzdCB0aGF0IGRvbid0IGhhdmUgYW4gZXhpc3RpbmcgdGFzayB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqIEBwYXJhbSBkZWxldGVSZWFzb25cblx0ICogICAgICAgICAgICByZWFzb24gdGhlIHRhc2sgaXMgZGVsZXRlZC4gSXMgcmVjb3JkZWQgaW4gaGlzdG9yeSwgaWYgZW5hYmxlZC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gb25lIG9mIHRoZSB0YXNrcyBkb2VzIG5vdCBleGlzdC5cblx0ICogQHRocm93cyBGbG93YWJsZUV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBkZWxldGluZyB0aGUgdGFza3Mgb3IgaW4gY2FzZSBvbmUgb2YgdGhlIHRhc2tzIGlzIHBhcnQgb2YgYSBydW5uaW5nIHByb2Nlc3MuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlVGFza3NXaXRoUmVhc29uKHRhc2tJZHM6IHN0cmluZ1tdLCBkZWxldGVSZWFzb246IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuZGVsZXRlVGFza3ModGFza0lkcywgZGVsZXRlUmVhc29uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGFpbSByZXNwb25zaWJpbGl0eSBmb3IgYSB0YXNrOiB0aGUgZ2l2ZW4gdXNlciBpcyBtYWRlIGFzc2lnbmVlIGZvciB0aGUgdGFzay4gVGhlIGRpZmZlcmVuY2Ugd2l0aCB7QGxpbmsgI3NldEFzc2lnbmVlKFN0cmluZywgU3RyaW5nKX0gaXMgdGhhdCBoZXJlIGEgY2hlY2sgaXMgZG9uZSBpZiB0aGUgdGFzayBhbHJlYWR5IGhhcyBhXG5cdCAqIHVzZXIgYXNzaWduZWQgdG8gaXQuIE5vIGNoZWNrIGlzIGRvbmUgd2hldGhlciB0aGUgdXNlciBpcyBrbm93biBieSB0aGUgaWRlbnRpdHkgY29tcG9uZW50LlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIHRhc2sgdG8gY2xhaW0sIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IGNsYWltcyB0aGUgdGFzay4gV2hlbiB1c2VySWQgaXMgbnVsbCB0aGUgdGFzayBpcyB1bmNsYWltZWQsIGFzc2lnbmVkIHRvIG5vIG9uZS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgZG9lc24ndCBleGlzdC5cblx0ICogQHRocm93cyBvcmcuZmxvd2FibGUuY29tbW9uLmVuZ2luZS5hcGkuRmxvd2FibGVUYXNrQWxyZWFkeUNsYWltZWRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBpcyBhbHJlYWR5IGNsYWltZWQgYnkgYW5vdGhlciB1c2VyXG5cdCAqL1xuXHRwdWJsaWMgY2xhaW0odGFza0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5jbGFpbSh0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaG9ydGN1dCB0byB7QGxpbmsgI2NsYWltfSB3aXRoIG51bGwgdXNlciBpbiBvcmRlciB0byB1bmNsYWltIHRoZSB0YXNrXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGFzayB0byB1bmNsYWltLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyB1bmNsYWltKHRhc2tJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS51bmNsYWltKHRhc2tJZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHRoZSB0YXNrIHN0YXRlIHRvIGluIHByb2dyZXNzLiBObyBjaGVjayBpcyBkb25lIHdoZXRoZXIgdGhlIHVzZXIgaXMga25vd24gYnkgdGhlIGlkZW50aXR5IGNvbXBvbmVudC5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICB0YXNrIHRvIGNoYW5nZSB0aGUgc3RhdGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IHB1dHMgdGhlIHRhc2sgaW4gcHJvZ3Jlc3MuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgc3RhcnRQcm9ncmVzcyh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnN0YXJ0UHJvZ3Jlc3ModGFza0lkLCB1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN1c3BlbmRzIHRoZSB0YXNrLiBObyBjaGVjayBpcyBkb25lIHdoZXRoZXIgdGhlIHVzZXIgaXMga25vd24gYnkgdGhlIGlkZW50aXR5IGNvbXBvbmVudC5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICB0YXNrIHRvIHN1c3BlbmQsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IHN1c3BlbmRzIHRoZSB0YXNrLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIHN1c3BlbmRUYXNrKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc3VzcGVuZFRhc2sodGFza0lkLCB1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFjdGl2YXRlcyB0aGUgdGFzay4gTm8gY2hlY2sgaXMgZG9uZSB3aGV0aGVyIHRoZSB1c2VyIGlzIGtub3duIGJ5IHRoZSBpZGVudGl0eSBjb21wb25lbnQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGFzayB0byBhY3RpdmF0ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICB1c2VyIHRoYXQgYWN0aXZhdGVzIHRoZSB0YXNrLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIGFjdGl2YXRlVGFzayh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmFjdGl2YXRlVGFzayh0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogRGVsZWdhdGVzIHRoZSB0YXNrIHRvIGFub3RoZXIgdXNlci4gVGhpcyBtZWFucyB0aGF0IHRoZSBhc3NpZ25lZSBpcyBzZXQgYW5kIHRoZSBkZWxlZ2F0aW9uIHN0YXRlIGlzIHNldCB0byB7QGxpbmsgRGVsZWdhdGlvblN0YXRlI1BFTkRJTkd9LiBJZiBubyBvd25lciBpcyBzZXQgb24gdGhlIHRhc2ssIHRoZSBvd25lciBpcyBzZXQgdG9cblx0ICogdGhlIGN1cnJlbnQgYXNzaWduZWUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSB0YXNrIHRoYXQgd2lsbCBiZSBkZWxlZ2F0ZWQuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHVzZXIgdGhhdCB3aWxsIGJlIHNldCBhcyBhc3NpZ25lZS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZWdhdGVUYXNrKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuZGVsZWdhdGVUYXNrKHRhc2tJZCwgdXNlcklkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYXJrcyB0aGF0IHRoZSBhc3NpZ25lZSBpcyBkb25lIHdpdGggdGhpcyB0YXNrIGFuZCB0aGF0IGl0IGNhbiBiZSBzZW5kIGJhY2sgdG8gdGhlIG93bmVyLiBDYW4gb25seSBiZSBjYWxsZWQgd2hlbiB0aGlzIHRhc2sgaXMge0BsaW5rIERlbGVnYXRpb25TdGF0ZSNQRU5ESU5HfSBkZWxlZ2F0aW9uLiBBZnRlciB0aGlzIG1ldGhvZFxuXHQgKiByZXR1cm5zLCB0aGUge0BsaW5rIFRhc2sjZ2V0RGVsZWdhdGlvblN0YXRlKCkgZGVsZWdhdGlvblN0YXRlfSBpcyBzZXQgdG8ge0BsaW5rIERlbGVnYXRpb25TdGF0ZSNSRVNPTFZFRH0uXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSB0YXNrIHRvIHJlc29sdmUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVzXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXNcblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqL1xuXHRwdWJsaWMgcmVzb2x2ZVRhc2sodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4sIHRyYW5zaWVudFZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVzKSAmJiB0aGlzLmlzTm90TnVsbCh0cmFuc2llbnRWYXJpYWJsZXMpKSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLnJlc29sdmVUYXNrKHRhc2tJZCwgdmFyaWFibGVzLCB0cmFuc2llbnRWYXJpYWJsZXMpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVzKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5yZXNvbHZlVGFzayh0YXNrSWQsIHZhcmlhYmxlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UucmVzb2x2ZVRhc2sodGFza0lkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIHRhc2sgaXMgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgdGFzayB0byBjb21wbGV0ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICB1c2VyIHRoYXQgY29tcGxldGVzIHRoZSB0YXNrLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVzXG5cdCAqICAgICAgICAgICAgdGFzayBwYXJhbWV0ZXJzLiBNYXkgYmUgbnVsbCBvciBlbXB0eS5cblx0ICogQHBhcmFtIHRyYW5zaWVudFZhcmlhYmxlc1xuXHQgKiAgICAgICAgICAgIHRhc2sgcGFyYW1ldGVycy4gTWF5IGJlIG51bGwgb3IgZW1wdHkuXG5cdCAqIEBwYXJhbSBsb2NhbFNjb3BlXG5cdCAqICAgICAgICAgICAgSWYgdHJ1ZSwgdGhlIHByb3ZpZGVkIHZhcmlhYmxlcyB3aWxsIGJlIHN0b3JlZCB0YXNrLWxvY2FsLCBpbnN0ZWFkIG9mIHByb2Nlc3MgaW5zdGFuY2Ugd2lkZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyKS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGlzIHRhc2sgaXMge0BsaW5rIERlbGVnYXRpb25TdGF0ZSNQRU5ESU5HfSBkZWxlZ2F0aW9uLlxuXHQgKi9cblx0cHVibGljIGNvbXBsZXRlKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ/OiBzdHJpbmcsIHZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4sIHRyYW5zaWVudFZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4sIGxvY2FsU2NvcGU/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHVzZXJJZCkgJiYgdGhpcy5pc05vdE51bGwodmFyaWFibGVzKSAmJiB0aGlzLmlzTm90TnVsbChsb2NhbFNjb3BlKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHVzZXJJZCwgdmFyaWFibGVzLCBsb2NhbFNjb3BlKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHZhcmlhYmxlcykgJiYgdGhpcy5pc05vdE51bGwobG9jYWxTY29wZSkpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkLCB2YXJpYWJsZXMsIGxvY2FsU2NvcGUpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc05vdE51bGwodXNlcklkKSAmJiB0aGlzLmlzTm90TnVsbCh2YXJpYWJsZXMpICYmIHRoaXMuaXNOb3ROdWxsKHRyYW5zaWVudFZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkLCB1c2VySWQsIHZhcmlhYmxlcywgdHJhbnNpZW50VmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHZhcmlhYmxlcykgJiYgdGhpcy5pc05vdE51bGwodHJhbnNpZW50VmFyaWFibGVzKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHZhcmlhYmxlcywgdHJhbnNpZW50VmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHVzZXJJZCkgJiYgdGhpcy5pc05vdE51bGwodmFyaWFibGVzKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHVzZXJJZCwgdmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkLCB2YXJpYWJsZXMpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc05vdE51bGwodXNlcklkKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHVzZXJJZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIHRhc2sgaXMgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLCBhbmQgdGhlIHRhc2sgZm9ybSBoYXMgYmVlbiBzdWJtaXR0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSB0YXNrIHRvIGNvbXBsZXRlLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGZvcm1EZWZpbml0aW9uSWRcblx0ICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGZvcm0gZGVmaW5pdGlvbiB0aGF0IGlzIGZpbGxlZC1pbiB0byBjb21wbGV0ZSB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBvdXRjb21lXG5cdCAqICAgICAgICAgICAgdGhlIG91dGNvbWUgb2YgdGhlIGNvbXBsZXRlZCBmb3JtLCBjYW4gYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhcmlhYmxlc1xuXHQgKiAgICAgICAgICAgIHZhbHVlcyBvZiB0aGUgY29tcGxldGVkIGZvcm0uIE1heSBiZSBudWxsIG9yIGVtcHR5LlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IGNvbXBsZXRlcyB0aGUgdGFzay5cblx0ICogQHBhcmFtIHRyYW5zaWVudFZhcmlhYmxlc1xuXHQgKiAgICAgICAgICAgIGFkZGl0aW9uYWwgdHJhbnNpZW50IHZhbHVlcyB0aGF0IG5lZWQgdG8gYWRkZWQgdG8gdGhlIHByb2Nlc3MgaW5zdGFuY2UgdHJhbnNpZW50IHZhcmlhYmxlcy4gTWF5IGJlIG51bGwgb3IgZW1wdHkuXG5cdCAqIEBwYXJhbSBsb2NhbFNjb3BlXG5cdCAqICAgICAgICAgICAgSWYgdHJ1ZSwgdGhlIHByb3ZpZGVkIHZhcmlhYmxlcyB3aWxsIGJlIHN0b3JlZCB0YXNrLWxvY2FsLCBpbnN0ZWFkIG9mIHByb2Nlc3MgaW5zdGFuY2Ugd2lkZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQgZm9yIHtAbGluayAjY29tcGxldGUoU3RyaW5nLCBNYXApfSkuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIHRhc2sgZXhpc3RzIHdpdGggdGhlIGdpdmVuIGlkLlxuXHQgKi9cblx0cHVibGljIGNvbXBsZXRlVGFza1dpdGhGb3JtKHRhc2tJZDogc3RyaW5nLCBmb3JtRGVmaW5pdGlvbklkOiBzdHJpbmcsIG91dGNvbWU6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8U3RyaW5nLCBhbnk+LCB1c2VySWQ/OiBzdHJpbmcsIHRyYW5zaWVudFZhcmlhYmxlcz86IE1hcDxTdHJpbmcsIGFueT4sIGxvY2FsU2NvcGU/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHVzZXJJZCkgJiYgdGhpcy5pc05vdE51bGwobG9jYWxTY29wZSkpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGVUYXNrV2l0aEZvcm0odGFza0lkLCBmb3JtRGVmaW5pdGlvbklkLCBvdXRjb21lLCB1c2VySWQsIHZhcmlhYmxlcywgbG9jYWxTY29wZSk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbChsb2NhbFNjb3BlKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZVRhc2tXaXRoRm9ybSh0YXNrSWQsIGZvcm1EZWZpbml0aW9uSWQsIG91dGNvbWUsIHZhcmlhYmxlcywgbG9jYWxTY29wZSk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbCh1c2VySWQpICYmIHRoaXMuaXNOb3ROdWxsKHRyYW5zaWVudFZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGVUYXNrV2l0aEZvcm0odGFza0lkLCBmb3JtRGVmaW5pdGlvbklkLCBvdXRjb21lLCB1c2VySWQsIHZhcmlhYmxlcywgdHJhbnNpZW50VmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHRyYW5zaWVudFZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGVUYXNrV2l0aEZvcm0odGFza0lkLCBmb3JtRGVmaW5pdGlvbklkLCBvdXRjb21lLCB2YXJpYWJsZXMsIHRyYW5zaWVudFZhcmlhYmxlcyk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbCh1c2VySWQpKSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLmNvbXBsZXRlVGFza1dpdGhGb3JtKHRhc2tJZCwgZm9ybURlZmluaXRpb25JZCwgb3V0Y29tZSwgdXNlcklkLCB2YXJpYWJsZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLmNvbXBsZXRlVGFza1dpdGhGb3JtKHRhc2tJZCwgZm9ybURlZmluaXRpb25JZCwgb3V0Y29tZSwgdmFyaWFibGVzKTtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIEdldHMgYSBGb3JtIG1vZGVsIGluc3RhbmNlIG9mIHRoZSB0YXNrIGZvcm0gb2YgYSBzcGVjaWZpYyB0YXNrXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gaWdub3JlVmFyaWFibGVzXG5cdCAqICAgICAgICAgICAgc2hvdWxkIHRoZSB2YXJpYWJsZXMgYmUgaWdub3JlZCB3aGVuIGZldGNoaW5nIHRoZSBmb3JtIG1vZGVsP1xuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBmb3JtIGRlZmluaXRpb24gZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBnZXRUYXNrRm9ybU1vZGVsKHRhc2tJZDogc3RyaW5nLCBpZ25vcmVWYXJpYWJsZXM/OiBib29sZWFuKTogRm9ybUluZm8ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbChpZ25vcmVWYXJpYWJsZXMpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRUYXNrRm9ybU1vZGVsKHRhc2tJZCwgaWdub3JlVmFyaWFibGVzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0VGFza0Zvcm1Nb2RlbCh0YXNrSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBhc3NpZ25lZSBvZiB0aGUgZ2l2ZW4gdGFzayB0byB0aGUgZ2l2ZW4gdXNlcklkLiBObyBjaGVjayBpcyBkb25lIHdoZXRoZXIgdGhlIHVzZXIgaXMga25vd24gYnkgdGhlIGlkZW50aXR5IGNvbXBvbmVudC5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgdXNlciB0byB1c2UgYXMgYXNzaWduZWUuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIHVzZXIgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBzZXRBc3NpZ25lZSh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldEFzc2lnbmVlKHRhc2tJZCwgdXNlcklkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmFuc2ZlcnMgb3duZXJzaGlwIG9mIHRoaXMgdGFzayB0byBhbm90aGVyIHVzZXIuIE5vIGNoZWNrIGlzIGRvbmUgd2hldGhlciB0aGUgdXNlciBpcyBrbm93biBieSB0aGUgaWRlbnRpdHkgY29tcG9uZW50LlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHVzZXJJZFxuXHQgKiAgICAgICAgICAgIG9mIHRoZSBwZXJzb24gdGhhdCBpcyByZWNlaXZpbmcgb3duZXJzaGlwLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgc2V0T3duZXIodGFza0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5zZXRPd25lcih0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSB7QGxpbmsgSWRlbnRpdHlMaW5rfXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB0YXNrLiBTdWNoIGFuIHtAbGluayBJZGVudGl0eUxpbmt9IGluZm9ybXMgaG93IGEgY2VydGFpbiBpZGVudGl0eSAoZWcuIGdyb3VwIG9yIHVzZXIpIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNlcnRhaW4gdGFzayAoZWcuIGFzXG5cdCAqIGNhbmRpZGF0ZSwgYXNzaWduZWUsIGV0Yy4pXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SWRlbnRpdHlMaW5rc0ZvclRhc2sodGFza0lkOiBzdHJpbmcpOiBJZGVudGl0eUxpbmtbXSB7XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0SWRlbnRpdHlMaW5rc0ZvclRhc2sodGFza0lkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZW5pZW5jZSBzaG9ydGhhbmQgZm9yIHtAbGluayAjYWRkVXNlcklkZW50aXR5TGluayhTdHJpbmcsIFN0cmluZywgU3RyaW5nKX07IHdpdGggdHlwZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZSNDQU5ESURBVEV9XG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgdG8gdXNlIGFzIGNhbmRpZGF0ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIHVzZXIgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBhZGRDYW5kaWRhdGVVc2VyKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuYWRkQ2FuZGlkYXRlVXNlcih0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIGZvciB7QGxpbmsgI2FkZEdyb3VwSWRlbnRpdHlMaW5rKFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfTsgd2l0aCB0eXBlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlI0NBTkRJREFURX1cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBncm91cElkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIGdyb3VwIHRvIHVzZSBhcyBjYW5kaWRhdGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBncm91cCBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZUdyb3VwKHRhc2tJZDogc3RyaW5nLCBncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmFkZENhbmRpZGF0ZUdyb3VwKHRhc2tJZCwgZ3JvdXBJZCk7XG5cdH1cblxuXHQvKipcblx0ICogSW52b2x2ZXMgYSB1c2VyIHdpdGggYSB0YXNrLiBUaGUgdHlwZSBvZiBpZGVudGl0eSBsaW5rIGlzIGRlZmluZWQgYnkgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG5cdCAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eUxpbmssIGNhbm5vdCBiZSBudWxsIChAc2VlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlfSkuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIHVzZXIgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBhZGRVc2VySWRlbnRpdHlMaW5rKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgaWRlbnRpdHlMaW5rVHlwZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5hZGRVc2VySWRlbnRpdHlMaW5rKHRhc2tJZCwgdXNlcklkLCBpZGVudGl0eUxpbmtUeXBlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbnZvbHZlcyBhIGdyb3VwIHdpdGggYSB0YXNrLiBUaGUgdHlwZSBvZiBpZGVudGl0eUxpbmsgaXMgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gaWRlbnRpdHlMaW5rLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG5cdCAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eSwgY2Fubm90IGJlIG51bGwgKEBzZWUge0BsaW5rIElkZW50aXR5TGlua1R5cGV9KS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBhZGRHcm91cElkZW50aXR5TGluayh0YXNrSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmFkZEdyb3VwSWRlbnRpdHlMaW5rKHRhc2tJZCwgZ3JvdXBJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIGZvciB7QGxpbmsgI2RlbGV0ZVVzZXJJZGVudGl0eUxpbmsoU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9OyB3aXRoIHR5cGUge0BsaW5rIElkZW50aXR5TGlua1R5cGUjQ0FORElEQVRFfVxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHVzZXJJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB1c2VyIHRvIHVzZSBhcyBjYW5kaWRhdGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlQ2FuZGlkYXRlVXNlcih0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZUNhbmRpZGF0ZVVzZXIodGFza0lkLCB1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIHNob3J0aGFuZCBmb3Ige0BsaW5rICNkZWxldGVHcm91cElkZW50aXR5TGluayhTdHJpbmcsIFN0cmluZywgU3RyaW5nKX07IHdpdGggdHlwZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZSNDQU5ESURBVEV9XG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gZ3JvdXBJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSBncm91cCB0byB1c2UgYXMgY2FuZGlkYXRlLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBkZWxldGVDYW5kaWRhdGVHcm91cCh0YXNrSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVDYW5kaWRhdGVHcm91cCh0YXNrSWQsIGdyb3VwSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gYSB1c2VyIGFuZCBhIHRhc2sgZm9yIHRoZSBnaXZlbiBpZGVudGl0eUxpbmtUeXBlLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHVzZXJJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB1c2VyIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gaWRlbnRpdHlMaW5rVHlwZVxuXHQgKiAgICAgICAgICAgIHR5cGUgb2YgaWRlbnRpdHlMaW5rLCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlVXNlcklkZW50aXR5TGluayh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIGlkZW50aXR5TGlua1R5cGU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuZGVsZXRlVXNlcklkZW50aXR5TGluayh0YXNrSWQsIHVzZXJJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBhIGdyb3VwIGFuZCBhIHRhc2sgZm9yIHRoZSBnaXZlbiBpZGVudGl0eUxpbmtUeXBlLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG5cdCAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eSwgY2Fubm90IGJlIG51bGwgKEBzZWUge0BsaW5rIElkZW50aXR5TGlua1R5cGV9KS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBkZWxldGVHcm91cElkZW50aXR5TGluayh0YXNrSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZUdyb3VwSWRlbnRpdHlMaW5rKHRhc2tJZCwgZ3JvdXBJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgcHJpb3JpdHkgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBBdXRob3JpemF0aW9uOiBhY3R1YWwgb3duZXIgLyBidXNpbmVzcyBhZG1pblxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHByaW9yaXR5XG5cdCAqICAgICAgICAgICAgdGhlIG5ldyBwcmlvcml0eSBmb3IgdGhlIHRhc2suXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgc2V0UHJpb3JpdHkodGFza0lkOiBzdHJpbmcsIHByaW9yaXR5OiBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFByaW9yaXR5KHRhc2tJZCwgcHJpb3JpdHkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIGR1ZSBkYXRlIG9mIHRoZSB0YXNrXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gZHVlRGF0ZVxuXHQgKiAgICAgICAgICAgIHRoZSBuZXcgZHVlIGRhdGUgZm9yIHRoZSB0YXNrXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIHNldER1ZURhdGUodGFza0lkOiBzdHJpbmcsIGR1ZURhdGU6IERhdGUpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldER1ZURhdGUodGFza0lkLCBkdWVEYXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBzZXQgdmFyaWFibGUgb24gYSB0YXNrLiBJZiB0aGUgdmFyaWFibGUgaXMgbm90IGFscmVhZHkgZXhpc3RpbmcsIGl0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgbW9zdCBvdXRlciBzY29wZS4gVGhpcyBtZWFucyB0aGUgcHJvY2VzcyBpbnN0YW5jZSBpbiBjYXNlIHRoaXMgdGFzayBpcyByZWxhdGVkIHRvIGFuIGV4ZWN1dGlvbi5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZSh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFZhcmlhYmxlKHRhc2tJZCwgdmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBzZXQgdmFyaWFibGVzIG9uIGEgdGFzay4gSWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBhbHJlYWR5IGV4aXN0aW5nLCBpdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIG1vc3Qgb3V0ZXIgc2NvcGUuIFRoaXMgbWVhbnMgdGhlIHByb2Nlc3MgaW5zdGFuY2UgaW4gY2FzZSB0aGlzIHRhc2sgaXMgcmVsYXRlZCB0byBhbiBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGVzKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZXM6IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFZhcmlhYmxlcyh0YXNrSWQsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZXNNYXAodmFyaWFibGVzKSk7XG5cdH1cblxuXHQvKipcblx0ICogc2V0IHZhcmlhYmxlIG9uIGEgdGFzay4gSWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBhbHJlYWR5IGV4aXN0aW5nLCBpdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGVMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFZhcmlhYmxlTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHNldCB2YXJpYWJsZXMgb24gYSB0YXNrLiBJZiB0aGUgdmFyaWFibGUgaXMgbm90IGFscmVhZHkgZXhpc3RpbmcsIGl0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZXNMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5zZXRWYXJpYWJsZXNMb2NhbCh0YXNrSWQsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZXNNYXAodmFyaWFibGVzKSk7XG5cdH1cblxuXHQvKipcblx0ICogZ2V0IGEgdmFyaWFibGVzIGFuZCBzZWFyY2ggaW4gdGhlIHRhc2sgc2NvcGUgYW5kIGlmIGF2YWlsYWJsZSBhbHNvIHRoZSBleGVjdXRpb24gc2NvcGVzLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudGFza1NlcnZpY2UuZ2V0VmFyaWFibGUodGFza0lkLCB2YXJpYWJsZU5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdmFyaWFibGUuIFNlYXJjaGluZyBmb3IgdGhlIHZhcmlhYmxlIGlzIGRvbmUgaW4gYWxsIHNjb3BlcyB0aGF0IGFyZSB2aXNpYmxlIHRvIHRoZSBnaXZlbiB0YXNrIChpbmNsdWRpbmcgcGFyZW50IHNjb3BlcykuIFJldHVybnMgbnVsbCB3aGVuIG5vIHZhcmlhYmxlIHZhbHVlIGlzIGZvdW5kIHdpdGggdGhlIGdpdmVuIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZVxuXHQgKiAgICAgICAgICAgIG5hbWUgb2YgdmFyaWFibGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcmV0dXJuIHRoZSB2YXJpYWJsZSBvciBudWxsIGlmIHRoZSB2YXJpYWJsZSBpcyB1bmRlZmluZWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIGV4ZWN1dGlvbiBpcyBmb3VuZCBmb3IgdGhlIGdpdmVuIHRhc2tJZC5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUluc3RhbmNlKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IFZhcmlhYmxlSW5zdGFuY2Uge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlSW5zdGFuY2UodGFza0lkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGNoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgdGFzayBoYXMgYSB2YXJpYWJsZSBkZWZpbmVkIHdpdGggdGhlIGdpdmVuIG5hbWUsIGluIHRoZSB0YXNrIHNjb3BlIGFuZCBpZiBhdmFpbGFibGUgYWxzbyB0aGUgZXhlY3V0aW9uIHNjb3Blcy5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZSh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5oYXNWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogY2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSB0YXNrIGhhcyBhIHZhcmlhYmxlIGRlZmluZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUxvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudGFza1NlcnZpY2UuZ2V0VmFyaWFibGVMb2NhbCh0YXNrSWQsIHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB2YXJpYWJsZSBmb3IgYSB0YXNrLiBSZXR1cm5zIHRoZSB2YXJpYWJsZSB3aGVuIGl0IGlzIHNldCBmb3IgdGhlIHRhc2sgKGFuZCBub3Qgc2VhcmNoaW5nIHBhcmVudCBzY29wZXMpLiBSZXR1cm5zIG51bGwgd2hlbiBubyB2YXJpYWJsZSBpcyBmb3VuZCB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWVcblx0ICogICAgICAgICAgICBuYW1lIG9mIHZhcmlhYmxlLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHJldHVybiB0aGUgdmFyaWFibGUgb3IgbnVsbCBpZiB0aGUgdmFyaWFibGUgaXMgdW5kZWZpbmVkLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBubyB0YXNrIGlzIGZvdW5kIGZvciB0aGUgZ2l2ZW4gdGFza0lkLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2VMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiBWYXJpYWJsZUluc3RhbmNlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZUluc3RhbmNlTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGNoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgdGFzayBoYXMgYSB2YXJpYWJsZSBkZWZpbmVkIHdpdGggdGhlIGdpdmVuIG5hbWUsIGxvY2FsIHRhc2sgc2NvcGUgb25seS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZUxvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmhhc1ZhcmlhYmxlTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGdldCBhbGwgdmFyaWFibGVzIGFuZCBzZWFyY2ggaW4gdGhlIHRhc2sgc2NvcGUgYW5kIGlmIGF2YWlsYWJsZSBhbHNvIHRoZSBleGVjdXRpb24gc2NvcGVzLiBJZiB5b3UgaGF2ZSBtYW55IHZhcmlhYmxlcyBhbmQgeW91IG9ubHkgbmVlZCBhIGZldywgY29uc2lkZXIgdXNpbmdcblx0ICoge0BsaW5rICNnZXRWYXJpYWJsZXMoU3RyaW5nLCBDb2xsZWN0aW9uKX0gZm9yIGJldHRlciBwZXJmb3JtYW5jZS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZXModGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZXM/OiBzdHJpbmdbXSk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbCh2YXJpYWJsZU5hbWVzKSkge1xuXHRcdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcCh0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlcyh0YXNrSWQsIHZhcmlhYmxlTmFtZXMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcCh0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlcyh0YXNrSWQpKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWxsIHZhcmlhYmxlcyB2aXNpYmxlIGZyb20gdGhlIGdpdmVuIHRhc2sgc2NvcGUgKGluY2x1ZGluZyBwYXJlbnQgc2NvcGVzKS5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lc1xuXHQgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHJldHJpZXZlZC5cblx0ICogQHJldHVybiB0aGUgdmFyaWFibGUgaW5zdGFuY2VzIG9yIGFuIGVtcHR5IG1hcCBpZiBubyBzdWNoIHZhcmlhYmxlcyBhcmUgZm91bmQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIHRhc2sgaXMgZm91bmQgZm9yIHRoZSBnaXZlbiB0YXNrSWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXModGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZXM/OiBzdHJpbmdbXSk6IE1hcDxzdHJpbmcsIFZhcmlhYmxlSW5zdGFuY2U+IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVOYW1lcykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlSW5zdGFuY2VzKHRhc2tJZCwgdmFyaWFibGVOYW1lcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlSW5zdGFuY2VzKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIGdldCBhbGwgdmFyaWFibGVzIGFuZCBzZWFyY2ggb25seSBpbiB0aGUgdGFzayBzY29wZS4gSWYgeW91IGhhdmUgbWFueSB0YXNrIGxvY2FsIHZhcmlhYmxlcyBhbmQgeW91IG9ubHkgbmVlZCBhIGZldywgY29uc2lkZXIgdXNpbmcge0BsaW5rICNnZXRWYXJpYWJsZXNMb2NhbChTdHJpbmcsIENvbGxlY3Rpb24pfSBmb3IgYmV0dGVyXG5cdCAqIHBlcmZvcm1hbmNlLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlc0xvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWVzPzogc3RyaW5nW10pOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVOYW1lcykpIHtcblx0XHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZXNNYXAodGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZXNMb2NhbCh0YXNrSWQsIHZhcmlhYmxlTmFtZXMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcCh0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlc0xvY2FsKHRhc2tJZCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBnZXQgYWxsIHZhcmlhYmxlcyBhbmQgc2VhcmNoIG9ubHkgaW4gdGhlIHRhc2sgc2NvcGUuICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsQnlUYXNrSWRzKHRhc2tJZHM6IFNldDxzdHJpbmc+KTogVmFyaWFibGVJbnN0YW5jZVtdIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsQnlUYXNrSWRzKHRhc2tJZHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFsbCB2YXJpYWJsZSB2YWx1ZXMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgdGFzayBzY29wZSwgd2l0aG91dCB0YWtpbmcgb3V0ZXIgc2NvcGVzIGludG8gYWNjb3VudC4gSWYgeW91IGhhdmUgbWFueSB0YXNrIGxvY2FsIHZhcmlhYmxlcyBhbmQgeW91IG9ubHkgbmVlZCBhIGZldywgY29uc2lkZXIgdXNpbmdcblx0ICoge0BsaW5rICNnZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsKFN0cmluZywgQ29sbGVjdGlvbil9IGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHJldHVybiB0aGUgdmFyaWFibGVzIG9yIGFuIGVtcHR5IG1hcCBpZiBubyBzdWNoIHZhcmlhYmxlcyBhcmUgZm91bmQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIHRhc2sgaXMgZm91bmQgZm9yIHRoZSBnaXZlbiB0YXNrSWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lcz86IHN0cmluZ1tdKTogTWFwPHN0cmluZywgVmFyaWFibGVJbnN0YW5jZT4ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbCh2YXJpYWJsZU5hbWVzKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCh0YXNrSWQsIHZhcmlhYmxlTmFtZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIHZhcmlhYmxlIGZyb20gdGhlIHRhc2suIFdoZW4gdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LCBub3RoaW5nIGhhcHBlbnMuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVmFyaWFibGUodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5yZW1vdmVWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgdmFyaWFibGUgZnJvbSB0aGUgdGFzayAobm90IGNvbnNpZGVyaW5nIHBhcmVudCBzY29wZXMpLiBXaGVuIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCwgbm90aGluZyBoYXBwZW5zLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlTG9jYWwodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5yZW1vdmVWYXJpYWJsZUxvY2FsKHRhc2tJZCwgdmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCB2YXJpYWJsZXMgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgdGFzay4gTm9uIGV4aXN0aW5nIHZhcmlhYmxlIG5hbWVzIGFyZSBzaW1wbHkgaWdub3JlZC5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZXModGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5yZW1vdmVWYXJpYWJsZXModGFza0lkLCB2YXJpYWJsZU5hbWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCB2YXJpYWJsZXMgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgdGFzayAobm90IGNvbnNpZGVyaW5nIHBhcmVudCBzY29wZXMpLiBOb24gZXhpc3RpbmcgdmFyaWFibGUgbmFtZXMgYXJlIHNpbXBseSBpZ25vcmVkLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlc0xvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UucmVtb3ZlVmFyaWFibGVzTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBbGwgRGF0YU9iamVjdHMgdmlzaWJsZSBmcm9tIHRoZSBnaXZlbiBleGVjdXRpb24gc2NvcGUgKGluY2x1ZGluZyBwYXJlbnQgc2NvcGVzKS5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gZGF0YU9iamVjdE5hbWVzXG5cdCAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2YgRGF0YU9iamVjdCBuYW1lcyB0aGF0IHNob3VsZCBiZSByZXRyaWV2ZWQuXG5cdCAqIEBwYXJhbSBsb2NhbGVcblx0ICogICAgICAgICAgICBsb2NhbGUgdGhlIERhdGFPYmplY3QgbmFtZSBhbmQgZGVzY3JpcHRpb24gc2hvdWxkIGJlIHJldHVybmVkIGluIChpZiBhdmFpbGFibGUpLlxuXHQgKiBAcGFyYW0gd2l0aExvY2FsaXphdGlvbkZhbGxiYWNrXG5cdCAqICAgICAgICAgICAgV2hlbiB0cnVlIGxvY2FsaXphdGlvbiB3aWxsIGZhbGxiYWNrIHRvIG1vcmUgZ2VuZXJhbCBsb2NhbGVzIGlmIHRoZSBzcGVjaWZpZWQgbG9jYWxlIGlzIG5vdCBmb3VuZC5cblx0ICogQHJldHVybiB0aGUgRGF0YU9iamVjdHMgb3IgYW4gZW1wdHkgbWFwIGlmIG5vIHN1Y2ggdmFyaWFibGVzIGFyZSBmb3VuZC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBpcyBmb3VuZCBmb3IgdGhlIGdpdmVuIHRhc2tJZC5cblx0ICovXG5cdHB1YmxpYyBnZXREYXRhT2JqZWN0cyh0YXNrSWQ6IHN0cmluZywgZGF0YU9iamVjdE5hbWVzPzogc3RyaW5nW10sIGxvY2FsZT86IHN0cmluZywgd2l0aExvY2FsaXphdGlvbkZhbGxiYWNrPzogYm9vbGVhbik6IE1hcDxzdHJpbmcsIERhdGFPYmplY3Q+IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwoZGF0YU9iamVjdE5hbWVzKSAmJiB0aGlzLmlzTm90TnVsbChsb2NhbGUpICYmIHRoaXMuaXNOb3ROdWxsKHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjaykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3RzKHRhc2tJZCwgZGF0YU9iamVjdE5hbWVzLCBsb2NhbGUsIHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjayk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbChkYXRhT2JqZWN0TmFtZXMpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXREYXRhT2JqZWN0cyh0YXNrSWQsIGRhdGFPYmplY3ROYW1lcyk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbChsb2NhbGUpICYmIHRoaXMuaXNOb3ROdWxsKHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjaykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3RzKHRhc2tJZCwgbG9jYWxlLCB3aXRoTG9jYWxpemF0aW9uRmFsbGJhY2spO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXREYXRhT2JqZWN0cyh0YXNrSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgRGF0YU9iamVjdC4gU2VhcmNoaW5nIGZvciB0aGUgRGF0YU9iamVjdCBpcyBkb25lIGluIGFsbCBzY29wZXMgdGhhdCBhcmUgdmlzaWJsZSB0byB0aGUgZ2l2ZW4gdGFzayAoaW5jbHVkaW5nIHBhcmVudCBzY29wZXMpLiBSZXR1cm5zIG51bGwgd2hlbiBubyBEYXRhT2JqZWN0IHZhbHVlIGlzIGZvdW5kIHdpdGggdGhlIGdpdmVuXG5cdCAqIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGRhdGFPYmplY3Rcblx0ICogICAgICAgICAgICBuYW1lIG9mIERhdGFPYmplY3QsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gbG9jYWxlXG5cdCAqICAgICAgICAgICAgbG9jYWxlIHRoZSBEYXRhT2JqZWN0IG5hbWUgYW5kIGRlc2NyaXB0aW9uIHNob3VsZCBiZSByZXR1cm5lZCBpbiAoaWYgYXZhaWxhYmxlKS5cblx0ICogQHBhcmFtIHdpdGhMb2NhbGl6YXRpb25GYWxsYmFja1xuXHQgKiAgICAgICAgICAgIFdoZW4gdHJ1ZSBsb2NhbGl6YXRpb24gd2lsbCBmYWxsYmFjayB0byBtb3JlIGdlbmVyYWwgbG9jYWxlcyBpbmNsdWRpbmcgdGhlIGRlZmF1bHQgbG9jYWxlIG9mIHRoZSBKVk0gaWYgdGhlIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLlxuXHQgKiBAcmV0dXJuIHRoZSBEYXRhT2JqZWN0IG9yIG51bGwgaWYgdGhlIHZhcmlhYmxlIGlzIHVuZGVmaW5lZC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBpcyBmb3VuZCBmb3IgdGhlIGdpdmVuIHRhc2tJZC5cblx0ICovXG5cdHB1YmxpYyBnZXREYXRhT2JqZWN0KHRhc2tJZDogc3RyaW5nLCBkYXRhT2JqZWN0OiBzdHJpbmcsIGxvY2FsZT86IHN0cmluZywgd2l0aExvY2FsaXphdGlvbkZhbGxiYWNrPzogYm9vbGVhbik6IERhdGFPYmplY3Qge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbChsb2NhbGUpICYmIHRoaXMuaXNOb3ROdWxsKHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjaykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3QodGFza0lkLCBkYXRhT2JqZWN0LCBsb2NhbGUsIHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjayk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3QodGFza0lkLCBkYXRhT2JqZWN0KTtcblx0XHR9XG5cdH1cblxuXHQvKiogQWRkIGEgY29tbWVudCB0byBhIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UuICovXG5cdHB1YmxpYyBhZGRDb21tZW50KHRhc2tJZDogc3RyaW5nLCBwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBDb21tZW50IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodHlwZSkpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmFkZENvbW1lbnQodGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgdHlwZSwgbWVzc2FnZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmFkZENvbW1lbnQodGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgbWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFVwZGF0ZSBhIGNvbW1lbnQgdG8gYSB0YXNrIGFuZC9vciBwcm9jZXNzIGluc3RhbmNlLiAqL1xuXHRwdWJsaWMgc2F2ZUNvbW1lbnQoY29tbWVudDogQ29tbWVudCk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc2F2ZUNvbW1lbnQoY29tbWVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpbmRpdmlkdWFsIGNvbW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQuIFJldHVybnMgbnVsbCBpZiBubyBjb21tZW50IGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBpZC5cblx0ICovXG5cdHB1YmxpYyBnZXRDb21tZW50KGNvbW1lbnRJZDogc3RyaW5nKTogQ29tbWVudCB7XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0Q29tbWVudChjb21tZW50SWQpO1xuXHR9XG5cblx0LyoqIFJlbW92ZXMgYWxsIGNvbW1lbnRzIGZyb20gdGhlIHByb3ZpZGVkIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UgKi9cblx0cHVibGljIGRlbGV0ZUNvbW1lbnRzKHRhc2tJZDogc3RyaW5nLCBwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVDb21tZW50cyh0YXNrSWQsIHByb2Nlc3NJbnN0YW5jZUlkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFuIGluZGl2aWR1YWwgY29tbWVudCB3aXRoIHRoZSBnaXZlbiBpZC5cblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIGNvbW1lbnQgZXhpc3RzIHdpdGggdGhlIGdpdmVuIGlkLlxuXHQgKi9cblx0cHVibGljIGRlbGV0ZUNvbW1lbnQoY29tbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZUNvbW1lbnQoY29tbWVudElkKTtcblx0fVxuXG5cdC8qKiBUaGUgY29tbWVudHMgcmVsYXRlZCB0byB0aGUgZ2l2ZW4gdGFzay4gKi9cblx0cHVibGljIGdldFRhc2tDb21tZW50cyh0YXNrSWQ6IHN0cmluZywgdHlwZT86IHN0cmluZyk6IENvbW1lbnRbXSB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHR5cGUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRUYXNrQ29tbWVudHModGFza0lkLCB0eXBlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0VGFza0NvbW1lbnRzKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIEFsbCBjb21tZW50cyBvZiBhIGdpdmVuIHR5cGUuICovXG5cdHB1YmxpYyBnZXRDb21tZW50c0J5VHlwZSh0eXBlOiBzdHJpbmcpOiBDb21tZW50W10ge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldENvbW1lbnRzQnlUeXBlKHR5cGUpO1xuXHR9XG5cblx0LyoqIFRoZSBhbGwgZXZlbnRzIHJlbGF0ZWQgdG8gdGhlIGdpdmVuIHRhc2suICovXG5cdHB1YmxpYyBnZXRUYXNrRXZlbnRzKHRhc2tJZDogc3RyaW5nKTogVGFza0V2ZW50W10ge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFRhc2tFdmVudHModGFza0lkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIGluZGl2aWR1YWwgZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gaWQuIFJldHVybnMgbnVsbCBpZiBubyBldmVudCBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnQoZXZlbnRJZDogc3RyaW5nKTogVGFza0V2ZW50IHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRFdmVudChldmVudElkKTtcblx0fVxuXG5cdC8qKiBUaGUgY29tbWVudHMgcmVsYXRlZCB0byB0aGUgZ2l2ZW4gcHJvY2VzcyBpbnN0YW5jZS4gKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUNvbW1lbnRzKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBDb21tZW50W10ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbCh0eXBlKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0UHJvY2Vzc0luc3RhbmNlQ29tbWVudHMocHJvY2Vzc0luc3RhbmNlSWQsIHR5cGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRQcm9jZXNzSW5zdGFuY2VDb21tZW50cyhwcm9jZXNzSW5zdGFuY2VJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIG5ldyBhdHRhY2htZW50IHRvIGEgdGFzayBhbmQvb3IgYSBwcm9jZXNzIGluc3RhbmNlIGFuZCB1c2UgYW4gaW5wdXQgc3RyZWFtIHRvIHByb3ZpZGUgdGhlIGNvbnRlbnRcblx0ICovXG5cdHB1YmxpYyBjcmVhdGVBdHRhY2htZW50KGF0dGFjaG1lbnRUeXBlOiBzdHJpbmcsIHRhc2tJZDogc3RyaW5nLCBwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBhdHRhY2htZW50TmFtZTogc3RyaW5nLCBhdHRhY2htZW50RGVzY3JpcHRpb246IHN0cmluZywgY29udGVudD86IGFueVtdLCB1cmw/OiBzdHJpbmcpOiBBdHRhY2htZW50IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodXJsKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuY3JlYXRlQXR0YWNobWVudChhdHRhY2htZW50VHlwZSwgdGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgYXR0YWNobWVudE5hbWUsIGF0dGFjaG1lbnREZXNjcmlwdGlvbiwgdXJsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuY3JlYXRlQXR0YWNobWVudChhdHRhY2htZW50VHlwZSwgdGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgYXR0YWNobWVudE5hbWUsIGF0dGFjaG1lbnREZXNjcmlwdGlvbiwgU3RyZWFtcy5jcmVhdGVCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50KSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFVwZGF0ZSB0aGUgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgYW4gYXR0YWNobWVudCAqL1xuXHRwdWJsaWMgc2F2ZUF0dGFjaG1lbnQoYXR0YWNobWVudDogQXR0YWNobWVudCk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc2F2ZUF0dGFjaG1lbnQoYXR0YWNobWVudCk7XG5cdH1cblxuXHQvKiogUmV0cmlldmUgYSBwYXJ0aWN1bGFyIGF0dGFjaG1lbnQgKi9cblx0cHVibGljIGdldEF0dGFjaG1lbnQoYXR0YWNobWVudElkOiBzdHJpbmcpOiBBdHRhY2htZW50IHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRBdHRhY2htZW50KGF0dGFjaG1lbnRJZCk7XG5cdH1cblxuXHQvKiogUmV0cmlldmUgc3RyZWFtIGNvbnRlbnQgb2YgYSBwYXJ0aWN1bGFyIGF0dGFjaG1lbnQgKi9cblx0cHVibGljIGdldEF0dGFjaG1lbnRDb250ZW50KGF0dGFjaG1lbnRJZDogc3RyaW5nKTogYW55W10ge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSB0aGlzLnRhc2tTZXJ2aWNlLmdldEF0dGFjaG1lbnRDb250ZW50KGF0dGFjaG1lbnRJZCk7XG5cdFx0Y29uc3QgYmFvcyA9IFN0cmVhbXMuY3JlYXRlQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7XG5cdFx0U3RyZWFtcy5jb3B5TGFyZ2UoY29udGVudCwgYmFvcyk7XG5cdFx0cmV0dXJuIGJhb3MuZ2V0Qnl0ZXMoKVxuXHR9O1xuXG5cdC8qKiBUaGUgbGlzdCBvZiBhdHRhY2htZW50cyBhc3NvY2lhdGVkIHRvIGEgdGFzayAqL1xuXHRwdWJsaWMgZ2V0VGFza0F0dGFjaG1lbnRzKHRhc2tJZDogc3RyaW5nKTogQXR0YWNobWVudFtdIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRUYXNrQXR0YWNobWVudHModGFza0lkKTtcblx0fVxuXG5cdC8qKiBUaGUgbGlzdCBvZiBhdHRhY2htZW50cyBhc3NvY2lhdGVkIHRvIGEgcHJvY2VzcyBpbnN0YW5jZSAqL1xuXHRwdWJsaWMgZ2V0UHJvY2Vzc0luc3RhbmNlQXR0YWNobWVudHMocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZyk6IEF0dGFjaG1lbnRbXSB7XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0UHJvY2Vzc0luc3RhbmNlQXR0YWNobWVudHMocHJvY2Vzc0luc3RhbmNlSWQpO1xuXHR9XG5cblx0LyoqIERlbGV0ZSBhbiBhdHRhY2htZW50ICovXG5cdHB1YmxpYyBkZWxldGVBdHRhY2htZW50KGF0dGFjaG1lbnRJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVBdHRhY2htZW50KGF0dGFjaG1lbnRJZCk7XG5cdH1cblxuXHQvKiogVGhlIGxpc3Qgb2Ygc3VidGFza3MgZm9yIHRoaXMgcGFyZW50IHRhc2sgKi9cblx0cHVibGljIGdldFN1YlRhc2tzKHBhcmVudFRhc2tJZDogc3RyaW5nKTogVGFza1tdIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRTdWJUYXNrcyhwYXJlbnRUYXNrSWQpO1xuXHR9XG5cblx0cHJpdmF0ZSBpc05vdE51bGwocHJvcGVydHk6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBwcm9wZXJ0eSAhPT0gbnVsbCAmJiBwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkO1xuXHR9XG59XG5cbmNsYXNzIFRhc2tEYXRhIHtcblxuXHRwcml2YXRlIGRhdGE6IGFueTtcblxuXHRjb25zdHJ1Y3RvcihkYXRhOiBhbnkpIHtcblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xuXHR9XG5cblx0cHVibGljIGdldElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmV2aXNpb24oKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLnJldmlzaW9uO1xuXHR9XG5cblx0cHVibGljIGdldE93bmVyKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5vd25lciA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0QXNzaWduZWVVcGRhdGVkQ291bnQoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFzc2lnbmVlVXBkYXRlZENvdW50O1xuXHR9XG5cblx0cHVibGljIGdldE9yaWdpbmFsQXNzaWduZWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLm9yaWdpbmFsQXNzaWduZWUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldEFzc2lnbmVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hc3NpZ25lZSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RGVsZWdhdGlvblN0YXRlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5kZWxlZ2F0aW9uU3RhdGUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFBhcmVudFRhc2tJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEucGFyZW50VGFza0lkID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5uYW1lID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRMb2NhbGl6ZWROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5sb2NhbGl6ZWROYW1lID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXREZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuZGVzY3JpcHRpb24gPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldExvY2FsaXplZERlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5sb2NhbGl6ZWREZXNjcmlwdGlvbiA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJpb3JpdHkoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLnByaW9yaXR5O1xuXHR9XG5cblx0cHVibGljIGdldENyZWF0ZVRpbWUoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5jcmVhdGVUaW1lID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXREdWVEYXRlKCk6IERhdGUgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuZHVlRGF0ZSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U3VzcGVuc2lvblN0YXRlKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5zdXNwZW5zaW9uU3RhdGUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldENhdGVnb3J5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5jYXRlZ29yeSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgaXNJZGVudGl0eUxpbmtzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pc0lkZW50aXR5TGlua3NJbml0aWFsaXplZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRFeGVjdXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuZXhlY3V0aW9uSWQgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5wcm9jZXNzSW5zdGFuY2VJZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJvY2Vzc0RlZmluaXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEucHJvY2Vzc0RlZmluaXRpb25JZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U2NvcGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuc2NvcGVJZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U3ViU2NvcGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuc3ViU2NvcGVJZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U2NvcGVUeXBlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5zY29wZVR5cGUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFNjb3BlRGVmaW5pdGlvbklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5zY29wZURlZmluaXRpb25JZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0VGFza0RlZmluaXRpb25LZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLnRhc2tEZWZpbml0aW9uS2V5ID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRGb3JtS2V5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5mb3JtS2V5ID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBpc0RlbGV0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pc0RlbGV0ZWQ7XG5cdH1cblxuXHRwdWJsaWMgaXNDYW5jZWxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmlzQ2FuY2VsZWQ7XG5cdH1cblxuXHRwdWJsaWMgaXNDb3VudEVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pc0NvdW50RW5hYmxlZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUNvdW50KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS52YXJpYWJsZUNvdW50O1xuXHR9XG5cblx0cHVibGljIGdldElkZW50aXR5TGlua0NvdW50KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pZGVudGl0eUxpbmtDb3VudDtcblx0fVxuXG5cdHB1YmxpYyBnZXRDbGFpbVRpbWUoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5jbGFpbVRpbWUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFRlbmFudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS50ZW5hbnRJZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRFdmVudE5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmV2ZW50TmFtZSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RXZlbnRIYW5kbGVySWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmV2ZW50SGFuZGxlcklkID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBpc0ZvcmNlZFVwZGF0ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmZvcmNlZFVwZGF0ZTtcblx0fVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgb25lIHRhc2sgZm9yIGEgaHVtYW4gdXNlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrIGV4dGVuZHMgVGFza0luZm8ge1xuXG5cdC8qKiBOYW1lIG9yIHRpdGxlIG9mIHRoZSB0YXNrLiAqL1xuXHRzZXROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIFNldHMgYW4gb3B0aW9uYWwgbG9jYWxpemVkIG5hbWUgZm9yIHRoZSB0YXNrLiAqL1xuXHRzZXRMb2NhbGl6ZWROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIENoYW5nZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2sgKi9cblx0c2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIFNldHMgYW4gb3B0aW9uYWwgbG9jYWxpemVkIGRlc2NyaXB0aW9uIGZvciB0aGUgdGFzay4gKi9cblx0c2V0TG9jYWxpemVkRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIFNldHMgdGhlIGluZGljYXRpb24gb2YgaG93IGltcG9ydGFudC91cmdlbnQgdGhpcyB0YXNrIGlzICovXG5cdHNldFByaW9yaXR5KHByaW9yaXR5OiBudW1iZXIpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciBpZCBvZiB0aGUgcGVyc29uIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgdGFzay5cblx0ICovXG5cdHNldE93bmVyKG93bmVyOiBzdHJpbmcpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciBpZCBvZiB0aGUgcGVyc29uIHRvIHdoaWNoIHRoaXMgdGFzayBpcyBkZWxlZ2F0ZWQuXG5cdCAqL1xuXHRzZXRBc3NpZ25lZShhc3NpZ25lZTogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogVGhlIGN1cnJlbnQge0BsaW5rIERlbGVnYXRpb25TdGF0ZX0gZm9yIHRoaXMgdGFzay4gKi9cblx0Z2V0RGVsZWdhdGlvblN0YXRlKCk6IERlbGVnYXRpb25TdGF0ZTtcblxuXHQvKiogVGhlIGN1cnJlbnQge0BsaW5rIERlbGVnYXRpb25TdGF0ZX0gZm9yIHRoaXMgdGFzay4gKi9cblx0c2V0RGVsZWdhdGlvblN0YXRlKGRlbGVnYXRpb25TdGF0ZTogRGVsZWdhdGlvblN0YXRlKTogdm9pZDtcblxuXHQvKiogQ2hhbmdlIGR1ZSBkYXRlIG9mIHRoZSB0YXNrLiAqL1xuXHRzZXREdWVEYXRlKGR1ZURhdGU6IERhdGUpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGNhdGVnb3J5IG9mIHRoZSB0YXNrLiBUaGlzIGlzIGFuIG9wdGlvbmFsIGZpZWxkIGFuZCBhbGxvd3MgdG8gJ3RhZycgdGFza3MgYXMgYmVsb25naW5nIHRvIGEgY2VydGFpbiBjYXRlZ29yeS5cblx0ICovXG5cdHNldENhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiB2b2lkO1xuXG5cdC8qKiB0aGUgcGFyZW50IHRhc2sgZm9yIHdoaWNoIHRoaXMgdGFzayBpcyBhIHN1YnRhc2sgKi9cblx0c2V0UGFyZW50VGFza0lkKHBhcmVudFRhc2tJZDogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogQ2hhbmdlIHRoZSB0ZW5hbnRJZCBvZiB0aGUgdGFzayAqL1xuXHRzZXRUZW5hbnRJZCh0ZW5hbnRJZDogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogQ2hhbmdlIHRoZSBmb3JtIGtleSBvZiB0aGUgdGFzayAqL1xuXHRzZXRGb3JtS2V5KGZvcm1LZXk6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdGFzayBpcyBzdXNwZW5kZWQgb3Igbm90LiAqL1xuXHRpc1N1c3BlbmRlZCgpOiBib29sZWFuO1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza0luZm8ge1xuXG5cdC8qKiBEQiBpZCBvZiB0aGUgdGFzay4gKi9cblx0Z2V0SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBOYW1lIG9yIHRpdGxlIG9mIHRoZSB0YXNrLlxuXHQgKi9cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIEZyZWUgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgdGFzay5cblx0ICovXG5cdGdldERlc2NyaXB0aW9uKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogSW5kaWNhdGlvbiBvZiBob3cgaW1wb3J0YW50L3VyZ2VudCB0aGlzIHRhc2sgaXNcblx0ICovXG5cdGdldFByaW9yaXR5KCk6IG51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIHRhc2suXG5cdCAqL1xuXHRnZXRPd25lcigpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIGlkIG9mIHRoZSBwZXJzb24gdG8gd2hpY2ggdGhpcyB0YXNrIGlzIGRlbGVnYXRlZC5cblx0ICovXG5cdGdldEFzc2lnbmVlKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzIGluc3RhbmNlIG9yIG51bGwgaWYgaXQgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHBhdGggb2YgZXhlY3V0aW9uIG9yIG51bGwgaWYgaXQgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0Z2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHRhc2sgZGVmaW5pdGlvbiBvciBudWxsIGlmIGl0IGlzIG5vdCByZWxhdGVkIHRvIGFueSB0YXNrIGRlZmluaXRpb24uXG5cdCAqL1xuXHRnZXRUYXNrRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzIGRlZmluaXRpb24gb3IgbnVsbCBpZiBpdCBpcyBub3QgcmVsYXRlZCB0byBhIHByb2Nlc3MuXG5cdCAqL1xuXHRnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIGEgc2NvcGUgaWRlbnRpZmllciBvciBudWxsIGlmIG5vbmUgaXMgc2V0IChlLmcuIGZvciBicG1uIHByb2Nlc3MgdGFzayBpdCBpcyBudWxsKVxuXHQgKi9cblx0Z2V0U2NvcGVJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFJlZmVyZW5jZSB0byBhIHN1YiBzY29wZSBpZGVudGlmaWVyIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQgKGUuZy4gZm9yIGJwbW4gcHJvY2VzcyB0YXNrIGl0IGlzIG51bGwpXG5cdCAqL1xuXHRnZXRTdWJTY29wZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIGEgc2NvcGUgdHlwZSBvciBudWxsIGlmIG5vbmUgaXMgc2V0IChlLmcuIGZvciBicG1uIHByb2Nlc3MgdGFzayBpdCBpcyBudWxsKVxuXHQgKi9cblx0Z2V0U2NvcGVUeXBlKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIGEgc2NvcGUgZGVmaW5pdGlvbiBpZGVudGlmaWVyIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQgKGUuZy4gZm9yIGJwbW4gcHJvY2VzcyB0YXNrIGl0IGlzIG51bGwpXG5cdCAqL1xuXHRnZXRTY29wZURlZmluaXRpb25JZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIElmIHRoaXMgdGFzayBydW5zIGluIHRoZSBjb250ZXh0IG9mIGEgY2FzZSBhbmQgc3RhZ2UsIHRoaXMgbWV0aG9kIHJldHVybnMgaXQncyBjbG9zZXN0IHBhcmVudCBzdGFnZSBpbnN0YW5jZSBpZCAodGhlIHN0YWdlIHBsYW4gaXRlbSBpbnN0YW5jZSBpZCB0byBiZVxuXHQgKiBwcmVjaXNlKS4gRXZlbiBpZiB0aGUgZGlyZWN0IHBhcmVudCBvZiB0aGUgdGFzayBpcyBhIHByb2Nlc3Mgd2hpY2ggaXRzZWxmIG1pZ2h0IGhhdmUgYmVlbiBjcmVhdGVkIG91dCBvZiBhIHByb2Nlc3MgdGFzayBvZiBhIGNhc2UsIGl0cyBzdGFnZSBpbnN0YW5jZVxuXHQgKiBpcyByZWZsZWN0ZWQgaW4gdGhlIHRhc2suXG5cdCAqXG5cdCAqIEByZXR1cm4gdGhlIHN0YWdlIGluc3RhbmNlIGlkIHRoaXMgdGFzayBiZWxvbmdzIHRvIG9yIG51bGwsIGlmIHRoaXMgdGFzayBpcyBub3QgcGFydCBvZiBhIGNhc2UgYXQgYWxsIG9yIGlzIG5vdCBhIGNoaWxkIGVsZW1lbnQgb2YgYSBzdGFnZVxuXHQgKi9cblx0Z2V0UHJvcGFnYXRlZFN0YWdlSW5zdGFuY2VJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSBzdGF0ZSBvZiB0aGlzIHRhc2tcblx0ICovXG5cdGdldFN0YXRlKCk6IHN0cmluZztcblxuXHQvKiogVGhlIGRhdGUvdGltZSB3aGVuIHRoaXMgdGFzayB3YXMgY3JlYXRlZCAqL1xuXHRnZXRDcmVhdGVUaW1lKCk6IERhdGU7XG5cblx0LyoqIFRoZSBkYXRlL3RpbWUgd2hlbiB0aGlzIHRhc2sgd2FzIHB1dCBpbiBwcm9ncmVzcyAqL1xuXHRnZXRJblByb2dyZXNzU3RhcnRUaW1lKCk6IERhdGU7XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIHJlZmVyZW5jZSB0aGF0IHB1dCB0aGlzIHRhc2sgaW4gcHJvZ3Jlc3Ncblx0ICovXG5cdGdldEluUHJvZ3Jlc3NTdGFydGVkQnkoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgY2xhaW0gdGltZSBvZiB0aGlzIHRhc2tcblx0ICovXG5cdGdldENsYWltVGltZSgpOiBEYXRlO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBjbGFpbWVkIHRoaXMgdGFza1xuXHQgKi9cblx0Z2V0Q2xhaW1lZEJ5KCk6IFN0cmluZztcblxuXHQvKipcblx0ICogVGhlIHN1c3BlbmRlZCB0aW1lIG9mIHRoaXMgdGFza1xuXHQgKi9cblx0Z2V0U3VzcGVuZGVkVGltZSgpOiBEYXRlO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdXNwZW5kZWQgdGhpcyB0YXNrXG5cdCAqL1xuXHRnZXRTdXNwZW5kZWRCeSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSBpZCBvZiB0aGUgYWN0aXZpdHkgaW4gdGhlIHByb2Nlc3MgZGVmaW5pbmcgdGhpcyB0YXNrIG9yIG51bGwgaWYgdGhpcyBpcyBub3QgcmVsYXRlZCB0byBhIHByb2Nlc3Ncblx0ICovXG5cdGdldFRhc2tEZWZpbml0aW9uS2V5KCk6IHN0cmluZztcblxuXHQvKipcblx0ICogSW4gcHJvZ3Jlc3Mgc3RhcnQgZHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRnZXRJblByb2dyZXNzU3RhcnREdWVEYXRlKCk6IERhdGU7XG5cblx0LyoqXG5cdCAqIER1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKi9cblx0Z2V0RHVlRGF0ZSgpOiBEYXRlO1xuXG5cdC8qKlxuXHQgKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIHRhc2suIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgYW5kIGFsbG93cyB0byAndGFnJyB0YXNrcyBhcyBiZWxvbmdpbmcgdG8gYSBjZXJ0YWluIGNhdGVnb3J5LlxuXHQgKi9cblx0Z2V0Q2F0ZWdvcnkoKTsgc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHRhc2sgZm9yIHdoaWNoIHRoaXMgdGFzayBpcyBhIHN1YnRhc2tcblx0ICovXG5cdGdldFBhcmVudFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSB0ZW5hbnQgaWRlbnRpZmllciBvZiB0aGlzIHRhc2tcblx0ICovXG5cdGdldFRlbmFudElkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIGZvcm0ga2V5IGZvciB0aGUgdXNlciB0YXNrXG5cdCAqL1xuXHRnZXRGb3JtS2V5KCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbG9jYWwgdGFzayB2YXJpYWJsZXMgaWYgcmVxdWVzdGVkIGluIHRoZSB0YXNrIHF1ZXJ5XG5cdCAqL1xuXHRnZXRUYXNrTG9jYWxWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgT2JqZWN0PjtcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcHJvY2VzcyB2YXJpYWJsZXMgaWYgcmVxdWVzdGVkIGluIHRoZSB0YXNrIHF1ZXJ5XG5cdCAqL1xuXHRnZXRQcm9jZXNzVmFyaWFibGVzKCk6IE1hcDxzdHJpbmcsIE9iamVjdD47XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGNhc2UgdmFyaWFibGVzIGlmIHJlcXVlc3RlZCBpbiB0aGUgdGFzayBxdWVyeVxuXHQgKi9cblx0Z2V0Q2FzZVZhcmlhYmxlcygpOiBNYXA8c3RyaW5nLCBPYmplY3Q+O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBpZGVudGl0eSBsaW5rcy5cblx0ICovXG5cdGdldElkZW50aXR5TGlua3MoKTogSWRlbnRpdHlMaW5rSW5mb1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TGlua0luZm8ge1xuXHRnZXRUeXBlKCk6IHN0cmluZztcblxuXHRnZXRVc2VySWQoKTogc3RyaW5nO1xuXG5cdGdldEdyb3VwSWQoKTogc3RyaW5nO1xuXG5cdGdldFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG5cdGdldFNjb3BlSWQoKTogc3RyaW5nO1xuXG5cdGdldFN1YlNjb3BlSWQoKTogc3RyaW5nO1xuXG5cdGdldFNjb3BlVHlwZSgpOiBzdHJpbmc7XG5cblx0Z2V0U2NvcGVEZWZpbml0aW9uSWQoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TGluayBleHRlbmRzIElkZW50aXR5TGlua0luZm8ge1xuXG5cdC8qKlxuXHQgKiBUaGUgcHJvY2VzcyBkZWZpbml0aW9uIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlkZW50aXR5IGxpbmsuXG5cdCAqL1xuXHRnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxufVxuXG5leHBvcnQgZW51bSBEZWxlZ2F0aW9uU3RhdGUge1xuXG5cdC8qKlxuXHQgKiBUaGUgb3duZXIgZGVsZWdhdGVkIHRoZSB0YXNrIGFuZCB3YW50cyB0byByZXZpZXcgdGhlIHJlc3VsdCBhZnRlciB0aGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLiBXaGVuIHRoZSBhc3NpZ25lZSBjb21wbGV0ZXMgdGhlIHRhc2ssIHRoZSB0YXNrIGlzIG1hcmtlZCBhcyB7QGxpbmsgI1JFU09MVkVEfSBhbmQgc2VudCBiYWNrXG5cdCAqIHRvIHRoZSBvd25lci4gV2hlbiB0aGF0IGhhcHBlbnMsIHRoZSBvd25lciBpcyBzZXQgYXMgdGhlIGFzc2lnbmVlIHNvIHRoYXQgdGhlIG93bmVyIGdldHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8uXG5cdCAqL1xuXHRQRU5ESU5HLFxuXG5cdC8qKlxuXHQgKiBUaGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLCB0aGUgYXNzaWduZWUgd2FzIHNldCB0byB0aGUgb3duZXIgYWdhaW4gYW5kIHRoZSBvd25lciBub3cgZmluZHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8gbGlzdCBmb3IgcmV2aWV3LiBUaGUgb3duZXIgbm93IGlzIGFibGUgdG8gY29tcGxldGUgdGhlIHRhc2suXG5cdCAqL1xuXHRSRVNPTFZFRFxufVxuXG4vKipcbiAqIFdyYXBzIHtAbGluayBUYXNrSW5mb30gdG8gdGhlIGJ1aWxkZXIuXG4gKiBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrQnVpbGRlciB7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGFzayBpbnN0YW5jZSBhY2NvcmRpbmcgdmFsdWVzIHNldCBpbiB0aGUgYnVpbGRlclxuXHQgKiBcblx0ICogQHJldHVybiB0YXNrIGluc3RhbmNlXG5cdCAqL1xuXHRjcmVhdGUoKTogVGFzaztcblxuXHQvKipcblx0ICogREIgaWQgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRpZChpZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldElkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogTmFtZSBvciB0aXRsZSBvZiB0aGUgdGFzay5cblx0ICovXG5cdG5hbWUobmFtZTogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldE5hbWUoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBGcmVlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRkZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldERlc2NyaXB0aW9uKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogSW5kaWNhdGlvbiBvZiBob3cgaW1wb3J0YW50L3VyZ2VudCB0aGlzIHRhc2sgaXNcblx0ICovXG5cdHByaW9yaXR5KHByaW9yaXR5OiBudW1iZXIpOiBUYXNrQnVpbGRlcjtcblx0Z2V0UHJpb3JpdHkoKTogbnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlcklkIG9mIHRoZSBwZXJzb24gdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyB0YXNrLlxuXHQgKi9cblx0b3duZXIob3duZXJJZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldE93bmVyKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIHVzZXJJZCBvZiB0aGUgcGVyc29uIHRvIHdoaWNoIHRoaXMgdGFzayBpcyBkZWxlZ2F0ZWQuXG5cdCAqL1xuXHRhc3NpZ25lZShhc3NpZ25lSWQ6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRBc3NpZ25lZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIENoYW5nZSBkdWUgZGF0ZSBvZiB0aGUgdGFzay5cblx0ICovXG5cdGR1ZURhdGUoZHVlRGF0ZTogRGF0ZSk6IFRhc2tCdWlsZGVyO1xuXHRnZXREdWVEYXRlKCk6IERhdGU7XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgY2F0ZWdvcnkgb2YgdGhlIHRhc2suIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgYW5kIGFsbG93cyB0byAndGFnJyB0YXNrcyBhcyBiZWxvbmdpbmcgdG8gYSBjZXJ0YWluIGNhdGVnb3J5LlxuXHQgKi9cblx0Y2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRDYXRlZ29yeSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIHRoZSBwYXJlbnQgdGFzayBmb3Igd2hpY2ggdGhpcyB0YXNrIGlzIGEgc3VidGFza1xuXHQgKi9cblx0cGFyZW50VGFza0lkKHBhcmVudFRhc2tJZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldFBhcmVudFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgdGVuYW50SWQgb2YgdGhlIHRhc2tcblx0ICovXG5cdHRlbmFudElkKHRlbmFudElkOiBzdHJpbmcpOiBUYXNrQnVpbGRlcjtcblx0Z2V0VGVuYW50SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGZvcm0ga2V5IG9mIHRoZSB0YXNrXG5cdCAqL1xuXHRmb3JtS2V5KGZvcm1LZXk6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRGb3JtS2V5KCk6IHN0cmluZztcblxuXHQvKipcblx0ICogdGFzayBkZWZpbml0aW9uIGlkIHRvIGNyZWF0ZSB0YXNrIGZyb21cblx0ICovXG5cdHRhc2tEZWZpbml0aW9uSWQodGFza0RlZmluaXRpb25JZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldFRhc2tEZWZpbml0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiB0YXNrIGRlZmluaXRpb24ga2V5IHRvIGNyZWF0ZSB0YXNrIGZyb21cblx0ICovXG5cdHRhc2tEZWZpbml0aW9uS2V5KHRhc2tEZWZpbml0aW9uS2V5OiBzdHJpbmcpOiBUYXNrQnVpbGRlcjtcblx0Z2V0VGFza0RlZmluaXRpb25LZXkoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBhZGQgaWRlbnRpdHkgbGlua3MgdG8gdGhlIHRhc2tcblx0ICovXG5cdGlkZW50aXR5TGlua3MoaWRlbnRpdHlMaW5rczogU2V0PElkZW50aXR5TGlua0luZm8+KTogVGFza0J1aWxkZXI7XG5cdGdldElkZW50aXR5TGlua3MoKTogU2V0PElkZW50aXR5TGlua0luZm8+O1xuXG5cdC8qKlxuXHQgKiBhZGQgdGFzayBzY29wZUlkXG5cdCAqL1xuXHRzY29wZUlkKHNjb3BlSWQ6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRTY29wZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQWRkIHNjb3BlIHR5cGVcblx0ICovXG5cdHNjb3BlVHlwZShzY29wZVR5cGU6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRTY29wZVR5cGUoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1JbmZvIHtcblxuXHRnZXRJZCgpOiBzdHJpbmc7XG5cblx0c2V0SWQoaWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG5cblx0c2V0TmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkO1xuXG5cdGdldERlc2NyaXB0aW9uKCk6IHN0cmluZztcblxuXHRzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZDtcblxuXHRnZXRLZXkoKTogc3RyaW5nO1xuXG5cdHNldEtleShrZXk6IHN0cmluZyk6IHZvaWQ7XG5cblx0Z2V0VmVyc2lvbigpOiBudW1iZXI7XG5cblx0c2V0VmVyc2lvbih2ZXJzaW9uOiBudW1iZXIpOiB2b2lkO1xuXG5cdGdldEZvcm1Nb2RlbCgpOiBhbnk7XG5cblx0c2V0Rm9ybU1vZGVsKGZvcm1Nb2RlbDogYW55KTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWx1ZUZpZWxkcyB7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlXG5cdCAqL1xuXHRnZXROYW1lKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgcHJvY2VzcyBpbnN0YW5jZSBpZCBvZiB0aGUgdmFyaWFibGVcblx0ICovXG5cdGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgZXhlY3V0aW9uIGlkIG9mIHRoZSB2YXJpYWJsZVxuXHQgKi9cblx0Z2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHRoZSBzY29wZSBpZCBvZiB0aGUgdmFyaWFibGVcblx0ICovXG5cdGdldFNjb3BlSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHRoZSBzdWIgc2NvcGUgaWQgb2YgdGhlIHZhcmlhYmxlXG5cdCAqL1xuXHRnZXRTdWJTY29wZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgc2NvcGUgdHlwZSBvZiB0aGUgdmFyaWFibGVcblx0ICovXG5cdGdldFNjb3BlVHlwZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIHRhc2sgaWQgb2YgdGhlIHZhcmlhYmxlXG5cdCAqL1xuXHRnZXRUYXNrSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHRoZSBmaXJzdCB0ZXh0IHZhbHVlLCBpZiBhbnksIG9yIG51bGwuXG5cdCAqL1xuXHRnZXRUZXh0VmFsdWUoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBmaXJzdCB0ZXh0IHZhbHVlLiBBIHZhbHVlIG9mIG51bGwgaXMgYWxsb3dlZC5cblx0ICovXG5cdHNldFRleHRWYWx1ZSh0ZXh0VmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIHNlY29uZCB0ZXh0IHZhbHVlLCBpZiBhbnksIG9yIG51bGwuXG5cdCAqL1xuXHRnZXRUZXh0VmFsdWUyKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogU2V0cyBzZWNvbmQgdGV4dCB2YWx1ZS4gQSB2YWx1ZSBvZiBudWxsIGlzIGFsbG93ZWQuXG5cdCAqL1xuXHRzZXRUZXh0VmFsdWUyKHRleHRWYWx1ZTI6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIGxvbmcgdmFsdWUsIGlmIGFueSwgb3IgbnVsbC5cblx0ICovXG5cdGdldExvbmdWYWx1ZSgpOiBudW1iZXI7XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGxvbmcgdmFsdWUuIEEgdmFsdWUgb2YgbnVsbCBpcyBhbGxvd2VkLlxuXHQgKi9cblx0c2V0TG9uZ1ZhbHVlKGxvbmdWYWx1ZTogbnVtYmVyKTogdm9pZDtcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgZG91YmxlIHZhbHVlLCBpZiBhbnksIG9yIG51bGwuXG5cdCAqL1xuXHRnZXREb3VibGVWYWx1ZSgpOiBudW1iZXI7XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGRvdWJsZSB2YWx1ZS4gQSB2YWx1ZSBvZiBudWxsIGlzIGFsbG93ZWQuXG5cdCAqL1xuXHRzZXREb3VibGVWYWx1ZShkb3VibGVWYWx1ZTogbnVtYmVyKTogdm9pZDtcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgYnl0ZSBhcnJheSB2YWx1ZSwgaWYgYW55LCBvciBudWxsLlxuXHQgKi9cblx0Z2V0Qnl0ZXMoKTogYW55W107XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJ5dGUgYXJyYXkgdmFsdWUuIEEgdmFsdWUgb2YgbnVsbCBpcyBhbGxvd2VkLlxuXHQgKi9cblx0c2V0Qnl0ZXMoYnl0ZXM6IGFueVtdKTogdm9pZDtcblxuXHRnZXRDYWNoZWRWYWx1ZSgpOiBhbnk7XG5cblx0c2V0Q2FjaGVkVmFsdWUoY2FjaGVkVmFsdWU6IGFueSk6IHZvaWQ7XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYXJpYWJsZUluc3RhbmNlIGV4dGVuZHMgVmFsdWVGaWVsZHMge1xuXG5cdGdldElkKCk6IHN0cmluZztcblxuXHRzZXRJZChpZDogc3RyaW5nKTogdm9pZDtcblxuXHRzZXROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0RXhlY3V0aW9uSWQoZXhlY3V0aW9uSWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0UHJvY2Vzc0luc3RhbmNlSWQocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0UHJvY2Vzc0RlZmluaXRpb25JZChwcm9jZXNzRGVmaW5pdGlvbklkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdGdldFByb2Nlc3NEZWZpbml0aW9uSWQoKTogc3RyaW5nO1xuXG5cdGdldFZhbHVlKCk6IGFueTtcblxuXHRzZXRWYWx1ZSh2YWx1ZTogYW55KTogdm9pZDtcblxuXHRnZXRUeXBlTmFtZSgpOiBzdHJpbmc7XG5cblx0c2V0VHlwZU5hbWUodHlwZU5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0aXNSZWFkT25seSgpOiBib29sZWFuO1xuXG5cdHNldFRhc2tJZCh0YXNrSWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0U2NvcGVJZChzY29wZUlkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdHNldFN1YlNjb3BlSWQoc3ViU2NvcGVJZDogc3RyaW5nKTogdm9pZDtcblxuXHRzZXRTY29wZVR5cGUoc2NvcGVUeXBlOiBzdHJpbmcpOiB2b2lkO1xuXG5cdHNldFNjb3BlRGVmaW5pdGlvbklkKHNjb3BlRGVmaW5pdGlvbklkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdGdldFNjb3BlRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxuXHRnZXRNZXRhSW5mbygpOiBzdHJpbmc7XG5cblx0c2V0TWV0YUluZm8obWV0YUluZm86IHN0cmluZyk6IHZvaWQ7XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhT2JqZWN0IHtcblxuXHQvKipcblx0ICogVGhlIHVuaXF1ZSBpZCBvZiB0aGlzIERhdGEgT2JqZWN0LlxuXHQgKi9cblx0Z2V0SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgLyoqXG5cdCAqIFRoZSBpZCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0aGF0IHRoaXMgRGF0YSBPYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKi9cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgaWQgb2YgdGhlIGV4ZWN1dGlvbiBpbiB3aGljaCB0aGlzIERhdGEgT2JqZWN0IHJlc2lkZXMuIEEgRGF0YU9iamVjdCBvbmx5IHJlc2lkZXMgb24gYSBwcm9jZXNzIGluc3RhbmNlXG5cdCAqIGV4ZWN1dGlvbiBvciBhIHN1YnByb2Nlc3MgZXhlY3V0aW9uLlxuXHQgKi9cblx0Z2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBOYW1lIG9mIHRoZSBEYXRhT2JqZWN0LlxuXHQgKi9cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIExvY2FsaXplZCBOYW1lIG9mIHRoZSBEYXRhT2JqZWN0LlxuXHQgKi9cblx0Z2V0TG9jYWxpemVkTmFtZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIERlc2NyaXB0aW9uIG9mIHRoZSBEYXRhT2JqZWN0LlxuXHQgKi9cblx0Z2V0RGVzY3JpcHRpb24oKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBWYWx1ZSBvZiB0aGUgRGF0YU9iamVjdC5cblx0ICovXG5cdGdldFZhbHVlKCk6IGFueTtcblxuXHQvKipcblx0ICogVHlwZSBvZiB0aGUgRGF0YU9iamVjdC5cblx0ICovXG5cdGdldFR5cGUoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgaWQgb2YgdGhlIGZsb3cgZWxlbWVudCBpbiB0aGUgcHJvY2VzcyBkZWZpbmluZyB0aGlzIGRhdGEgb2JqZWN0LlxuXHQgKi9cblx0Z2V0RGF0YU9iamVjdERlZmluaXRpb25LZXkoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1lbnQge1xuXG5cdC8qKiB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjb21tZW50ICovXG5cdGdldElkKCk6IHN0cmluZztcblxuXHQvKiogcmVmZXJlbmNlIHRvIHRoZSB1c2VyIHRoYXQgbWFkZSB0aGUgY29tbWVudCAqL1xuXHRnZXRVc2VySWQoKTogc3RyaW5nO1xuXG5cdHNldFVzZXJJZCh1c2VySWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0Z2V0VGltZSgpOiBEYXRlO1xuXG5cdHNldFRpbWUodGltZTogRGF0ZSk7XG5cblx0LyoqIHJlZmVyZW5jZSB0byB0aGUgdGFzayBvbiB3aGljaCB0aGlzIGNvbW1lbnQgd2FzIG1hZGUgKi9cblx0Z2V0VGFza0lkKCk6IHN0cmluZztcblxuXHRzZXRUYXNrSWQodGFza0lkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHByb2Nlc3MgaW5zdGFuY2Ugb24gd2hpY2ggdGhpcyBjb21tZW50IHdhcyBtYWRlICovXG5cdGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZztcblxuXHRzZXRQcm9jZXNzSW5zdGFuY2VJZChwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogcmVmZXJlbmNlIHRvIHRoZSB0eXBlIGdpdmVuIHRvIHRoZSBjb21tZW50ICovXG5cdGdldFR5cGUoKTogc3RyaW5nO1xuXG5cdHNldFR5cGUodHlwZTogc3RyaW5nKTogdm9pZDtcblxuXHQvKipcblx0ICogdGhlIGZ1bGwgY29tbWVudCBtZXNzYWdlIHRoZSB1c2VyIGhhZCByZWxhdGVkIHRvIHRoZSB0YXNrIGFuZC9vciBwcm9jZXNzIGluc3RhbmNlXG5cdCAqIFxuXHQgKiBAc2VlIFRhc2tTZXJ2aWNlI2dldFRhc2tDb21tZW50cyhTdHJpbmcpXG5cdCAqL1xuXHRnZXRGdWxsTWVzc2FnZSgpOiBzdHJpbmc7XG5cblx0c2V0RnVsbE1lc3NhZ2UoZnVsbE1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza0V2ZW50IHtcblxuXHQvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQgKi9cblx0Z2V0SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhlIHR5cGUgb2Ygb2YgYWN0aW9uIGFuZCBhbHNvIGluZGljYXRlcyB0aGUgbWVhbmluZyBvZiB0aGUgcGFydHMgYXMgZXhwb3NlZCBpbiB7QGxpbmsgI2dldE1lc3NhZ2VQYXJ0cygpfVxuXHQgKi9cblx0Z2V0QWN0aW9uKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIG1lYW5pbmcgb2YgdGhlIG1lc3NhZ2UgcGFydHMgaXMgZGVmaW5lZCBieSB0aGUgYWN0aW9uIGFzIHlvdSBjYW4gZmluZCBpbiB7QGxpbmsgI2dldEFjdGlvbigpfVxuXHQgKi9cblx0Z2V0TWVzc2FnZVBhcnRzKCk6IHN0cmluZ1tdO1xuXG5cdC8qKlxuXHQgKiBUaGUgbWVzc2FnZSB0aGF0IGNhbiBiZSB1c2VkIGluIGNhc2UgdGhpcyBhY3Rpb24gb25seSBoYXMgYSBzaW5nbGUgbWVzc2FnZSBwYXJ0LlxuXHQgKi9cblx0Z2V0TWVzc2FnZSgpOiBzdHJpbmc7XG5cblx0LyoqIHJlZmVyZW5jZSB0byB0aGUgdXNlciB0aGF0IG1hZGUgdGhlIGNvbW1lbnQgKi9cblx0Z2V0VXNlcklkKCk6IHN0cmluZztcblxuXHQvKiogdGltZSBhbmQgZGF0ZSB3aGVuIHRoZSB1c2VyIG1hZGUgdGhlIGNvbW1lbnQgKi9cblx0Z2V0VGltZSgpOiBEYXRlO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHRhc2sgb24gd2hpY2ggdGhpcyBjb21tZW50IHdhcyBtYWRlICovXG5cdGdldFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0LyoqIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VzcyBpbnN0YW5jZSBvbiB3aGljaCB0aGlzIGNvbW1lbnQgd2FzIG1hZGUgKi9cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG5cblx0LyoqIHVuaXF1ZSBpZCBmb3IgdGhpcyBhdHRhY2htZW50ICovXG5cdGdldElkKCk6IHN0cmluZztcblxuXHQvKiogZnJlZSB1c2VyIGRlZmluZWQgc2hvcnQgKG1heCAyNTUgY2hhcnMpIG5hbWUgZm9yIHRoaXMgYXR0YWNobWVudCAqL1xuXHRnZXROYW1lKCk6IHN0cmluZztcblxuXHQvKiogZnJlZSB1c2VyIGRlZmluZWQgc2hvcnQgKG1heCAyNTUgY2hhcnMpIG5hbWUgZm9yIHRoaXMgYXR0YWNobWVudCAqL1xuXHRzZXROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIGxvbmcgKG1heCAyNTUgY2hhcnMpIGV4cGxhbmF0aW9uIHdoYXQgdGhpcyBhdHRhY2htZW50IGlzIGFib3V0IGluIGNvbnRleHQgb2YgdGhlIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UgaXQncyBsaW5rZWQgdG8uXG5cdCAqL1xuXHRnZXREZXNjcmlwdGlvbigpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIGxvbmcgKG1heCAyNTUgY2hhcnMpIGV4cGxhbmF0aW9uIHdoYXQgdGhpcyBhdHRhY2htZW50IGlzIGFib3V0IGluIGNvbnRleHQgb2YgdGhlIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UgaXQncyBsaW5rZWQgdG8uXG5cdCAqL1xuXHRzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZDtcblxuXHQvKipcblx0ICogaW5kaWNhdGlvbiBvZiB0aGUgdHlwZSBvZiBjb250ZW50IHRoYXQgdGhpcyBhdHRhY2htZW50IHJlZmVycyB0by4gQ2FuIGJlIG1pbWUgdHlwZSBvciBhbnkgb3RoZXIgaW5kaWNhdGlvbi5cblx0ICovXG5cdGdldFR5cGUoKTogc3RyaW5nO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHRhc2sgdG8gd2hpY2ggdGhpcyBhdHRhY2htZW50IGlzIGFzc29jaWF0ZWQuICovXG5cblx0Z2V0VGFza0lkKCk6IHN0cmluZztcblx0LyoqXG5cdCAqIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byB3aGljaCB0aGlzIGF0dGFjaG1lbnQgaXMgYXNzb2NpYXRlZC5cblx0ICovXG5cdGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogdGhlIHJlbW90ZSBVUkwgaW4gY2FzZSB0aGlzIGlzIHJlbW90ZSBjb250ZW50LiBJZiB0aGUgYXR0YWNobWVudCBjb250ZW50IHdhcyB7QGxpbmsgVGFza1NlcnZpY2UjY3JlYXRlQXR0YWNobWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgamF2YS5pby5JbnB1dFN0cmVhbSkgdXBsb2FkZWQgd2l0aCBhblxuXHQgKiBpbnB1dCBzdHJlYW19LCB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBhbmQgdGhlIGNvbnRlbnQgY2FuIGJlIGZldGNoZWQgd2l0aCB7QGxpbmsgVGFza1NlcnZpY2UjZ2V0QXR0YWNobWVudENvbnRlbnQoU3RyaW5nKX0uXG5cdCAqL1xuXHRnZXRVcmwoKTogc3RyaW5nO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHVzZXIgd2hvIGNyZWF0ZWQgdGhpcyBhdHRhY2htZW50LiAqL1xuXHRnZXRVc2VySWQoKTogc3RyaW5nO1xuXG5cdC8qKiB0aW1lc3RhbXAgd2hlbiB0aGlzIGF0dGFjaG1lbnQgd2FzIGNyZWF0ZWQgKi9cblx0Z2V0VGltZSgpOiBEYXRlO1xuXG5cdC8qKiB0aW1lc3RhbXAgd2hlbiB0aGlzIGF0dGFjaG1lbnQgd2FzIGNyZWF0ZWQgKi9cblx0c2V0VGltZSh0aW1lOiBEYXRlKTogdm9pZDtcblxuXHQvKiogdGhlIGlkIG9mIHRoZSBieXRlIGFycmF5IGVudGl0eSBzdG9yaW5nIHRoZSBjb250ZW50ICovXG5cdGdldENvbnRlbnRJZCgpOiBzdHJpbmc7XG5cbn1cblxuZXhwb3J0IGVudW0gTnVsbEhhbmRsaW5nT25PcmRlciB7XG5cdE5VTExTX0ZJUlNULCBOVUxMU19MQVNUXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlQcm9wZXJ0eSB7XG5cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnk8VCwgVT4ge1xuXG5cdC8qKlxuXHQgKiBPcmRlciB0aGUgcmVzdWx0cyBhc2NlbmRpbmcgb24gdGhlIGdpdmVuIHByb3BlcnR5IGFzIGRlZmluZWQgaW4gdGhpcyBjbGFzcyAobmVlZHMgdG8gY29tZSBhZnRlciBhIGNhbGwgdG8gb25lIG9mIHRoZSBvcmRlckJ5WHh4eCBtZXRob2RzKS5cblx0ICovXG5cdGFzYygpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciB0aGUgcmVzdWx0cyBkZXNjZW5kaW5nIG9uIHRoZSBnaXZlbiBwcm9wZXJ0eSBhcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MgKG5lZWRzIHRvIGNvbWUgYWZ0ZXIgYSBjYWxsIHRvIG9uZSBvZiB0aGUgb3JkZXJCeVh4eHggbWV0aG9kcykuXG5cdCAqL1xuXHRkZXNjKCk6IFQ7XG5cblx0b3JkZXJCeShwcm9wZXJ0eTogUXVlcnlQcm9wZXJ0eSk6IFQ7XG5cblx0b3JkZXJCeShwcm9wZXJ0eTogUXVlcnlQcm9wZXJ0eSwgbnVsbEhhbmRsaW5nT25PcmRlcjogTnVsbEhhbmRsaW5nT25PcmRlcik6IFQ7XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlc3VsdHNcblx0ICovXG5cdGNvdW50KCk6IG51bWJlcjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgZW50aXR5IG9yIG51bGwgaWYgbm8gZW50aXR5IG1hdGNoZXMgdGhlIHF1ZXJ5IGNyaXRlcmlhLlxuXHQgKlxuXHQgKiBAdGhyb3dzIG9yZy5mbG93YWJsZS5jb21tb24uZW5naW5lLmFwaS5GbG93YWJsZUV4Y2VwdGlvbiB3aGVuIHRoZSBxdWVyeSByZXN1bHRzIGluIG1vcmUgdGhhbiBvbmUgZW50aXRpZXMuXG5cdCAqL1xuXHRzaW5nbGVSZXN1bHQoKTogVTtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCBnZXQgYSBsaXN0IG9mIGVudGl0aWVzIGFzIHRoZSByZXN1bHQuXG5cdCAqL1xuXHRsaXN0KCk6IFVbXTtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCBnZXQgYSBsaXN0IG9mIGVudGl0aWVzIGFzIHRoZSByZXN1bHQuXG5cdCAqL1xuXHRsaXN0UGFnZShmaXJzdFJlc3VsdDogbnVtYmVyLCBtYXhSZXN1bHRzOiBudW1iZXIpOiBVW107XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBUYXNrSW5mb1F1ZXJ5PFQsIFYgZXh0ZW5kcyBUYXNrSW5mbz4gZXh0ZW5kcyBRdWVyeTxULCBWPiB7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIHRhc2sgaWQgKGluIHByYWN0aWNlLCB0aGVyZSB3aWxsIGJlIG1heGltdW0gb25lIG9mIHRoaXMga2luZClcblx0ICovXG5cdHRhc2tJZCh0YXNrSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYW4gaWQgdGhhdCBpcyBpbiB0aGUgZ2l2ZW4gbGlzdFxuXHQgKlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIFdoZW4gcGFzc2VkIGlkIGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKi9cblx0dGFza0lkcyh0YXNrSWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIG5hbWUgKi9cblx0dGFza05hbWUobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIG5hbWUgdGhhdCBpcyBpbiB0aGUgZ2l2ZW4gbGlzdFxuXHQgKiBcblx0ICogQHRocm93cyBGbG93YWJsZUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICBXaGVuIHBhc3NlZCBuYW1lIGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKi9cblx0dGFza05hbWVJbihuYW1lTGlzdDogc3RyaW5nW10pOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGEgbmFtZSB0aGF0IGlzIGluIHRoZSBnaXZlbiBsaXN0XG5cdCAqIFxuXHQgKiBUaGlzIG1ldGhvZCwgdW5saWtlIHRoZSB7QGxpbmsgI3Rhc2tOYW1lSW4oQ29sbGVjdGlvbil9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlcnMgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZSBxdWVyeSBpcyBleGVjdXRlZC5cblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgV2hlbiBwYXNzZWQgbmFtZSBsaXN0IGlzIGVtcHR5IG9yIDxjb2RlPm51bGw8L2NvZGU+IG9yIGNvbnRhaW5zIDxjb2RlPm51bGwgU3RyaW5nPC9jb2RlPi5cblx0ICovXG5cdHRhc2tOYW1lSW5JZ25vcmVDYXNlKG5hbWVMaXN0OiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBuYW1lIG1hdGNoaW5nIHRoZSBwYXJhbWV0ZXIuIFRoZSBzeW50YXggaXMgdGhhdCBvZiBTUUw6IGZvciBleGFtcGxlIHVzYWdlOiBuYW1lTGlrZSgldGVzdCUpXG5cdCAqL1xuXHR0YXNrTmFtZUxpa2UobmFtZUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBuYW1lIG1hdGNoaW5nIHRoZSBwYXJhbWV0ZXIuIFRoZSBzeW50YXggaXMgdGhhdCBvZiBTUUw6IGZvciBleGFtcGxlIHVzYWdlOiBuYW1lTGlrZSgldGVzdCUpXG5cdCAqIFxuXHQgKiBUaGlzIG1ldGhvZCwgdW5saWtlIHRoZSB7QGxpbmsgI3Rhc2tOYW1lTGlrZShTdHJpbmcpfSBtZXRob2Qgd2lsbCBub3QgdGFrZSBpbiBhY2NvdW50IHRoZSB1cHBlci9sb3dlciBjYXNlOiBib3RoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZSBxdWVyeSBpc1xuXHQgKiBleGVjdXRlZC5cblx0ICovXG5cdHRhc2tOYW1lTGlrZUlnbm9yZUNhc2UobmFtZUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0aW9uLiAqL1xuXHR0YXNrRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBkZXNjcmlwdGlvbiBtYXRjaGluZyB0aGUgcGFyYW1ldGVyIC4gVGhlIHN5bnRheCBpcyB0aGF0IG9mIFNRTDogZm9yIGV4YW1wbGUgdXNhZ2U6IGRlc2NyaXB0aW9uTGlrZSgldGVzdCUpXG5cdCAqL1xuXHR0YXNrRGVzY3JpcHRpb25MaWtlKGRlc2NyaXB0aW9uTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIGRlc2NyaXB0aW9uIG1hdGNoaW5nIHRoZSBwYXJhbWV0ZXIgLiBUaGUgc3ludGF4IGlzIHRoYXQgb2YgU1FMOiBmb3IgZXhhbXBsZSB1c2FnZTogZGVzY3JpcHRpb25MaWtlKCV0ZXN0JSlcblx0ICogXG5cdCAqIFRoaXMgbWV0aG9kLCB1bmxpa2UgdGhlIHtAbGluayAjdGFza0Rlc2NyaXB0aW9uTGlrZShTdHJpbmcpfSBtZXRob2Qgd2lsbCBub3QgdGFrZSBpbiBhY2NvdW50IHRoZSB1cHBlci9sb3dlciBjYXNlOiBib3RoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZSBxdWVyeSBpc1xuXHQgKiBleGVjdXRlZC5cblx0ICovXG5cdHRhc2tEZXNjcmlwdGlvbkxpa2VJZ25vcmVDYXNlKGRlc2NyaXB0aW9uTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2l0aCB0aGUgZ2l2ZW4gcHJpb3JpdHkuICovXG5cdHRhc2tQcmlvcml0eShwcmlvcml0eTogbnVtYmVyKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2l0aCB0aGUgZ2l2ZW4gcHJpb3JpdHkgb3IgaGlnaGVyLiAqL1xuXHR0YXNrTWluUHJpb3JpdHkobWluUHJpb3JpdHk6IG51bWJlcik6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIHByaW9yaXR5IG9yIGxvd2VyLiAqL1xuXHR0YXNrTWF4UHJpb3JpdHkobWF4UHJpb3JpdHk6IG51bWJlcik6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBhc3NpZ25lZCB0byB0aGUgZ2l2ZW4gdXNlci4gKi9cblx0dGFza0Fzc2lnbmVlKGFzc2lnbmVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCB3ZXJlIGxhc3QgYXNzaWduZWQgdG8gYW4gYXNzaWduZWUgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBzeW50YXggdGhhdCBzaG91bGQgYmUgdXNlZCBpcyB0aGUgc2FtZSBhcyBpbiBTUUwsIGVnLiAldGVzdCUuXG5cdCAqL1xuXHR0YXNrQXNzaWduZWVMaWtlKGFzc2lnbmVlTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggd2VyZSBsYXN0IGFzc2lnbmVkIHRvIGFuIGFzc2lnbmVlIGxpa2UgdGhlIGdpdmVuIHZhbHVlLiBUaGUgc3ludGF4IHRoYXQgc2hvdWxkIGJlIHVzZWQgaXMgdGhlIHNhbWUgYXMgaW4gU1FMLCBlZy4gJXRlc3QlLlxuXHQgKiBcblx0ICogVGhpcyBtZXRob2QsIHVubGlrZSB0aGUge0BsaW5rICN0YXNrQXNzaWduZWVMaWtlKFN0cmluZyl9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlciBhcyB0aGUgY29sdW1uIHZhbHVlIGFyZSBsb3dlcmNhc2VkIHdoZW4gdGhlIHF1ZXJ5IGlzXG5cdCAqIGV4ZWN1dGVkLlxuXHQgKi9cblx0dGFza0Fzc2lnbmVlTGlrZUlnbm9yZUNhc2UoYXNzaWduZWVMaWtlSWdub3JlQ2FzZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggZG9uJ3QgaGF2ZSBhbiBhc3NpZ25lZS4gKi9cblx0dGFza1VuYXNzaWduZWQoKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIGFzc2lnbmVkIHRvIGFueSB1c2VyICovXG5cdHRhc2tBc3NpZ25lZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGFuIGFzc2lnbmVlIHRoYXQgaXMgaW4gdGhlIGdpdmVuIGxpc3Rcblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgV2hlbiBwYXNzZWQgbmFtZSBsaXN0IGlzIGVtcHR5IG9yIDxjb2RlPm51bGw8L2NvZGU+IG9yIGNvbnRhaW5zIDxjb2RlPm51bGwgU3RyaW5nPC9jb2RlPi5cblx0ICovXG5cdHRhc2tBc3NpZ25lZUlkcyhhc3NpZ25lZUxpc3RJZHM6IHN0cmluZ1tdKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZSBnaXZlbiB1c2VyIGlzIHRoZSBvd25lci4gKi9cblx0dGFza093bmVyKG93bmVyOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCB3ZXJlIGxhc3QgYXNzaWduZWQgdG8gYW4gb3duZXIgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBzeW50YXggdGhhdCBzaG91bGQgYmUgdXNlZCBpcyB0aGUgc2FtZSBhcyBpbiBTUUwsIGVnLiAldGVzdCUuXG5cdCAqL1xuXHR0YXNrT3duZXJMaWtlKG93bmVyTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggd2VyZSBsYXN0IGFzc2lnbmVkIHRvIGFuIG93bmVyIGxpa2UgdGhlIGdpdmVuIHZhbHVlLiBUaGUgc3ludGF4IHRoYXQgc2hvdWxkIGJlIHVzZWQgaXMgdGhlIHNhbWUgYXMgaW4gU1FMLCBlZy4gJXRlc3QlLlxuXHQgKiBcblx0ICogVGhpcyBtZXRob2QsIHVubGlrZSB0aGUge0BsaW5rICN0YXNrT3duZXJMaWtlKFN0cmluZyl9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlciBhcyB0aGUgY29sdW1uIHZhbHVlIGFyZSBsb3dlcmNhc2VkIHdoZW4gdGhlIHF1ZXJ5IGlzXG5cdCAqIGV4ZWN1dGVkLlxuXHQgKi9cblx0dGFza093bmVyTGlrZUlnbm9yZUNhc2Uob3duZXJMaWtlSWdub3JlQ2FzZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZSBnaXZlbiB1c2VyIGlzIGEgY2FuZGlkYXRlLiAqL1xuXHR0YXNrQ2FuZGlkYXRlVXNlcihjYW5kaWRhdGVVc2VyOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3Igd2hpY2ggdGhlcmUgZXhpc3QgYW4ge0BsaW5rIElkZW50aXR5TGlua30gd2l0aCB0aGUgZ2l2ZW4gdXNlciwgaW5jbHVkaW5nIHRhc2tzIHdoaWNoIGhhdmUgYmVlbiBhc3NpZ25lZCB0byB0aGUgZ2l2ZW4gdXNlciAoYXNzaWduZWUpIG9yIG93bmVkIGJ5IHRoZSBnaXZlbiB1c2VyIChvd25lcikuXG5cdCAqL1xuXHR0YXNrSW52b2x2ZWRVc2VyKGludm9sdmVkVXNlcjogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZXJlIGV4aXN0IGFuIHtAbGluayBJZGVudGl0eUxpbmt9IHdpdGggdGhlIGdpdmVuIEdyb3Vwcy5cblx0ICovXG5cdHRhc2tJbnZvbHZlZEdyb3VwcyhpbnZvbHZlZEdyb3VwOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIEFsbG93cyB0byBzZWxlY3QgYSB0YXNrIHVzaW5nIHtAbGluayAjdGFza0NhbmRpZGF0ZUdyb3VwKFN0cmluZyl9IHtAbGluayAjdGFza0NhbmRpZGF0ZUdyb3VwSW4oQ29sbGVjdGlvbil9IG9yIHtAbGluayAjdGFza0NhbmRpZGF0ZVVzZXIoU3RyaW5nKX0gYnV0IGlnbm9yZSB0aGUgYXNzaWduZWUgdmFsdWUgaW5zdGVhZCBvZiBxdWVyeWluZyBmb3IgYW4gZW1wdHkgYXNzaWduZWUuXG5cdCAqL1xuXHRpZ25vcmVBc3NpZ25lZVZhbHVlKCk6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB3aGljaCB1c2VycyBpbiB0aGUgZ2l2ZW4gZ3JvdXAgYXJlIGNhbmRpZGF0ZXMuICovXG5cdHRhc2tDYW5kaWRhdGVHcm91cChjYW5kaWRhdGVHcm91cDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZSAnY2FuZGlkYXRlR3JvdXAnIGlzIG9uZSBvZiB0aGUgZ2l2ZW4gZ3JvdXBzLlxuXHQgKiBcblx0ICogQHRocm93cyBGbG93YWJsZUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICBXaGVuIHF1ZXJ5IGlzIGV4ZWN1dGVkIGFuZCB7QGxpbmsgI3Rhc2tDYW5kaWRhdGVHcm91cChTdHJpbmcpfSBvciB7QGxpbmsgI3Rhc2tDYW5kaWRhdGVVc2VyKFN0cmluZyl9IGhhcyBiZWVuIGV4ZWN1dGVkIG9uIHRoZSBxdWVyeSBpbnN0YW5jZS4gV2hlbiBwYXNzZWQgZ3JvdXAgbGlzdCBpcyBlbXB0eSBvclxuXHQgKiAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi5cblx0ICovXG5cdHRhc2tDYW5kaWRhdGVHcm91cEluKGNhbmRpZGF0ZUdyb3Vwczogc3RyaW5nW10pOiBUXG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gdGVuYW50IGlkLlxuXHQgKi9cblx0dGFza1RlbmFudElkKHRlbmFudElkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGEgdGVuYW50IGlkIGxpa2UgdGhlIGdpdmVuIG9uZS5cblx0ICovXG5cdHRhc2tUZW5hbnRJZExpa2UodGVuYW50SWRMaWtlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGRvIG5vdCBoYXZlIGEgdGVuYW50IGlkLlxuXHQgKi9cblx0dGFza1dpdGhvdXRUZW5hbnRJZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3IgdGhlIGdpdmVuIHByb2Nlc3MgaW5zdGFuY2UgaWQuXG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VJZChwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGlkcy5cblx0ICovXG5cdHByb2Nlc3NJbnN0YW5jZUlkSW4ocHJvY2Vzc0luc3RhbmNlSWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGhvdXQgYSBwcm9jZXNzIGluc3RhbmNlIGlkLlxuXHQgKi9cblx0d2l0aG91dFByb2Nlc3NJbnN0YW5jZUlkKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gYnVzaW5lc3Mga2V5XG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleShwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIGJ1c2luZXNzIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSBUaGUgc3ludGF4IGlzIHRoYXQgb2YgU1FMOiBmb3IgZXhhbXBsZSB1c2FnZTogcHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NLZXlMaWtlKFwiJXRlc3QlXCIpLlxuXHQgKi9cblx0cHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NLZXlMaWtlKHByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5TGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIGJ1c2luZXNzIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSBUaGUgc3ludGF4IGlzIHRoYXQgb2YgU1FMOiBmb3IgZXhhbXBsZSB1c2FnZTogcHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NLZXlMaWtlKFwiJXRlc3QlXCIpLlxuXHQgKiBcblx0ICogVGhpcyBtZXRob2QsIHVubGlrZSB0aGUge0BsaW5rICNwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleUxpa2UoU3RyaW5nKX0gbWV0aG9kIHdpbGwgbm90IHRha2UgaW4gYWNjb3VudCB0aGUgdXBwZXIvbG93ZXIgY2FzZTogYm90aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGFzIHRoZSBjb2x1bW4gdmFsdWUgYXJlIGxvd2VyY2FzZWQgd2hlblxuXHQgKiB0aGUgcXVlcnkgaXMgZXhlY3V0ZWQuXG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleUxpa2VJZ25vcmVDYXNlKHByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5TGlrZUlnbm9yZUNhc2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gZXhlY3V0aW9uLlxuXHQgKi9cblx0ZXhlY3V0aW9uSWQoZXhlY3V0aW9uSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gY2FzZSBpbnN0YW5jZS5cblx0ICovXG5cdGNhc2VJbnN0YW5jZUlkKGNhc2VJbnN0YW5jZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3IgdGhlIGdpdmVuIGNhc2UgZGVmaW5pdGlvbi5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uSWQoY2FzZURlZmluaXRpb25JZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBjYXNlIGluc3RhbmNlIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gY2FzZSBkZWZpbml0aW9uIGtleS5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uS2V5KGNhc2VEZWZpbml0aW9uS2V5OiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIGNhc2UgaW5zdGFuY2Ugd2hpY2ggaGFzIGEgY2FzZSBkZWZpbml0aW9uIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIHN5bnRheCB0aGF0IHNob3VsZCBiZSB1c2VkIGlzIHRoZSBzYW1lIGFzIGluIFNRTCwgZWcuICV0ZXN0JS5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uS2V5TGlrZShjYXNlRGVmaW5pdGlvbktleUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgY2FzZSBpbnN0YW5jZSB3aGljaCBoYXMgYSBjYXNlIGRlZmluaXRpb24ga2V5IGxpa2UgdGhlIGdpdmVuIHZhbHVlLiBUaGUgc3ludGF4IHRoYXQgc2hvdWxkIGJlIHVzZWQgaXMgdGhlIHNhbWUgYXMgaW4gU1FMLCBlZy4gJXRlc3QlLlxuXHQgKlxuXHQgKiBUaGlzIG1ldGhvZCwgdW5saWtlIHRoZSB7QGxpbmsgI2Nhc2VEZWZpbml0aW9uS2V5TGlrZShTdHJpbmcpfSBtZXRob2Qgd2lsbCBub3QgdGFrZSBpbiBhY2NvdW50IHRoZSB1cHBlci9sb3dlciBjYXNlOiBib3RoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZVxuXHQgKiBxdWVyeSBpcyBleGVjdXRlZC5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uS2V5TGlrZUlnbm9yZUNhc2UoY2FzZURlZmluaXRpb25LZXlMaWtlSWdub3JlQ2FzZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3MgdGhhdCBoYXZlIGEgY2FzZSBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUga2V5IGlzIHByZXNlbnQgaW4gdGhlIGdpdmVuIGxpc3QgKiovXG5cdGNhc2VEZWZpbml0aW9uS2V5SW4oY2FzZURlZmluaXRpb25LZXlzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gcGxhbiBpdGVtIGluc3RhbmNlLiBcblx0ICovXG5cdHBsYW5JdGVtSW5zdGFuY2VJZChwbGFuSXRlbUluc3RhbmNlSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gc2NvcGUgaWRlbnRpZmllci4gXG5cdCAqL1xuXHRzY29wZUlkKHNjb3BlSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gc3ViIHNjb3BlIGlkZW50aWZpZXIuIFxuXHQgKi9cblx0c3ViU2NvcGVJZChzdWJTY29wZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3IgdGhlIGdpdmVuIHNjb3BlIHR5cGUuIFxuXHQgKi9cblx0c2NvcGVUeXBlKHNjb3BlVHlwZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHRoZSBnaXZlbiBzY29wZSBkZWZpbml0aW9uIGlkZW50aWZpZXIuIFxuXHQgKi9cblx0c2NvcGVEZWZpbml0aW9uSWQoc2NvcGVEZWZpbml0aW9uSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gc3RhZ2UsIGRlZmluZWQgdGhyb3VnaCBpdHMgc3RhZ2UgaW5zdGFuY2UgaWQuXG5cdCAqL1xuXHRwcm9wYWdhdGVkU3RhZ2VJbnN0YW5jZUlkKHByb3BhZ2F0ZWRTdGFnZUluc3RhbmNlSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIFNlbGVjdCBhbGwgdGFza3MgZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGluc3RhbmNlIGlkIGFuZCBpdHMgY2hpbGRyZW4uXG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VJZFdpdGhDaGlsZHJlbihwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogU2VsZWN0IGFsbCB0YXNrcyBmb3IgdGhlIGdpdmVuIGNhc2UgaW5zdGFuY2UgaWQgYW5kIGl0cyBjaGlsZHJlbi5cblx0ICovXG5cdGNhc2VJbnN0YW5jZUlkV2l0aENoaWxkcmVuKGNhc2VJbnN0YW5jZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBjcmVhdGVkIG9uIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0NyZWF0ZWRPbihjcmVhdGVUaW1lOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrQ3JlYXRlZEJlZm9yZShiZWZvcmU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBjcmVhdGVkIGFmdGVyIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0NyZWF0ZWRBZnRlcihhZnRlcjogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHRoYXQgYXJlIHN0YXJ0ZWQgaW4gcHJvZ3Jlc3Mgb24gdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrSW5Qcm9ncmVzc1N0YXJ0VGltZU9uKGNsYWltZWRUaW1lOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgc3RhcnRlZCBpbiBwcm9ncmVzcyBiZWZvcmUgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrSW5Qcm9ncmVzc1N0YXJ0VGltZUJlZm9yZShiZWZvcmU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBzdGFydGVkIGluIHByb2dyZXNzIGFmdGVyIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0luUHJvZ3Jlc3NTdGFydFRpbWVBZnRlcihhZnRlcjogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIFNlbGVjdCBhbGwgdGFza3MgdGhhdCBoYXZlIGFuIGluIHByb2dyZXNzIHN0YXJ0ZWQgdXNlciByZWZlcmVuY2UgZm9yIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdHRhc2tJblByb2dyZXNzU3RhcnRlZEJ5KHN0YXJ0ZWRCeTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgY2xhaW1lZCBvbiB0aGUgZ2l2ZW4gZGF0ZS5cblx0ICovXG5cdHRhc2tDbGFpbWVkT24oY2xhaW1lZFRpbWU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBjbGFpbWVkIGJlZm9yZSB0aGUgZ2l2ZW4gZGF0ZS5cblx0ICovXG5cdHRhc2tDbGFpbWVkQmVmb3JlKGJlZm9yZTogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHRoYXQgYXJlIGNsYWltZWQgYWZ0ZXIgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrQ2xhaW1lZEFmdGVyKGFmdGVyOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogU2VsZWN0IGFsbCB0YXNrcyB0aGF0IGhhdmUgYSBjbGFpbWVkIGJ5IHVzZXIgcmVmZXJlbmNlIGZvciB0aGUgZ2l2ZW4gdmFsdWUuXG5cdCAqL1xuXHR0YXNrQ2xhaW1lZEJ5KGNsYWltZWRCeTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgc3VzcGVuZGVkIG9uIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza1N1c3BlbmRlZE9uKHN1c3BlbmRlZFRpbWU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBzdXNwZW5kZWQgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza1N1c3BlbmRlZEJlZm9yZShiZWZvcmU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBzdXNwZW5kZWQgYWZ0ZXIgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrU3VzcGVuZGVkQWZ0ZXIoYWZ0ZXI6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBTZWxlY3QgYWxsIHRhc2tzIHRoYXQgaGF2ZSBhIHN1c3BlbmRlZCBieSB1c2VyIHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIHZhbHVlLlxuXHQgKi9cblx0dGFza1N1c3BlbmRlZEJ5KHN1c3BlbmRlZEJ5OiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiBjYXRlZ29yeS5cblx0ICovXG5cdHRhc2tDYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgYmVsb25naW5nIHRvIG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBpbiB0aGUgZ2l2ZW4gbGlzdC5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tDYXRlZ29yeUluTGlzdFxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFdoZW4gcGFzc2VkIGNhdGVnb3J5IGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbDwvY29kZT4gU3RyaW5nLlxuXHQgKi9cblx0dGFza0NhdGVnb3J5SW4odGFza0NhdGVnb3J5SW5MaXN0OiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBkZWZpbmVkIGNhdGVnb3J5IHdoaWNoIGRvIG5vdCBiZWxvbmcgdG8gYSBjYXRlZ29yeSBwcmVzZW50IGluIHRoZSBnaXZlbiBsaXN0LlxuXHQgKiA8cD5cblx0ICogTk9URTogVGhpcyBtZXRob2QgZG9lcyA8Yj5ub3Q8L2I+IHJldHVybiB0YXNrcyA8Yj53aXRob3V0PC9iPiBjYXRlZ29yeSBlLmcuIHRhc2tzIGhhdmluZyBhIDxjb2RlPm51bGw8L2NvZGU+IGNhdGVnb3J5LlxuXHQgKiBUbyBpbmNsdWRlIDxjb2RlPm51bGw8L2NvZGU+IGNhdGVnb3JpZXMsIHVzZSA8Y29kZT5xdWVyeS5vcigpLnRhc2tDYXRlZ29yeU5vdEluKC4uLikudGFza1dpdGhvdXRDYXRlZ29yeSgpLmVuZE9yKCk8L2NvZGU+XG5cdCAqIDwvcD5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tDYXRlZ29yeU5vdEluTGlzdFxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFdoZW4gcGFzc2VkIGNhdGVnb3J5IGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKiBAc2VlICN0YXNrV2l0aG91dENhdGVnb3J5XG5cdCAqL1xuXHR0YXNrQ2F0ZWdvcnlOb3RJbih0YXNrQ2F0ZWdvcnlOb3RJbkxpc3Q6IHN0cmluZ1tdKTogVDtcblxuXHQvKipcblx0ICogU2VsZWN0cyB0YXNrcyB3aXRob3V0IGNhdGVnb3J5LlxuXHQgKiA8cD5cblx0ICogQ2FuIGFsc28gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG90aGVyIGZpbHRlciBjcml0ZXJpYSB0byBpbmNsdWRlIHRhc2tzIHdpdGhvdXQgY2F0ZWdvcnkgZS5nLiBpbiA8Y29kZT5vcjwvY29kZT4gcXVlcmllcy5cblx0ICogPC9wPlxuXHQgKiBAc2VlICN0YXNrQ2F0ZWdvcnlOb3RJbihDb2xsZWN0aW9uKVxuXHQgKi9cblx0dGFza1dpdGhvdXRDYXRlZ29yeSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGZvcm0ga2V5LlxuXHQgKi9cblx0dGFza1dpdGhGb3JtS2V5KCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIGZvcm1LZXkuXG5cdCAqL1xuXHR0YXNrRm9ybUtleShmb3JtS2V5OiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiB0YXNrRGVmaW5pdGlvbktleS4gVGhlIHRhc2sgZGVmaW5pdGlvbiBrZXkgaXMgdGhlIGlkIG9mIHRoZSB1c2VyVGFzazogJmx0O3VzZXJUYXNrIGlkPVwieHh4XCIgLi4uLyZndDtcblx0ICoqL1xuXHR0YXNrRGVmaW5pdGlvbktleShrZXk6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSB0YXNrRGVmaW5pdGlvbktleSB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXJhbWV0ZXIuIFRoZSBzeW50YXggaXMgdGhhdCBvZiBTUUw6IGZvciBleGFtcGxlIHVzYWdlOiB0YXNrRGVmaW5pdGlvbktleUxpa2UoXCIldGVzdCVcIikuIFRoZSB0YXNrIGRlZmluaXRpb24ga2V5IGlzIHRoZSBpZCBvZlxuXHQgKiB0aGUgdXNlclRhc2s6ICZsdDt1c2VyVGFzayBpZD1cInh4eFwiIC4uLi8mZ3Q7XG5cdCAqKi9cblx0dGFza0RlZmluaXRpb25LZXlMaWtlKGtleUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIHRhc2tEZWZpbml0aW9uS2V5cy4gVGhlIHRhc2sgZGVmaW5pdGlvbiBrZXkgaXMgdGhlIGlkIG9mIHRoZSB1c2VyVGFzazogJmx0O3VzZXJUYXNrIGlkPVwieHh4XCIgLi4uLyZndDtcblx0ICoqL1xuXHR0YXNrRGVmaW5pdGlvbktleXMoa2V5czogc3RyaW5nW10pOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiBzdGF0ZS5cblx0ICoqL1xuXHR0YXNrU3RhdGUoc3RhdGU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIGluIHByb2dyZXNzIHN0YXJ0IGR1ZSBkYXRlLlxuXHQgKi9cblx0dGFza0luUHJvZ3Jlc3NTdGFydER1ZURhdGUoZHVlRGF0ZTogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYW4gaW4gcHJvZ3Jlc3Mgc3RhcnQgZHVlIGRhdGUgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0luUHJvZ3Jlc3NTdGFydER1ZUJlZm9yZShkdWVEYXRlOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhbiBpbiBwcm9ncmVzcyBzdGFydCBkdWUgZGF0ZSBhZnRlciB0aGUgZ2l2ZW4gZGF0ZS5cblx0ICovXG5cdHRhc2tJblByb2dyZXNzU3RhcnREdWVBZnRlcihkdWVEYXRlOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBubyBpbiBwcm9ncmVzcyBzdGFydCBkdWUgZGF0ZS5cblx0ICovXG5cdHdpdGhvdXRUYXNrSW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiBkdWUgZGF0ZS5cblx0ICovXG5cdHRhc2tEdWVEYXRlKGR1ZURhdGU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZHVlIGRhdGUgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0R1ZUJlZm9yZShkdWVEYXRlOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGR1ZSBkYXRlIGFmdGVyIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0R1ZUFmdGVyKGR1ZURhdGU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIG5vIGR1ZSBkYXRlLlxuXHQgKi9cblx0d2l0aG91dFRhc2tEdWVEYXRlKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyBpbnN0YW5jZSB3aGljaCBoYXMgdGhlIGdpdmVuIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkuXG5cdCAqL1xuXHRwcm9jZXNzRGVmaW5pdGlvbktleShwcm9jZXNzRGVmaW5pdGlvbktleTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdoaWNoIGhhcyBhIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBzeW50YXggdGhhdCBzaG91bGQgYmUgdXNlZCBpcyB0aGUgc2FtZSBhcyBpbiBTUUwsIGVnLiAldGVzdCUuXG5cdCAqL1xuXHRwcm9jZXNzRGVmaW5pdGlvbktleUxpa2UocHJvY2Vzc0RlZmluaXRpb25LZXlMaWtlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgaW5zdGFuY2Ugd2hpY2ggaGFzIGEgcHJvY2VzcyBkZWZpbml0aW9uIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIHN5bnRheCB0aGF0IHNob3VsZCBiZSB1c2VkIGlzIHRoZSBzYW1lIGFzIGluIFNRTCwgZWcuICV0ZXN0JS5cblx0ICogXG5cdCAqIFRoaXMgbWV0aG9kLCB1bmxpa2UgdGhlIHtAbGluayAjcHJvY2Vzc0RlZmluaXRpb25LZXlMaWtlKFN0cmluZyl9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlciBhcyB0aGUgY29sdW1uIHZhbHVlIGFyZSBsb3dlcmNhc2VkIHdoZW4gdGhlXG5cdCAqIHF1ZXJ5IGlzIGV4ZWN1dGVkLlxuXHQgKi9cblx0cHJvY2Vzc0RlZmluaXRpb25LZXlMaWtlSWdub3JlQ2FzZShwcm9jZXNzRGVmaW5pdGlvbktleUxpa2VJZ25vcmVDYXNlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGhhdmUgYSBwcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBrZXkgaXMgcHJlc2VudCBpbiB0aGUgZ2l2ZW4gbGlzdCAqKi9cblx0cHJvY2Vzc0RlZmluaXRpb25LZXlJbihwcm9jZXNzRGVmaW5pdGlvbktleXM6IHN0cmluZ1tdKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiB0YXNrIGRlZmluaXRpb24gcmVmZXJlbmNlZCBieSBpZC5cblx0ICovXG5cdHRhc2tEZWZpbml0aW9uSWQodGFza0RlZmluaXRpb25JZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gcHJvY2VzcyBkZWZpbml0aW9uIGlkLlxuXHQgKi9cblx0cHJvY2Vzc0RlZmluaXRpb25JZChwcm9jZXNzRGVmaW5pdGlvbklkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgaW5zdGFuY2Ugd2hpY2ggaGFzIHRoZSBnaXZlbiBwcm9jZXNzIGRlZmluaXRpb24gbmFtZS5cblx0ICovXG5cdHByb2Nlc3NEZWZpbml0aW9uTmFtZShwcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyBpbnN0YW5jZSB3aGljaCBoYXMgYSBwcm9jZXNzIGRlZmluaXRpb24gbmFtZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIHN5bnRheCB0aGF0IHNob3VsZCBiZSB1c2VkIGlzIHRoZSBzYW1lIGFzIGluIFNRTCwgZWcuICV0ZXN0JS5cblx0ICovXG5cdHByb2Nlc3NEZWZpbml0aW9uTmFtZUxpa2UocHJvY2Vzc0RlZmluaXRpb25OYW1lTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdob3NlIGRlZmluaXRpb24gYmVsb25ncyB0byB0aGUgY2F0ZWdvcnkgd2hpY2ggaXMgcHJlc2VudCBpbiB0aGUgZ2l2ZW4gbGlzdC5cblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgV2hlbiBwYXNzZWQgY2F0ZWdvcnkgbGlzdCBpcyBlbXB0eSBvciA8Y29kZT5udWxsPC9jb2RlPiBvciBjb250YWlucyA8Y29kZT5udWxsIFN0cmluZzwvY29kZT4uXG5cdCAqIEBwYXJhbSBwcm9jZXNzQ2F0ZWdvcnlJbkxpc3Rcblx0ICovXG5cdHByb2Nlc3NDYXRlZ29yeUluKHByb2Nlc3NDYXRlZ29yeUluTGlzdDogc3RyaW5nW10pOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgaW5zdGFuY2Ugd2hvc2UgZGVmaW5pdGlvbiBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIGNhdGVnb3J5IHdoaWNoIGlzIHByZXNlbnQgaW4gdGhlIGdpdmVuIGxpc3QuXG5cdCAqIFxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIFdoZW4gcGFzc2VkIGNhdGVnb3J5IGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0NhdGVnb3J5Tm90SW5MaXN0XG5cdCAqL1xuXHRwcm9jZXNzQ2F0ZWdvcnlOb3RJbihwcm9jZXNzQ2F0ZWdvcnlOb3RJbkxpc3Q6IHN0cmluZ1tdKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gZGVwbG95bWVudCBpZC5cblx0ICovXG5cdGRlcGxveW1lbnRJZChkZXBsb3ltZW50SWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyBpbnN0YW5jZSB3aGljaCBoYXMgdGhlIGdpdmVuIGRlcGxveW1lbnQgaWQuXG5cdCAqL1xuXHRkZXBsb3ltZW50SWRJbihkZXBsb3ltZW50SWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSByZWxhdGVkIHRvIGEgY2FzZSBpbnN0YW5jZSBmb3IgdG8gdGhlIGdpdmVuIGRlcGxveW1lbnQgaWQuXG5cdCAqL1xuXHRjbW1uRGVwbG95bWVudElkKGNtbW5EZXBsb3ltZW50SWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSByZWxhdGVkIHRvIGEgY2FzZSBpbnN0YW5jZXMgZm9yIHRoZSBnaXZlbiBkZXBsb3ltZW50IGlkLlxuXHQgKi9cblx0Y21tbkRlcGxveW1lbnRJZEluKGNtbW5EZXBsb3ltZW50SWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGRvbid0IGhhdmUgYSBzY29wZSBpZCBzZXQuXG5cdCAqL1xuXHR3aXRob3V0U2NvcGVJZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdGFzayB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVWYWx1ZUVxdWFscyh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhdCBsZWFzdCBvbmUgbG9jYWwgdGFzayB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlRXF1YWxzKHZhcmlhYmxlVmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCBzdHJpbmcgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqIDxwPlxuXHQgKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIHlvdXIgZGF0YWJhc2UgaGFzIGVuY29kaW5nL2NvbGxhdGlvbiB0aGF0IHN1cHBvcnRzIGNhc2Utc2Vuc2l0aXZlIHF1ZXJpZXMuIEZvciBleGFtcGxlLCB1c2UgXCJjb2xsYXRlIFVURi04XCIgb24gTXlTUUwgYW5kIGZvciBNU1NRTCwgc2VsZWN0IG9uZSBvZiB0aGUgY2FzZS1zZW5zaXRpdmVcblx0ICogQ29sbGF0aW9ucyBhdmFpbGFibGUgKDxhIGhyZWY9XCJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTAodj1zcWwuMTA1KS5hc3B4XCIgPk1TRE4gU2VydmVyIENvbGxhdGlvbiBSZWZlcmVuY2U8L2E+KS5cblx0ICogPC9wPlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlVmFsdWVFcXVhbHNJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB0YXNrIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUsIGJ1dCB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIHRoYW4gdGhlIHBhc3NlZCB2YWx1ZS4gQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlXG5cdCAqIHR5cGUgd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlVmFsdWVOb3RFcXVhbHModmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCBzdHJpbmcgdmFyaWFibGUgd2l0aCBpcyBub3QgdGhlIGdpdmVuIHZhbHVlLCBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKiA8cD5cblx0ICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB5b3VyIGRhdGFiYXNlIGhhcyBlbmNvZGluZy9jb2xsYXRpb24gdGhhdCBzdXBwb3J0cyBjYXNlLXNlbnNpdGl2ZSBxdWVyaWVzLiBGb3IgZXhhbXBsZSwgdXNlIFwiY29sbGF0ZSBVVEYtOFwiIG9uIE15U1FMIGFuZCBmb3IgTVNTUUwsIHNlbGVjdCBvbmUgb2YgdGhlIGNhc2Utc2Vuc2l0aXZlXG5cdCAqIENvbGxhdGlvbnMgYXZhaWxhYmxlICg8YSBocmVmPVwiaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjUwKHY9c3FsLjEwNSkuYXNweFwiID5NU0ROIFNlcnZlciBDb2xsYXRpb24gUmVmZXJlbmNlPC9hPikuXG5cdCAqIDwvcD5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlTm90RXF1YWxzSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdmFyaWFibGUgdmFsdWUgZ3JlYXRlciB0aGFuIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGUgd3JhcHBlcnMpXG5cdCAqIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmVcblx0ICogdHlwZSB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlR3JlYXRlclRoYW5PckVxdWFsKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBsZXNzIHRoYW4gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZSBlbmRlZC5Cb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGUgd3JhcHBlcnMpIGFyZVxuXHQgKiBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVWYWx1ZUxlc3NUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZVxuXHQgKiB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlTGVzc1RoYW5PckVxdWFsKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIFRoaXMgY2FuIGJlIHVzZWQgb24gc3RyaW5nIHZhcmlhYmxlcyBvbmx5LlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuIFRoZSBzdHJpbmcgY2FuIGluY2x1ZGUgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciAnJScgdG8gZXhwcmVzcyBsaWtlLXN0cmF0ZWd5OiBzdGFydHMgd2l0aCAoc3RyaW5nJSksIGVuZHMgd2l0aCAoJXN0cmluZykgb3IgY29udGFpbnMgKCVzdHJpbmclKS5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlTGlrZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdmFyaWFibGUgdmFsdWUgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUgKGNhc2UgaW5zZW5zaXRpdmUpIHdoZW4gdGhleSBlbmRlZC4gVGhpcyBjYW4gYmUgdXNlZCBvbiBzdHJpbmcgdmFyaWFibGVzIG9ubHkuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC4gVGhlIHN0cmluZyBjYW4gaW5jbHVkZSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyICclJyB0byBleHByZXNzIGxpa2Utc3RyYXRlZ3k6IHN0YXJ0cyB3aXRoIChzdHJpbmclKSwgZW5kcyB3aXRoICglc3RyaW5nKSBvciBjb250YWlucyAoJXN0cmluZyUpLlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlVmFsdWVMaWtlSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVFeGlzdHMobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIGxvY2FsIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlTm90RXhpc3RzKG5hbWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyB0aGF0IGhhcyBhIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUgc2V0IHRvIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlRXF1YWxzKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YXJpYWJsZVZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgdGhhdCBoYXMgYXQgbGVhc3Qgb25lIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIHZhbHVlLlxuXHQgKi9cblx0cHJvY2Vzc1ZhcmlhYmxlVmFsdWVFcXVhbHModmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIHRoYXQgaGFzIGEgbG9jYWwgc3RyaW5nIHZhcmlhYmxlIHdoaWNoIGlzIG5vdCB0aGUgZ2l2ZW4gdmFsdWUsIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqIDxwPlxuXHQgKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIHlvdXIgZGF0YWJhc2UgaGFzIGVuY29kaW5nL2NvbGxhdGlvbiB0aGF0IHN1cHBvcnRzIGNhc2Utc2Vuc2l0aXZlIHF1ZXJpZXMuIEZvciBleGFtcGxlLCB1c2UgXCJjb2xsYXRlIFVURi04XCIgb24gTXlTUUwgYW5kIGZvciBNU1NRTCwgc2VsZWN0IG9uZSBvZiB0aGUgY2FzZS1zZW5zaXRpdmVcblx0ICogQ29sbGF0aW9ucyBhdmFpbGFibGUgKDxhIGhyZWY9XCJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTAodj1zcWwuMTA1KS5hc3B4XCIgPk1TRE4gU2VydmVyIENvbGxhdGlvbiBSZWZlcmVuY2U8L2E+KS5cblx0ICogPC9wPlxuXHQgKi9cblx0cHJvY2Vzc1ZhcmlhYmxlVmFsdWVFcXVhbHNJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBidXQgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSB0aGFuIHRoZSBwYXNzZWQgdmFsdWUuIEJ5dGUtYXJyYXlzIGFuZCB7QGxpbmsgU2VyaWFsaXphYmxlfSBvYmplY3RzICh3aGljaCBhcmUgbm90IHByaW1pdGl2ZSB0eXBlXG5cdCAqIHdyYXBwZXJzKSBhcmUgbm90IHN1cHBvcnRlZC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlTm90RXF1YWxzKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YXJpYWJsZVZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgdGhhdCBoYXMgYSBzdHJpbmcgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqIDxwPlxuXHQgKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIHlvdXIgZGF0YWJhc2UgaGFzIGVuY29kaW5nL2NvbGxhdGlvbiB0aGF0IHN1cHBvcnRzIGNhc2Utc2Vuc2l0aXZlIHF1ZXJpZXMuIEZvciBleGFtcGxlLCB1c2UgXCJjb2xsYXRlIFVURi04XCIgb24gTXlTUUwgYW5kIGZvciBNU1NRTCwgc2VsZWN0IG9uZSBvZiB0aGUgY2FzZS1zZW5zaXRpdmVcblx0ICogQ29sbGF0aW9ucyBhdmFpbGFibGUgKDxhIGhyZWY9XCJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTAodj1zcWwuMTA1KS5hc3B4XCIgPk1TRE4gU2VydmVyIENvbGxhdGlvbiBSZWZlcmVuY2U8L2E+KS5cblx0ICogPC9wPlxuXHQgKi9cblx0cHJvY2Vzc1ZhcmlhYmxlVmFsdWVOb3RFcXVhbHNJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgZ3JlYXRlciB0aGFuIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGVcblx0ICogd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlXG5cdCAqIHR5cGUgd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuT3JFcXVhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHZhbHVlIGxlc3MgdGhhbiB0aGUgcGFzc2VkIHZhbHVlIHdoZW4gdGhlIGVuZGVkLkJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZSB3cmFwcGVycykgYXJlXG5cdCAqIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlTGVzc1RoYW4obmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZVxuXHQgKiB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlTGVzc1RoYW5PckVxdWFsKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBUaGlzIGNhbiBiZSB1c2VkIG9uIHN0cmluZyB2YXJpYWJsZXMgb25seS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLiBUaGUgc3RyaW5nIGNhbiBpbmNsdWRlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgJyUnIHRvIGV4cHJlc3MgbGlrZS1zdHJhdGVneTogc3RhcnRzIHdpdGggKHN0cmluZyUpLCBlbmRzIHdpdGggKCVzdHJpbmcpIG9yIGNvbnRhaW5zICglc3RyaW5nJSkuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUxpa2UobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSAoY2FzZSBpbnNlbnNpdGl2ZSkgd2hlbiB0aGV5IGVuZGVkLiBUaGlzIGNhbiBiZSB1c2VkIG9uIHN0cmluZyB2YXJpYWJsZXMgb25seS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLiBUaGUgc3RyaW5nIGNhbiBpbmNsdWRlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgJyUnIHRvIGV4cHJlc3MgbGlrZS1zdHJhdGVneTogc3RhcnRzIHdpdGggKHN0cmluZyUpLCBlbmRzIHdpdGggKCVzdHJpbmcpIG9yIGNvbnRhaW5zICglc3RyaW5nJSkuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUxpa2VJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVFeGlzdHMobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZU5vdEV4aXN0cyhuYW1lOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIGNhc2UgdGhhdCBoYXMgYSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUVxdWFscyh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBjYXNlIHRoYXQgaGFzIGF0IGxlYXN0IG9uZSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlRXF1YWxzKHZhcmlhYmxlVmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgY2FzZSB0aGF0IGhhcyBhIGxvY2FsIHN0cmluZyB2YXJpYWJsZSB3aGljaCBpcyBub3QgdGhlIGdpdmVuIHZhbHVlLCBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKiA8cD5cblx0ICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB5b3VyIGRhdGFiYXNlIGhhcyBlbmNvZGluZy9jb2xsYXRpb24gdGhhdCBzdXBwb3J0cyBjYXNlLXNlbnNpdGl2ZSBxdWVyaWVzLiBGb3IgZXhhbXBsZSwgdXNlIFwiY29sbGF0ZSBVVEYtOFwiIG9uIE15U1FMIGFuZCBmb3IgTVNTUUwsIHNlbGVjdCBvbmUgb2YgdGhlIGNhc2Utc2Vuc2l0aXZlXG5cdCAqIENvbGxhdGlvbnMgYXZhaWxhYmxlICg8YSBocmVmPVwiaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjUwKHY9c3FsLjEwNSkuYXNweFwiID5NU0ROIFNlcnZlciBDb2xsYXRpb24gUmVmZXJlbmNlPC9hPikuXG5cdCAqIDwvcD5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlRXF1YWxzSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgYnV0IHdpdGggYSBkaWZmZXJlbnQgdmFsdWUgdGhhbiB0aGUgcGFzc2VkIHZhbHVlLiBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZVxuXHQgKiB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZU5vdEVxdWFscyh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBjYXNlIHRoYXQgaGFzIGEgc3RyaW5nIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIHZhbHVlLCBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKiA8cD5cblx0ICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB5b3VyIGRhdGFiYXNlIGhhcyBlbmNvZGluZy9jb2xsYXRpb24gdGhhdCBzdXBwb3J0cyBjYXNlLXNlbnNpdGl2ZSBxdWVyaWVzLiBGb3IgZXhhbXBsZSwgdXNlIFwiY29sbGF0ZSBVVEYtOFwiIG9uIE15U1FMIGFuZCBmb3IgTVNTUUwsIHNlbGVjdCBvbmUgb2YgdGhlIGNhc2Utc2Vuc2l0aXZlXG5cdCAqIENvbGxhdGlvbnMgYXZhaWxhYmxlICg8YSBocmVmPVwiaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjUwKHY9c3FsLjEwNSkuYXNweFwiID5NU0ROIFNlcnZlciBDb2xsYXRpb24gUmVmZXJlbmNlPC9hPikuXG5cdCAqIDwvcD5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlTm90RXF1YWxzSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHZhbHVlIGdyZWF0ZXIgdGhhbiB0aGUgcGFzc2VkIHZhbHVlIHdoZW4gdGhleSBlbmRlZC4gQm9vbGVhbnMsIEJ5dGUtYXJyYXlzIGFuZCB7QGxpbmsgU2VyaWFsaXphYmxlfSBvYmplY3RzICh3aGljaCBhcmUgbm90IHByaW1pdGl2ZSB0eXBlXG5cdCAqIHdyYXBwZXJzKSBhcmUgbm90IHN1cHBvcnRlZC5cblx0ICpcblx0ICogQHBhcmFtIG5hbWUgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZSBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlR3JlYXRlclRoYW4obmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmVcblx0ICogdHlwZSB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBuYW1lIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWUgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuT3JFcXVhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHZhbHVlIGxlc3MgdGhhbiB0aGUgcGFzc2VkIHZhbHVlIHdoZW4gdGhlIGVuZGVkLkJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZSB3cmFwcGVycykgYXJlXG5cdCAqIG5vdCBzdXBwb3J0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBuYW1lIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWUgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUxlc3NUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGVcblx0ICogd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gbmFtZSBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlIGNhbm5vdCBiZSBudWxsLlxuXHQgKi9cblx0Y2FzZVZhcmlhYmxlVmFsdWVMZXNzVGhhbk9yRXF1YWwobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIFRoaXMgY2FuIGJlIHVzZWQgb24gc3RyaW5nIHZhcmlhYmxlcyBvbmx5LlxuXHQgKlxuXHQgKiBAcGFyYW0gbmFtZSBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlIGNhbm5vdCBiZSBudWxsLiBUaGUgc3RyaW5nIGNhbiBpbmNsdWRlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgJyUnIHRvIGV4cHJlc3MgbGlrZS1zdHJhdGVneTogc3RhcnRzIHdpdGggKHN0cmluZyUpLCBlbmRzIHdpdGggKCVzdHJpbmcpIG9yIGNvbnRhaW5zICglc3RyaW5nJSkuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUxpa2UobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSAoY2FzZSBpbnNlbnNpdGl2ZSkgd2hlbiB0aGV5IGVuZGVkLiBUaGlzIGNhbiBiZSB1c2VkIG9uIHN0cmluZyB2YXJpYWJsZXMgb25seS5cblx0ICpcblx0ICogQHBhcmFtIG5hbWUgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZSBjYW5ub3QgYmUgbnVsbC4gVGhlIHN0cmluZyBjYW4gaW5jbHVkZSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyICclJyB0byBleHByZXNzIGxpa2Utc3RyYXRlZ3k6IHN0YXJ0cyB3aXRoIChzdHJpbmclKSwgZW5kcyB3aXRoICglc3RyaW5nKSBvciBjb250YWlucyAoJXN0cmluZyUpLlxuXHQgKi9cblx0Y2FzZVZhcmlhYmxlVmFsdWVMaWtlSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSBuYW1lIGNhbm5vdCBiZSBudWxsLlxuXHQgKi9cblx0Y2FzZVZhcmlhYmxlRXhpc3RzKG5hbWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGRvZXMgbm90IGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICpcblx0ICogQHBhcmFtIG5hbWUgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVOb3RFeGlzdHMobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3RzIHRhc2tzIHdoaWNoIHdpdGggdGhlIGdpdmVuIHJvb3Qgc2NvcGUgaWRcblx0ICovXG5cdHRhc2tSb290U2NvcGVJZChwYXJlbnRTY29wZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdHMgdGFza3Mgd2hpY2ggd2l0aCB0aGUgZ2l2ZW4gcGFyZW50IHNjb3BlIGlkXG5cdCAqL1xuXHR0YXNrUGFyZW50U2NvcGVJZChwYXJlbnRTY29wZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBJbmNsdWRlIGxvY2FsIHRhc2sgdmFyaWFibGVzIGluIHRoZSB0YXNrIHF1ZXJ5IHJlc3VsdFxuXHQgKi9cblx0aW5jbHVkZVRhc2tMb2NhbFZhcmlhYmxlcygpOiBUO1xuXG5cdC8qKlxuXHQgKiBJbmNsdWRlIGdsb2JhbCBwcm9jZXNzIHZhcmlhYmxlcyBpbiB0aGUgdGFzayBxdWVyeSByZXN1bHRcblx0ICovXG5cdGluY2x1ZGVQcm9jZXNzVmFyaWFibGVzKCk6IFQ7XG5cblx0LyoqXG5cdCAqIEluY2x1ZGUgZ2xvYmFsIGNhc2UgdmFyaWFibGVzIGluIHRoZSB0YXNrIHF1ZXJ5IHJlc3VsdFxuXHQgKi9cblx0aW5jbHVkZUNhc2VWYXJpYWJsZXMoKTogVDtcblxuXHQvKipcblx0ICogSW5jbHVkZSBpZGVudGl0eSBsaW5rcyBpbiB0aGUgdGFzayBxdWVyeSByZXN1bHRcblx0ICovXG5cdGluY2x1ZGVJZGVudGl0eUxpbmtzKCk6IFQ7XG5cblx0LyoqXG5cdCAqIExvY2FsaXplIHRhc2sgbmFtZSBhbmQgZGVzY3JpcHRpb24gdG8gc3BlY2lmaWVkIGxvY2FsZS5cblx0ICovXG5cdGxvY2FsZShsb2NhbGU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIEluc3RydWN0IGxvY2FsaXphdGlvbiB0byBmYWxsYmFjayB0byBtb3JlIGdlbmVyYWwgbG9jYWxlcyBpbmNsdWRpbmcgdGhlIGRlZmF1bHQgbG9jYWxlIG9mIHRoZSBKVk0gaWYgdGhlIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLlxuXHQgKi9cblx0d2l0aExvY2FsaXphdGlvbkZhbGxiYWNrKCk6IFQ7XG5cblx0LyoqXG5cdCAqIEFsbCBxdWVyeSBjbGF1c2VzIGNhbGxlZCB3aWxsIGJlIGFkZGVkIHRvIGEgc2luZ2xlIG9yLXN0YXRlbWVudC4gVGhpcyBvci1zdGF0ZW1lbnQgd2lsbCBiZSBpbmNsdWRlZCB3aXRoIHRoZSBvdGhlciBhbHJlYWR5IGV4aXN0aW5nIGNsYXVzZXMgaW4gdGhlIHF1ZXJ5LCBqb2luZWQgYnkgYW4gJ2FuZCcuXG5cdCAqIDxwPlxuXHQgKiBDYWxsaW5nIGVuZE9yKCkgd2lsbCBhZGQgYWxsIGNsYXVzZXMgdG8gdGhlIHJlZ3VsYXIgcXVlcnkgYWdhaW4uIENhbGxpbmcgb3IoKSBhZnRlciBvcigpIGhhcyBiZWVuIGNhbGxlZCBvciBjYWxsaW5nIGVuZE9yKCkgYWZ0ZXIgZW5kT3IoKSBoYXMgYmVlbiBjYWxsZWQgd2lsbCByZXN1bHQgaW4gYW4gZXhjZXB0aW9uLlxuXHQgKiBJdCBpcyBwb3NzaWJsZSB0byBjYWxsIG9yKCkgZW5kT3IoKSBzZXZlcmFsIHRpbWVzIGlmIGVhY2ggb3IoKSBoYXMgYSBtYXRjaGluZyBlbmRPcigpLCBlLmcuOlxuXHQgKiA8L3A+XG5cdCAqIHtAY29kZSBxdWVyeS48Q29uZGl0aW9uQT59XG5cdCAqIHtAY29kZSAgLm9yKCkuPGNvbmRpdGlvbkI+Ljxjb25kaXRpb25DPi5lbmRPcigpfVxuXHQgKiB7QGNvZGUgIC48Y29uZGl0aW9uRD4uPGNvbmRpdGlvbkU+fVxuXHQgKiB7QGNvZGUgIC5vcigpLjxjb25kaXRpb25GPi48Y29uZGl0aW9uRz4uZW5kT3IoKX1cblx0ICogPHA+XG5cdCAqIHdpbGwgcmVzdWx0IGluOiBjb25kaXRpb25BICZhbXA7IChjb25kaXRpb25CIHwgY29uZGl0aW9uQykgJmFtcDsgY29uZGl0aW9uRCAmYW1wOyBjb25kaXRpb25FICZhbXA7IChjb25kaXRpb25GIHwgY29uZGl0aW9uRylcblx0ICovXG5cdG9yKCk6IFQ7XG5cblx0ZW5kT3IoKTogVDtcblxuXHQvLyBPUkRFUklOR1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSB0YXNrIGlkIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRhc2tJZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSB0YXNrIG5hbWUgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza05hbWUoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgZGVzY3JpcHRpb24gKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza0Rlc2NyaXB0aW9uKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IHByaW9yaXR5IChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRhc2tQcmlvcml0eSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSBhc3NpZ25lZSAobmVlZHMgdG8gYmUgZm9sbG93ZWQgYnkge0BsaW5rICNhc2MoKX0gb3Ige0BsaW5rICNkZXNjKCl9KS5cblx0ICovXG5cdG9yZGVyQnlUYXNrQXNzaWduZWUoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgdGhlIHRpbWUgb24gd2hpY2ggdGhlIHRhc2tzIHdlcmUgY3JlYXRlZCAobmVlZHMgdG8gYmUgZm9sbG93ZWQgYnkge0BsaW5rICNhc2MoKX0gb3Ige0BsaW5rICNkZXNjKCl9KS5cblx0ICovXG5cdG9yZGVyQnlUYXNrQ3JlYXRlVGltZSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSBwcm9jZXNzIGluc3RhbmNlIGlkIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVByb2Nlc3NJbnN0YW5jZUlkKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IGV4ZWN1dGlvbiBpZCAobmVlZHMgdG8gYmUgZm9sbG93ZWQgYnkge0BsaW5rICNhc2MoKX0gb3Ige0BsaW5rICNkZXNjKCl9KS5cblx0ICovXG5cdG9yZGVyQnlFeGVjdXRpb25JZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSBwcm9jZXNzIGRlZmluaXRpb24gaWQgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5UHJvY2Vzc0RlZmluaXRpb25JZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSB0YXNrIGR1ZSBkYXRlIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRhc2tEdWVEYXRlKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IHRhc2sgb3duZXIgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza093bmVyKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IHRhc2sgZGVmaW5pdGlvbiBrZXkgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza0RlZmluaXRpb25LZXkoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgdGVuYW50IGlkIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRlbmFudElkKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IGR1ZSBkYXRlIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLiBJZiBhbnkgb2YgdGhlIHRhc2tzIGhhdmUgbnVsbCBmb3IgdGhlIGR1ZSBkYXRlLCB0aGVzZSB3aWxsIGJlIGZpcnN0IGluIHRoZSByZXN1bHQuXG5cdCAqL1xuXHRvcmRlckJ5RHVlRGF0ZU51bGxzRmlyc3QoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgZHVlIGRhdGUgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuIElmIGFueSBvZiB0aGUgdGFza3MgaGF2ZSBudWxsIGZvciB0aGUgZHVlIGRhdGUsIHRoZXNlIHdpbGwgYmUgbGFzdCBpbiB0aGUgcmVzdWx0LlxuXHQgKi9cblx0b3JkZXJCeUR1ZURhdGVOdWxsc0xhc3QoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgY2F0ZWdvcnkgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5Q2F0ZWdvcnkoKTogVDtcblxufVxuXG4vLyBAdHMtaWdub3JlXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0Ly8gQHRzLWlnbm9yZVxuXHRtb2R1bGUuZXhwb3J0cyA9IFRhc2tzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUyxlQUFlO0FBQ3hCLFNBQVMsY0FBYztBQUV2QixNQUFNLFlBQVksS0FBSyxL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LEtBQUsscUJBQXFCO0FBQUEsRUFDdkM7QUFBQSxFQUVPLHlCQUE2QztBQUNuRCxXQUFPLEtBQUssS0FBSyx1QkFBdUI7QUFBQSxFQUN6QztBQUFBLEVBRU8sYUFBaUM7QUFDdkMsV0FBTyxLQUFLLEtBQUssV0FBVztBQUFBLEVBQzdCO0FBQUEsRUFFTyxnQkFBb0M7QUFDMUMsV0FBTyxLQUFLLEtBQUssY0FBYztBQUFBLEVBQ2hDO0FBQUEsRUFFTyxlQUFtQztBQUN6QyxXQUFPLEtBQUssS0FBSyxhQUFhO0FBQUEsRUFDL0I7QUFBQSxFQUVPLHVCQUEyQztBQUNqRCxXQUFPLEtBQUssS0FBSyxxQkFBcUI7QUFBQSxFQUN2QztBQUFBLEVBRU8sdUJBQTJDO0FBQ2pELFdBQU8sS0FBSyxLQUFLLHFCQUFxQjtBQUFBLEVBQ3ZDO0FBQUEsRUFFTyxhQUFpQztBQUN2QyxXQUFPLEtBQUssS0FBSyxXQUFXO0FBQUEsRUFDN0I7QUFBQSxFQUVPLFlBQXFCO0FBQzNCLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFDbEI7QUFBQSxFQUVPLGFBQXNCO0FBQzVCLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFDbEI7QUFBQSxFQUVPLGlCQUEwQjtBQUNoQyxXQUFPLEtBQUssS0FBSztBQUFBLEVBQ2xCO0FBQUEsRUFFTyxtQkFBMkI7QUFDakMsV0FBTyxLQUFLLEtBQUs7QUFBQSxFQUNsQjtBQUFBLEVBRU8sdUJBQStCO0FBQ3JDLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFDbEI7QUFBQSxFQUVPLGVBQWlDO0FBQ3ZDLFdBQU8sS0FBSyxLQUFLLGFBQWE7QUFBQSxFQUMvQjtBQUFBLEVBRU8sY0FBc0I7QUFDNUIsV0FBTyxLQUFLLEtBQUs7QUFBQSxFQUNsQjtBQUFBLEVBRU8sZUFBbUM7QUFDekMsV0FBTyxLQUFLLEtBQUssYUFBYTtBQUFBLEVBQy9CO0FBQUEsRUFFTyxvQkFBd0M7QUFDOUMsV0FBTyxLQUFLLEtBQUssa0JBQWtCO0FBQUEsRUFDcEM7QUFBQSxFQUVPLGlCQUEwQjtBQUNoQyxXQUFPLEtBQUssS0FBSztBQUFBLEVBQ2xCO0FBQ0Q7QUFvUU8sSUFBSyxrQkFBTCxrQkFBS0EscUJBQUw7QUFNTixFQUFBQSxrQ0FBQTtBQUtBLEVBQUFBLGtDQUFBO0FBWFcsU0FBQUE7QUFBQSxHQUFBO0FBaWRMLElBQUssc0JBQUwsa0JBQUtDLHlCQUFMO0FBQ04sRUFBQUEsMENBQUE7QUFBYSxFQUFBQSwwQ0FBQTtBQURGLFNBQUFBO0FBQUEsR0FBQTtBQWtpQ1osSUFBSSxPQUFPLFdBQVcsYUFBYTtBQUVsQyxTQUFPLFVBQVU7QUFDbEI7IiwKICAibmFtZXMiOiBbIkRlbGVnYXRpb25TdGF0ZSIsICJOdWxsSGFuZGxpbmdPbk9yZGVyIl0KfQo=
|
|
956
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS90YXNrcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAbW9kdWxlIGJwbS90YXNrc1xuICogQHBhY2thZ2UgQGFlcm9raXQvc2RrL2JwbVxuICogQG5hbWUgVGFza3NcbiAqIEBvdmVydmlld1xuICogXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbmFsaXRpZXMgZm9yIG1hbmFnaW5nIFVzZXIgVGFza3Mgd2l0aGluIGEgQnVzaW5lc3MgUHJvY2VzcyBNb2RlbCBhbmQgTm90YXRpb24gKEJQTU4pIGNvbnRleHQuIEl0IGFsbG93cyB1c2VycyB0byBsaXN0IHRhc2tzLCBtYW5hZ2UgdGFzayB2YXJpYWJsZXMsIGNvbXBsZXRlIHRhc2tzLCBhbmQgYWNjZXNzIHRhc2stcmVsYXRlZCBzZXJ2aWNlcy5cbiAqIFxuICogIyMjIEtleSBGZWF0dXJlc1xuICogLSBMaXN0IGFsbCB1c2VyIHRhc2tzIGluIHRoZSBzeXN0ZW1cbiAqIC0gR2V0IGFuZCBzZXQgdGFzayB2YXJpYWJsZXMsIGJvdGggZ2xvYmFsbHkgYW5kIGxvY2FsbHkgdG8gdGhlIHRhc2tcbiAqIC0gQ29tcGxldGUgdGFza3Mgd2l0aCBvcHRpb25hbCB2YXJpYWJsZXMgYW5kIHVzZXIgaW5mb3JtYXRpb25cbiAqIC0gQWNjZXNzIHRoZSBUYXNrIFNlcnZpY2UgZm9yIGFkdmFuY2VkIHRhc2sgbWFuYWdlbWVudCBvcGVyYXRpb25zXG4gKiBcbiAqICMjIyBVc2UgQ2FzZXNcbiAqIC0gTWFuYWdpbmcgdXNlciB0YXNrcyBpbiBhIHdvcmtmbG93IGVuZ2luZVxuICogLSBBdXRvbWF0aW5nIHRhc2sgY29tcGxldGlvbiBhbmQgdmFyaWFibGUgbWFuYWdlbWVudCBpbiBkZXZlbG9wbWVudCBhbmQgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHNcbiAqIC0gSW50ZWdyYXRpbmcgdGFzayBtYW5hZ2VtZW50IGludG8gbGFyZ2VyIGFwcGxpY2F0aW9uIHdvcmtmbG93cyBvciBhZG1pbmlzdHJhdGl2ZSB0b29sc1xuICogXG4gKiAjIyMgRXhhbXBsZSBVc2FnZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IFRhc2tzIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9icG1cIjtcbiAqIC8vIExpc3QgYWxsIHRhc2tzXG4gKiBjb25zdCB0YXNrcyA9IFRhc2tzLmxpc3QoKTtcbiAqIGNvbnNvbGUubG9nKHRhc2tzKTtcbiAqIC8vIEdldCBhIHRhc2sgdmFyaWFibGVcbiAqIGNvbnN0IHZhcmlhYmxlVmFsdWUgPSBUYXNrcy5nZXRWYXJpYWJsZShcInRhc2tJZFwiLCBcInZhcmlhYmxlTmFtZVwiKTtcbiAqIGNvbnNvbGUubG9nKHZhcmlhYmxlVmFsdWUpO1xuICogLy8gU2V0IGEgdGFzayB2YXJpYWJsZVxuICogVGFza3Muc2V0VmFyaWFibGUoXCJ0YXNrSWRcIiwgXCJ2YXJpYWJsZU5hbWVcIiwgXCJuZXdWYWx1ZVwiKTtcbiAqIC8vIENvbXBsZXRlIGEgdGFzayB3aXRoIHZhcmlhYmxlc1xuICogVGFza3MuY29tcGxldGUoXCJ0YXNrSWRcIiwgeyBcInJlc3VsdFwiOiBcImFwcHJvdmVkXCIgfSk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBTdHJlYW1zIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9pb1wiO1xuaW1wb3J0IHsgVmFsdWVzIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9icG0vdmFsdWVzXCI7XG5cbmNvbnN0IEJwbUZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5icG0uQnBtRmFjYWRlXCIpO1xuXG5leHBvcnQgY2xhc3MgVGFza3Mge1xuXG5cdHB1YmxpYyBzdGF0aWMgbGlzdCgpOiBUYXNrRGF0YVtdIHtcblx0XHRjb25zdCB0YXNrczogYW55W10gPSBKU09OLnBhcnNlKEJwbUZhY2FkZS5nZXRUYXNrcygpKTtcblx0XHRyZXR1cm4gdGFza3MubWFwKGUgPT4gbmV3IFRhc2tEYXRhKGUpKTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgZ2V0VmFyaWFibGUodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gVmFsdWVzLnBhcnNlVmFsdWUoQnBtRmFjYWRlLmdldFRhc2tWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWxsIHZhcmlhYmxlcy4gVGhpcyB3aWxsIGluY2x1ZGUgYWxsIHZhcmlhYmxlcyBvZiBwYXJlbnQgc2NvcGVzIHRvby5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0VmFyaWFibGVzKHRhc2tJZDogc3RyaW5nKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcChCcG1GYWNhZGUuZ2V0VGFza1ZhcmlhYmxlcyh0YXNrSWQpKTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgc2V0VmFyaWFibGUodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFRhc2tWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIHNldFZhcmlhYmxlcyh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFRhc2tWYXJpYWJsZXModGFza0lkLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWVzTWFwKHZhcmlhYmxlcykpO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBjb21wbGV0ZSh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30pOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUuY29tcGxldGVUYXNrKHRhc2tJZCwgSlNPTi5zdHJpbmdpZnkodmFyaWFibGVzKSk7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGdldFRhc2tTZXJ2aWNlKCk6IFRhc2tTZXJ2aWNlIHtcblx0XHRyZXR1cm4gbmV3IFRhc2tTZXJ2aWNlKEJwbUZhY2FkZS5nZXRCcG1Qcm92aWRlckZsb3dhYmxlKCkuZ2V0VGFza1NlcnZpY2UoKSk7XG5cdH1cbn1cblxuLyoqXG4gKiBTZXJ2aWNlIHdoaWNoIHByb3ZpZGVzIGFjY2VzcyB0byB7QGxpbmsgVGFza30gYW5kIGZvcm0gcmVsYXRlZCBvcGVyYXRpb25zLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tTZXJ2aWNlIHtcblxuXHRwcml2YXRlIHJlYWRvbmx5IHRhc2tTZXJ2aWNlOiBhbnk7XG5cblx0Y29uc3RydWN0b3IodGFza1NlcnZpY2U6IGFueSkge1xuXHRcdHRoaXMudGFza1NlcnZpY2UgPSB0YXNrU2VydmljZTtcblx0fVxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyB0YXNrIHRoYXQgaXMgbm90IHJlbGF0ZWQgdG8gYW55IHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIFxuXHQgKiBUaGUgcmV0dXJuZWQgdGFzayBpcyB0cmFuc2llbnQgYW5kIG11c3QgYmUgc2F2ZWQgd2l0aCB7QGxpbmsgI3NhdmVUYXNrKFRhc2spfSAnbWFudWFsbHknLlxuXHQgKi9cblx0cHVibGljIG5ld1Rhc2sodGFza0lkPzogc3RyaW5nKTogVGFzayB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHRhc2tJZCkpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLm5ld1Rhc2sodGFza0lkKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UubmV3VGFzaygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIGJ1aWxkZXIgZm9yIHRoZSB0YXNrXG5cdCAqIFxuXHQgKiBAcmV0dXJuIHRhc2sgYnVpbGRlclxuXHQgKi9cblx0cHVibGljIGNyZWF0ZVRhc2tCdWlsZGVyKCk6IFRhc2tCdWlsZGVyIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5jcmVhdGVUYXNrQnVpbGRlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSBnaXZlbiB0YXNrIHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgc3RvcmUuIElmIHRoZSB0YXNrIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcGVyc2lzdGVudCBzdG9yZSwgaXQgaXMgdXBkYXRlZC4gQWZ0ZXIgYSBuZXcgdGFzayBoYXMgYmVlbiBzYXZlZCwgdGhlIHRhc2sgaW5zdGFuY2UgcGFzc2VkIGludG8gdGhpc1xuXHQgKiBtZXRob2QgaXMgdXBkYXRlZCB3aXRoIHRoZSBpZCBvZiB0aGUgbmV3bHkgY3JlYXRlZCB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tcblx0ICogICAgICAgICAgICB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwdWJsaWMgc2F2ZVRhc2sodGFzazogVGFzayk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc2F2ZVRhc2sodGFzayk7XG5cdH1cblxuXHQvKipcblx0ICogU2F2ZXMgdGhlIGdpdmVuIHRhc2tzIHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgc3RvcmUuIElmIHRoZSB0YXNrcyBhcmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBwZXJzaXN0ZW50IHN0b3JlLCBpdCBpcyB1cGRhdGVkLiBBZnRlciBhIG5ldyB0YXNrIGhhcyBiZWVuIHNhdmVkLCB0aGUgdGFzayBpbnN0YW5jZSBwYXNzZWQgaW50byB0aGlzXG5cdCAqIG1ldGhvZCBpcyB1cGRhdGVkIHdpdGggdGhlIGlkIG9mIHRoZSBuZXdseSBjcmVhdGVkIHRhc2suXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrTGlzdCB0aGUgbGlzdCBvZiB0YXNrIGluc3RhbmNlcywgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwdWJsaWMgYnVsa1NhdmVUYXNrcyh0YXNrTGlzdDogVGFza1tdKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5idWxrU2F2ZVRhc2tzKHRhc2tMaXN0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBnaXZlbiB0YXNrLCBub3QgZGVsZXRpbmcgaGlzdG9yaWMgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxhdGVkIHRvIHRoaXMgdGFzay5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHRhc2sgdGhhdCB3aWxsIGJlIGRlbGV0ZWQsIGNhbm5vdCBiZSBudWxsLiBJZiBubyB0YXNrIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiB0YXNrSWQsIHRoZSBvcGVyYXRpb24gaXMgaWdub3JlZC5cblx0ICogQHBhcmFtIGNhc2NhZGVcblx0ICogICAgICAgICAgICBJZiBjYXNjYWRlIGlzIHRydWUsIGFsc28gdGhlIGhpc3RvcmljIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhpcyB0YXNrIGlzIGRlbGV0ZWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIHdpdGggZ2l2ZW4gaWQgZG9lcyBub3QgZXhpc3QuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGVsZXRpbmcgdGhlIHRhc2sgb3IgaW4gY2FzZSB0aGUgdGFzayBpcyBwYXJ0IG9mIGEgcnVubmluZyBwcm9jZXNzLlxuXHQgKi9cblx0cHVibGljIGRlbGV0ZVRhc2sodGFza0lkOiBzdHJpbmcsIGNhc2NhZGU/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKGNhc2NhZGUpKSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZVRhc2sodGFza0lkLCBjYXNjYWRlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgYWxsIHRhc2tzIG9mIHRoZSBnaXZlbiBjb2xsZWN0aW9uLCBub3QgZGVsZXRpbmcgaGlzdG9yaWMgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxhdGVkIHRvIHRoZXNlIHRhc2tzLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZHNcblx0ICogICAgICAgICAgICBUaGUgaWQncyBvZiB0aGUgdGFza3MgdGhhdCB3aWxsIGJlIGRlbGV0ZWQsIGNhbm5vdCBiZSBudWxsLiBBbGwgaWQncyBpbiB0aGUgbGlzdCB0aGF0IGRvbid0IGhhdmUgYW4gZXhpc3RpbmcgdGFzayB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqIEBwYXJhbSBjYXNjYWRlXG5cdCAqICAgICAgICAgICAgSWYgY2FzY2FkZSBpcyB0cnVlLCBhbHNvIHRoZSBoaXN0b3JpYyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoaXMgdGFzayBpcyBkZWxldGVkLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBvbmUgb2YgdGhlIHRhc2sgZG9lcyBub3QgZXhpc3QuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGVsZXRpbmcgdGhlIHRhc2tzIG9yIGluIGNhc2Ugb25lIG9mIHRoZSB0YXNrcyBpcyBwYXJ0IG9mIGEgcnVubmluZyBwcm9jZXNzLlxuXHQgKi9cblx0cHVibGljIGRlbGV0ZVRhc2tzKHRhc2tJZHM6IHN0cmluZ1tdLCBjYXNjYWRlPzogYm9vbGVhbik6IHZvaWQge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbChjYXNjYWRlKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrcyh0YXNrSWRzLCBjYXNjYWRlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrcyh0YXNrSWRzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlcyB0aGUgZ2l2ZW4gdGFzaywgbm90IGRlbGV0aW5nIGhpc3RvcmljIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVsYXRlZCB0byB0aGlzIHRhc2suLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgdGFzayB0aGF0IHdpbGwgYmUgZGVsZXRlZCwgY2Fubm90IGJlIG51bGwuIElmIG5vIHRhc2sgZXhpc3RzIHdpdGggdGhlIGdpdmVuIHRhc2tJZCwgdGhlIG9wZXJhdGlvbiBpcyBpZ25vcmVkLlxuXHQgKiBAcGFyYW0gZGVsZXRlUmVhc29uXG5cdCAqICAgICAgICAgICAgcmVhc29uIHRoZSB0YXNrIGlzIGRlbGV0ZWQuIElzIHJlY29yZGVkIGluIGhpc3RvcnksIGlmIGVuYWJsZWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIHdpdGggZ2l2ZW4gaWQgZG9lcyBub3QgZXhpc3QuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGVsZXRpbmcgdGhlIHRhc2sgb3IgaW4gY2FzZSB0aGUgdGFzayBpcyBwYXJ0IG9mIGEgcnVubmluZyBwcm9jZXNzXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlVGFza1dpdGhSZWFzb24odGFza0lkOiBzdHJpbmcsIGRlbGV0ZVJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrKHRhc2tJZCwgZGVsZXRlUmVhc29uKVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgYWxsIHRhc2tzIG9mIHRoZSBnaXZlbiBjb2xsZWN0aW9uLCBub3QgZGVsZXRpbmcgaGlzdG9yaWMgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxhdGVkIHRvIHRoZXNlIHRhc2tzLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZHNcblx0ICogICAgICAgICAgICBUaGUgaWQncyBvZiB0aGUgdGFza3MgdGhhdCB3aWxsIGJlIGRlbGV0ZWQsIGNhbm5vdCBiZSBudWxsLiBBbGwgaWQncyBpbiB0aGUgbGlzdCB0aGF0IGRvbid0IGhhdmUgYW4gZXhpc3RpbmcgdGFzayB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqIEBwYXJhbSBkZWxldGVSZWFzb25cblx0ICogICAgICAgICAgICByZWFzb24gdGhlIHRhc2sgaXMgZGVsZXRlZC4gSXMgcmVjb3JkZWQgaW4gaGlzdG9yeSwgaWYgZW5hYmxlZC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gb25lIG9mIHRoZSB0YXNrcyBkb2VzIG5vdCBleGlzdC5cblx0ICogQHRocm93cyBGbG93YWJsZUV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBkZWxldGluZyB0aGUgdGFza3Mgb3IgaW4gY2FzZSBvbmUgb2YgdGhlIHRhc2tzIGlzIHBhcnQgb2YgYSBydW5uaW5nIHByb2Nlc3MuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlVGFza3NXaXRoUmVhc29uKHRhc2tJZHM6IHN0cmluZ1tdLCBkZWxldGVSZWFzb246IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuZGVsZXRlVGFza3ModGFza0lkcywgZGVsZXRlUmVhc29uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGFpbSByZXNwb25zaWJpbGl0eSBmb3IgYSB0YXNrOiB0aGUgZ2l2ZW4gdXNlciBpcyBtYWRlIGFzc2lnbmVlIGZvciB0aGUgdGFzay4gVGhlIGRpZmZlcmVuY2Ugd2l0aCB7QGxpbmsgI3NldEFzc2lnbmVlKFN0cmluZywgU3RyaW5nKX0gaXMgdGhhdCBoZXJlIGEgY2hlY2sgaXMgZG9uZSBpZiB0aGUgdGFzayBhbHJlYWR5IGhhcyBhXG5cdCAqIHVzZXIgYXNzaWduZWQgdG8gaXQuIE5vIGNoZWNrIGlzIGRvbmUgd2hldGhlciB0aGUgdXNlciBpcyBrbm93biBieSB0aGUgaWRlbnRpdHkgY29tcG9uZW50LlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIHRhc2sgdG8gY2xhaW0sIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IGNsYWltcyB0aGUgdGFzay4gV2hlbiB1c2VySWQgaXMgbnVsbCB0aGUgdGFzayBpcyB1bmNsYWltZWQsIGFzc2lnbmVkIHRvIG5vIG9uZS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgZG9lc24ndCBleGlzdC5cblx0ICogQHRocm93cyBvcmcuZmxvd2FibGUuY29tbW9uLmVuZ2luZS5hcGkuRmxvd2FibGVUYXNrQWxyZWFkeUNsYWltZWRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBpcyBhbHJlYWR5IGNsYWltZWQgYnkgYW5vdGhlciB1c2VyXG5cdCAqL1xuXHRwdWJsaWMgY2xhaW0odGFza0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5jbGFpbSh0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaG9ydGN1dCB0byB7QGxpbmsgI2NsYWltfSB3aXRoIG51bGwgdXNlciBpbiBvcmRlciB0byB1bmNsYWltIHRoZSB0YXNrXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGFzayB0byB1bmNsYWltLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyB1bmNsYWltKHRhc2tJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS51bmNsYWltKHRhc2tJZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHRoZSB0YXNrIHN0YXRlIHRvIGluIHByb2dyZXNzLiBObyBjaGVjayBpcyBkb25lIHdoZXRoZXIgdGhlIHVzZXIgaXMga25vd24gYnkgdGhlIGlkZW50aXR5IGNvbXBvbmVudC5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICB0YXNrIHRvIGNoYW5nZSB0aGUgc3RhdGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IHB1dHMgdGhlIHRhc2sgaW4gcHJvZ3Jlc3MuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgc3RhcnRQcm9ncmVzcyh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnN0YXJ0UHJvZ3Jlc3ModGFza0lkLCB1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN1c3BlbmRzIHRoZSB0YXNrLiBObyBjaGVjayBpcyBkb25lIHdoZXRoZXIgdGhlIHVzZXIgaXMga25vd24gYnkgdGhlIGlkZW50aXR5IGNvbXBvbmVudC5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICB0YXNrIHRvIHN1c3BlbmQsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IHN1c3BlbmRzIHRoZSB0YXNrLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIHN1c3BlbmRUYXNrKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc3VzcGVuZFRhc2sodGFza0lkLCB1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFjdGl2YXRlcyB0aGUgdGFzay4gTm8gY2hlY2sgaXMgZG9uZSB3aGV0aGVyIHRoZSB1c2VyIGlzIGtub3duIGJ5IHRoZSBpZGVudGl0eSBjb21wb25lbnQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGFzayB0byBhY3RpdmF0ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICB1c2VyIHRoYXQgYWN0aXZhdGVzIHRoZSB0YXNrLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIGFjdGl2YXRlVGFzayh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmFjdGl2YXRlVGFzayh0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogRGVsZWdhdGVzIHRoZSB0YXNrIHRvIGFub3RoZXIgdXNlci4gVGhpcyBtZWFucyB0aGF0IHRoZSBhc3NpZ25lZSBpcyBzZXQgYW5kIHRoZSBkZWxlZ2F0aW9uIHN0YXRlIGlzIHNldCB0byB7QGxpbmsgRGVsZWdhdGlvblN0YXRlI1BFTkRJTkd9LiBJZiBubyBvd25lciBpcyBzZXQgb24gdGhlIHRhc2ssIHRoZSBvd25lciBpcyBzZXQgdG9cblx0ICogdGhlIGN1cnJlbnQgYXNzaWduZWUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSB0YXNrIHRoYXQgd2lsbCBiZSBkZWxlZ2F0ZWQuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHVzZXIgdGhhdCB3aWxsIGJlIHNldCBhcyBhc3NpZ25lZS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZWdhdGVUYXNrKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuZGVsZWdhdGVUYXNrKHRhc2tJZCwgdXNlcklkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYXJrcyB0aGF0IHRoZSBhc3NpZ25lZSBpcyBkb25lIHdpdGggdGhpcyB0YXNrIGFuZCB0aGF0IGl0IGNhbiBiZSBzZW5kIGJhY2sgdG8gdGhlIG93bmVyLiBDYW4gb25seSBiZSBjYWxsZWQgd2hlbiB0aGlzIHRhc2sgaXMge0BsaW5rIERlbGVnYXRpb25TdGF0ZSNQRU5ESU5HfSBkZWxlZ2F0aW9uLiBBZnRlciB0aGlzIG1ldGhvZFxuXHQgKiByZXR1cm5zLCB0aGUge0BsaW5rIFRhc2sjZ2V0RGVsZWdhdGlvblN0YXRlKCkgZGVsZWdhdGlvblN0YXRlfSBpcyBzZXQgdG8ge0BsaW5rIERlbGVnYXRpb25TdGF0ZSNSRVNPTFZFRH0uXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSB0YXNrIHRvIHJlc29sdmUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVzXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXNcblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqL1xuXHRwdWJsaWMgcmVzb2x2ZVRhc2sodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4sIHRyYW5zaWVudFZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVzKSAmJiB0aGlzLmlzTm90TnVsbCh0cmFuc2llbnRWYXJpYWJsZXMpKSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLnJlc29sdmVUYXNrKHRhc2tJZCwgdmFyaWFibGVzLCB0cmFuc2llbnRWYXJpYWJsZXMpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVzKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5yZXNvbHZlVGFzayh0YXNrSWQsIHZhcmlhYmxlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UucmVzb2x2ZVRhc2sodGFza0lkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIHRhc2sgaXMgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgdGFzayB0byBjb21wbGV0ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICB1c2VyIHRoYXQgY29tcGxldGVzIHRoZSB0YXNrLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVzXG5cdCAqICAgICAgICAgICAgdGFzayBwYXJhbWV0ZXJzLiBNYXkgYmUgbnVsbCBvciBlbXB0eS5cblx0ICogQHBhcmFtIHRyYW5zaWVudFZhcmlhYmxlc1xuXHQgKiAgICAgICAgICAgIHRhc2sgcGFyYW1ldGVycy4gTWF5IGJlIG51bGwgb3IgZW1wdHkuXG5cdCAqIEBwYXJhbSBsb2NhbFNjb3BlXG5cdCAqICAgICAgICAgICAgSWYgdHJ1ZSwgdGhlIHByb3ZpZGVkIHZhcmlhYmxlcyB3aWxsIGJlIHN0b3JlZCB0YXNrLWxvY2FsLCBpbnN0ZWFkIG9mIHByb2Nlc3MgaW5zdGFuY2Ugd2lkZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyKS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGlzIHRhc2sgaXMge0BsaW5rIERlbGVnYXRpb25TdGF0ZSNQRU5ESU5HfSBkZWxlZ2F0aW9uLlxuXHQgKi9cblx0cHVibGljIGNvbXBsZXRlKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ/OiBzdHJpbmcsIHZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4sIHRyYW5zaWVudFZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4sIGxvY2FsU2NvcGU/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHVzZXJJZCkgJiYgdGhpcy5pc05vdE51bGwodmFyaWFibGVzKSAmJiB0aGlzLmlzTm90TnVsbChsb2NhbFNjb3BlKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHVzZXJJZCwgdmFyaWFibGVzLCBsb2NhbFNjb3BlKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHZhcmlhYmxlcykgJiYgdGhpcy5pc05vdE51bGwobG9jYWxTY29wZSkpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkLCB2YXJpYWJsZXMsIGxvY2FsU2NvcGUpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc05vdE51bGwodXNlcklkKSAmJiB0aGlzLmlzTm90TnVsbCh2YXJpYWJsZXMpICYmIHRoaXMuaXNOb3ROdWxsKHRyYW5zaWVudFZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkLCB1c2VySWQsIHZhcmlhYmxlcywgdHJhbnNpZW50VmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHZhcmlhYmxlcykgJiYgdGhpcy5pc05vdE51bGwodHJhbnNpZW50VmFyaWFibGVzKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHZhcmlhYmxlcywgdHJhbnNpZW50VmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHVzZXJJZCkgJiYgdGhpcy5pc05vdE51bGwodmFyaWFibGVzKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHVzZXJJZCwgdmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkLCB2YXJpYWJsZXMpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc05vdE51bGwodXNlcklkKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHVzZXJJZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIHRhc2sgaXMgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLCBhbmQgdGhlIHRhc2sgZm9ybSBoYXMgYmVlbiBzdWJtaXR0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSB0YXNrIHRvIGNvbXBsZXRlLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGZvcm1EZWZpbml0aW9uSWRcblx0ICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGZvcm0gZGVmaW5pdGlvbiB0aGF0IGlzIGZpbGxlZC1pbiB0byBjb21wbGV0ZSB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBvdXRjb21lXG5cdCAqICAgICAgICAgICAgdGhlIG91dGNvbWUgb2YgdGhlIGNvbXBsZXRlZCBmb3JtLCBjYW4gYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhcmlhYmxlc1xuXHQgKiAgICAgICAgICAgIHZhbHVlcyBvZiB0aGUgY29tcGxldGVkIGZvcm0uIE1heSBiZSBudWxsIG9yIGVtcHR5LlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IGNvbXBsZXRlcyB0aGUgdGFzay5cblx0ICogQHBhcmFtIHRyYW5zaWVudFZhcmlhYmxlc1xuXHQgKiAgICAgICAgICAgIGFkZGl0aW9uYWwgdHJhbnNpZW50IHZhbHVlcyB0aGF0IG5lZWQgdG8gYWRkZWQgdG8gdGhlIHByb2Nlc3MgaW5zdGFuY2UgdHJhbnNpZW50IHZhcmlhYmxlcy4gTWF5IGJlIG51bGwgb3IgZW1wdHkuXG5cdCAqIEBwYXJhbSBsb2NhbFNjb3BlXG5cdCAqICAgICAgICAgICAgSWYgdHJ1ZSwgdGhlIHByb3ZpZGVkIHZhcmlhYmxlcyB3aWxsIGJlIHN0b3JlZCB0YXNrLWxvY2FsLCBpbnN0ZWFkIG9mIHByb2Nlc3MgaW5zdGFuY2Ugd2lkZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQgZm9yIHtAbGluayAjY29tcGxldGUoU3RyaW5nLCBNYXApfSkuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIHRhc2sgZXhpc3RzIHdpdGggdGhlIGdpdmVuIGlkLlxuXHQgKi9cblx0cHVibGljIGNvbXBsZXRlVGFza1dpdGhGb3JtKHRhc2tJZDogc3RyaW5nLCBmb3JtRGVmaW5pdGlvbklkOiBzdHJpbmcsIG91dGNvbWU6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8U3RyaW5nLCBhbnk+LCB1c2VySWQ/OiBzdHJpbmcsIHRyYW5zaWVudFZhcmlhYmxlcz86IE1hcDxTdHJpbmcsIGFueT4sIGxvY2FsU2NvcGU/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHVzZXJJZCkgJiYgdGhpcy5pc05vdE51bGwobG9jYWxTY29wZSkpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGVUYXNrV2l0aEZvcm0odGFza0lkLCBmb3JtRGVmaW5pdGlvbklkLCBvdXRjb21lLCB1c2VySWQsIHZhcmlhYmxlcywgbG9jYWxTY29wZSk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbChsb2NhbFNjb3BlKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZVRhc2tXaXRoRm9ybSh0YXNrSWQsIGZvcm1EZWZpbml0aW9uSWQsIG91dGNvbWUsIHZhcmlhYmxlcywgbG9jYWxTY29wZSk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbCh1c2VySWQpICYmIHRoaXMuaXNOb3ROdWxsKHRyYW5zaWVudFZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGVUYXNrV2l0aEZvcm0odGFza0lkLCBmb3JtRGVmaW5pdGlvbklkLCBvdXRjb21lLCB1c2VySWQsIHZhcmlhYmxlcywgdHJhbnNpZW50VmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHRyYW5zaWVudFZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGVUYXNrV2l0aEZvcm0odGFza0lkLCBmb3JtRGVmaW5pdGlvbklkLCBvdXRjb21lLCB2YXJpYWJsZXMsIHRyYW5zaWVudFZhcmlhYmxlcyk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbCh1c2VySWQpKSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLmNvbXBsZXRlVGFza1dpdGhGb3JtKHRhc2tJZCwgZm9ybURlZmluaXRpb25JZCwgb3V0Y29tZSwgdXNlcklkLCB2YXJpYWJsZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLmNvbXBsZXRlVGFza1dpdGhGb3JtKHRhc2tJZCwgZm9ybURlZmluaXRpb25JZCwgb3V0Y29tZSwgdmFyaWFibGVzKTtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIEdldHMgYSBGb3JtIG1vZGVsIGluc3RhbmNlIG9mIHRoZSB0YXNrIGZvcm0gb2YgYSBzcGVjaWZpYyB0YXNrXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gaWdub3JlVmFyaWFibGVzXG5cdCAqICAgICAgICAgICAgc2hvdWxkIHRoZSB2YXJpYWJsZXMgYmUgaWdub3JlZCB3aGVuIGZldGNoaW5nIHRoZSBmb3JtIG1vZGVsP1xuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBmb3JtIGRlZmluaXRpb24gZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBnZXRUYXNrRm9ybU1vZGVsKHRhc2tJZDogc3RyaW5nLCBpZ25vcmVWYXJpYWJsZXM/OiBib29sZWFuKTogRm9ybUluZm8ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbChpZ25vcmVWYXJpYWJsZXMpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRUYXNrRm9ybU1vZGVsKHRhc2tJZCwgaWdub3JlVmFyaWFibGVzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0VGFza0Zvcm1Nb2RlbCh0YXNrSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBhc3NpZ25lZSBvZiB0aGUgZ2l2ZW4gdGFzayB0byB0aGUgZ2l2ZW4gdXNlcklkLiBObyBjaGVjayBpcyBkb25lIHdoZXRoZXIgdGhlIHVzZXIgaXMga25vd24gYnkgdGhlIGlkZW50aXR5IGNvbXBvbmVudC5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgdXNlciB0byB1c2UgYXMgYXNzaWduZWUuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIHVzZXIgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBzZXRBc3NpZ25lZSh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldEFzc2lnbmVlKHRhc2tJZCwgdXNlcklkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmFuc2ZlcnMgb3duZXJzaGlwIG9mIHRoaXMgdGFzayB0byBhbm90aGVyIHVzZXIuIE5vIGNoZWNrIGlzIGRvbmUgd2hldGhlciB0aGUgdXNlciBpcyBrbm93biBieSB0aGUgaWRlbnRpdHkgY29tcG9uZW50LlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHVzZXJJZFxuXHQgKiAgICAgICAgICAgIG9mIHRoZSBwZXJzb24gdGhhdCBpcyByZWNlaXZpbmcgb3duZXJzaGlwLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgc2V0T3duZXIodGFza0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5zZXRPd25lcih0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSB7QGxpbmsgSWRlbnRpdHlMaW5rfXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB0YXNrLiBTdWNoIGFuIHtAbGluayBJZGVudGl0eUxpbmt9IGluZm9ybXMgaG93IGEgY2VydGFpbiBpZGVudGl0eSAoZWcuIGdyb3VwIG9yIHVzZXIpIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNlcnRhaW4gdGFzayAoZWcuIGFzXG5cdCAqIGNhbmRpZGF0ZSwgYXNzaWduZWUsIGV0Yy4pXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SWRlbnRpdHlMaW5rc0ZvclRhc2sodGFza0lkOiBzdHJpbmcpOiBJZGVudGl0eUxpbmtbXSB7XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0SWRlbnRpdHlMaW5rc0ZvclRhc2sodGFza0lkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZW5pZW5jZSBzaG9ydGhhbmQgZm9yIHtAbGluayAjYWRkVXNlcklkZW50aXR5TGluayhTdHJpbmcsIFN0cmluZywgU3RyaW5nKX07IHdpdGggdHlwZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZSNDQU5ESURBVEV9XG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgdG8gdXNlIGFzIGNhbmRpZGF0ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIHVzZXIgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBhZGRDYW5kaWRhdGVVc2VyKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuYWRkQ2FuZGlkYXRlVXNlcih0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIGZvciB7QGxpbmsgI2FkZEdyb3VwSWRlbnRpdHlMaW5rKFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfTsgd2l0aCB0eXBlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlI0NBTkRJREFURX1cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBncm91cElkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIGdyb3VwIHRvIHVzZSBhcyBjYW5kaWRhdGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBncm91cCBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZUdyb3VwKHRhc2tJZDogc3RyaW5nLCBncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmFkZENhbmRpZGF0ZUdyb3VwKHRhc2tJZCwgZ3JvdXBJZCk7XG5cdH1cblxuXHQvKipcblx0ICogSW52b2x2ZXMgYSB1c2VyIHdpdGggYSB0YXNrLiBUaGUgdHlwZSBvZiBpZGVudGl0eSBsaW5rIGlzIGRlZmluZWQgYnkgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG5cdCAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eUxpbmssIGNhbm5vdCBiZSBudWxsIChAc2VlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlfSkuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIHVzZXIgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBhZGRVc2VySWRlbnRpdHlMaW5rKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgaWRlbnRpdHlMaW5rVHlwZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5hZGRVc2VySWRlbnRpdHlMaW5rKHRhc2tJZCwgdXNlcklkLCBpZGVudGl0eUxpbmtUeXBlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbnZvbHZlcyBhIGdyb3VwIHdpdGggYSB0YXNrLiBUaGUgdHlwZSBvZiBpZGVudGl0eUxpbmsgaXMgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gaWRlbnRpdHlMaW5rLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG5cdCAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eSwgY2Fubm90IGJlIG51bGwgKEBzZWUge0BsaW5rIElkZW50aXR5TGlua1R5cGV9KS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBhZGRHcm91cElkZW50aXR5TGluayh0YXNrSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmFkZEdyb3VwSWRlbnRpdHlMaW5rKHRhc2tJZCwgZ3JvdXBJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIGZvciB7QGxpbmsgI2RlbGV0ZVVzZXJJZGVudGl0eUxpbmsoU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9OyB3aXRoIHR5cGUge0BsaW5rIElkZW50aXR5TGlua1R5cGUjQ0FORElEQVRFfVxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHVzZXJJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB1c2VyIHRvIHVzZSBhcyBjYW5kaWRhdGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlQ2FuZGlkYXRlVXNlcih0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZUNhbmRpZGF0ZVVzZXIodGFza0lkLCB1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIHNob3J0aGFuZCBmb3Ige0BsaW5rICNkZWxldGVHcm91cElkZW50aXR5TGluayhTdHJpbmcsIFN0cmluZywgU3RyaW5nKX07IHdpdGggdHlwZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZSNDQU5ESURBVEV9XG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gZ3JvdXBJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSBncm91cCB0byB1c2UgYXMgY2FuZGlkYXRlLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBkZWxldGVDYW5kaWRhdGVHcm91cCh0YXNrSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVDYW5kaWRhdGVHcm91cCh0YXNrSWQsIGdyb3VwSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gYSB1c2VyIGFuZCBhIHRhc2sgZm9yIHRoZSBnaXZlbiBpZGVudGl0eUxpbmtUeXBlLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHVzZXJJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB1c2VyIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gaWRlbnRpdHlMaW5rVHlwZVxuXHQgKiAgICAgICAgICAgIHR5cGUgb2YgaWRlbnRpdHlMaW5rLCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlVXNlcklkZW50aXR5TGluayh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIGlkZW50aXR5TGlua1R5cGU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuZGVsZXRlVXNlcklkZW50aXR5TGluayh0YXNrSWQsIHVzZXJJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBhIGdyb3VwIGFuZCBhIHRhc2sgZm9yIHRoZSBnaXZlbiBpZGVudGl0eUxpbmtUeXBlLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG5cdCAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eSwgY2Fubm90IGJlIG51bGwgKEBzZWUge0BsaW5rIElkZW50aXR5TGlua1R5cGV9KS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBkZWxldGVHcm91cElkZW50aXR5TGluayh0YXNrSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZUdyb3VwSWRlbnRpdHlMaW5rKHRhc2tJZCwgZ3JvdXBJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgcHJpb3JpdHkgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBBdXRob3JpemF0aW9uOiBhY3R1YWwgb3duZXIgLyBidXNpbmVzcyBhZG1pblxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHByaW9yaXR5XG5cdCAqICAgICAgICAgICAgdGhlIG5ldyBwcmlvcml0eSBmb3IgdGhlIHRhc2suXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgc2V0UHJpb3JpdHkodGFza0lkOiBzdHJpbmcsIHByaW9yaXR5OiBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFByaW9yaXR5KHRhc2tJZCwgcHJpb3JpdHkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIGR1ZSBkYXRlIG9mIHRoZSB0YXNrXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gZHVlRGF0ZVxuXHQgKiAgICAgICAgICAgIHRoZSBuZXcgZHVlIGRhdGUgZm9yIHRoZSB0YXNrXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIHNldER1ZURhdGUodGFza0lkOiBzdHJpbmcsIGR1ZURhdGU6IERhdGUpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldER1ZURhdGUodGFza0lkLCBkdWVEYXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBzZXQgdmFyaWFibGUgb24gYSB0YXNrLiBJZiB0aGUgdmFyaWFibGUgaXMgbm90IGFscmVhZHkgZXhpc3RpbmcsIGl0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgbW9zdCBvdXRlciBzY29wZS4gVGhpcyBtZWFucyB0aGUgcHJvY2VzcyBpbnN0YW5jZSBpbiBjYXNlIHRoaXMgdGFzayBpcyByZWxhdGVkIHRvIGFuIGV4ZWN1dGlvbi5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZSh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFZhcmlhYmxlKHRhc2tJZCwgdmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBzZXQgdmFyaWFibGVzIG9uIGEgdGFzay4gSWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBhbHJlYWR5IGV4aXN0aW5nLCBpdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIG1vc3Qgb3V0ZXIgc2NvcGUuIFRoaXMgbWVhbnMgdGhlIHByb2Nlc3MgaW5zdGFuY2UgaW4gY2FzZSB0aGlzIHRhc2sgaXMgcmVsYXRlZCB0byBhbiBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGVzKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZXM6IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFZhcmlhYmxlcyh0YXNrSWQsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZXNNYXAodmFyaWFibGVzKSk7XG5cdH1cblxuXHQvKipcblx0ICogc2V0IHZhcmlhYmxlIG9uIGEgdGFzay4gSWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBhbHJlYWR5IGV4aXN0aW5nLCBpdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGVMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFZhcmlhYmxlTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHNldCB2YXJpYWJsZXMgb24gYSB0YXNrLiBJZiB0aGUgdmFyaWFibGUgaXMgbm90IGFscmVhZHkgZXhpc3RpbmcsIGl0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZXNMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5zZXRWYXJpYWJsZXNMb2NhbCh0YXNrSWQsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZXNNYXAodmFyaWFibGVzKSk7XG5cdH1cblxuXHQvKipcblx0ICogZ2V0IGEgdmFyaWFibGVzIGFuZCBzZWFyY2ggaW4gdGhlIHRhc2sgc2NvcGUgYW5kIGlmIGF2YWlsYWJsZSBhbHNvIHRoZSBleGVjdXRpb24gc2NvcGVzLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudGFza1NlcnZpY2UuZ2V0VmFyaWFibGUodGFza0lkLCB2YXJpYWJsZU5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdmFyaWFibGUuIFNlYXJjaGluZyBmb3IgdGhlIHZhcmlhYmxlIGlzIGRvbmUgaW4gYWxsIHNjb3BlcyB0aGF0IGFyZSB2aXNpYmxlIHRvIHRoZSBnaXZlbiB0YXNrIChpbmNsdWRpbmcgcGFyZW50IHNjb3BlcykuIFJldHVybnMgbnVsbCB3aGVuIG5vIHZhcmlhYmxlIHZhbHVlIGlzIGZvdW5kIHdpdGggdGhlIGdpdmVuIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZVxuXHQgKiAgICAgICAgICAgIG5hbWUgb2YgdmFyaWFibGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcmV0dXJuIHRoZSB2YXJpYWJsZSBvciBudWxsIGlmIHRoZSB2YXJpYWJsZSBpcyB1bmRlZmluZWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIGV4ZWN1dGlvbiBpcyBmb3VuZCBmb3IgdGhlIGdpdmVuIHRhc2tJZC5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUluc3RhbmNlKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IFZhcmlhYmxlSW5zdGFuY2Uge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlSW5zdGFuY2UodGFza0lkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGNoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgdGFzayBoYXMgYSB2YXJpYWJsZSBkZWZpbmVkIHdpdGggdGhlIGdpdmVuIG5hbWUsIGluIHRoZSB0YXNrIHNjb3BlIGFuZCBpZiBhdmFpbGFibGUgYWxzbyB0aGUgZXhlY3V0aW9uIHNjb3Blcy5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZSh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5oYXNWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogY2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSB0YXNrIGhhcyBhIHZhcmlhYmxlIGRlZmluZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUxvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudGFza1NlcnZpY2UuZ2V0VmFyaWFibGVMb2NhbCh0YXNrSWQsIHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB2YXJpYWJsZSBmb3IgYSB0YXNrLiBSZXR1cm5zIHRoZSB2YXJpYWJsZSB3aGVuIGl0IGlzIHNldCBmb3IgdGhlIHRhc2sgKGFuZCBub3Qgc2VhcmNoaW5nIHBhcmVudCBzY29wZXMpLiBSZXR1cm5zIG51bGwgd2hlbiBubyB2YXJpYWJsZSBpcyBmb3VuZCB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWVcblx0ICogICAgICAgICAgICBuYW1lIG9mIHZhcmlhYmxlLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHJldHVybiB0aGUgdmFyaWFibGUgb3IgbnVsbCBpZiB0aGUgdmFyaWFibGUgaXMgdW5kZWZpbmVkLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBubyB0YXNrIGlzIGZvdW5kIGZvciB0aGUgZ2l2ZW4gdGFza0lkLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2VMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiBWYXJpYWJsZUluc3RhbmNlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZUluc3RhbmNlTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGNoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgdGFzayBoYXMgYSB2YXJpYWJsZSBkZWZpbmVkIHdpdGggdGhlIGdpdmVuIG5hbWUsIGxvY2FsIHRhc2sgc2NvcGUgb25seS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZUxvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmhhc1ZhcmlhYmxlTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGdldCBhbGwgdmFyaWFibGVzIGFuZCBzZWFyY2ggaW4gdGhlIHRhc2sgc2NvcGUgYW5kIGlmIGF2YWlsYWJsZSBhbHNvIHRoZSBleGVjdXRpb24gc2NvcGVzLiBJZiB5b3UgaGF2ZSBtYW55IHZhcmlhYmxlcyBhbmQgeW91IG9ubHkgbmVlZCBhIGZldywgY29uc2lkZXIgdXNpbmdcblx0ICoge0BsaW5rICNnZXRWYXJpYWJsZXMoU3RyaW5nLCBDb2xsZWN0aW9uKX0gZm9yIGJldHRlciBwZXJmb3JtYW5jZS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZXModGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZXM/OiBzdHJpbmdbXSk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbCh2YXJpYWJsZU5hbWVzKSkge1xuXHRcdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcCh0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlcyh0YXNrSWQsIHZhcmlhYmxlTmFtZXMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcCh0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlcyh0YXNrSWQpKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWxsIHZhcmlhYmxlcyB2aXNpYmxlIGZyb20gdGhlIGdpdmVuIHRhc2sgc2NvcGUgKGluY2x1ZGluZyBwYXJlbnQgc2NvcGVzKS5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lc1xuXHQgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHJldHJpZXZlZC5cblx0ICogQHJldHVybiB0aGUgdmFyaWFibGUgaW5zdGFuY2VzIG9yIGFuIGVtcHR5IG1hcCBpZiBubyBzdWNoIHZhcmlhYmxlcyBhcmUgZm91bmQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIHRhc2sgaXMgZm91bmQgZm9yIHRoZSBnaXZlbiB0YXNrSWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXModGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZXM/OiBzdHJpbmdbXSk6IE1hcDxzdHJpbmcsIFZhcmlhYmxlSW5zdGFuY2U+IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVOYW1lcykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlSW5zdGFuY2VzKHRhc2tJZCwgdmFyaWFibGVOYW1lcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlSW5zdGFuY2VzKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIGdldCBhbGwgdmFyaWFibGVzIGFuZCBzZWFyY2ggb25seSBpbiB0aGUgdGFzayBzY29wZS4gSWYgeW91IGhhdmUgbWFueSB0YXNrIGxvY2FsIHZhcmlhYmxlcyBhbmQgeW91IG9ubHkgbmVlZCBhIGZldywgY29uc2lkZXIgdXNpbmcge0BsaW5rICNnZXRWYXJpYWJsZXNMb2NhbChTdHJpbmcsIENvbGxlY3Rpb24pfSBmb3IgYmV0dGVyXG5cdCAqIHBlcmZvcm1hbmNlLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlc0xvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWVzPzogc3RyaW5nW10pOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVOYW1lcykpIHtcblx0XHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZXNNYXAodGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZXNMb2NhbCh0YXNrSWQsIHZhcmlhYmxlTmFtZXMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcCh0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlc0xvY2FsKHRhc2tJZCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBnZXQgYWxsIHZhcmlhYmxlcyBhbmQgc2VhcmNoIG9ubHkgaW4gdGhlIHRhc2sgc2NvcGUuICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsQnlUYXNrSWRzKHRhc2tJZHM6IFNldDxzdHJpbmc+KTogVmFyaWFibGVJbnN0YW5jZVtdIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsQnlUYXNrSWRzKHRhc2tJZHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFsbCB2YXJpYWJsZSB2YWx1ZXMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgdGFzayBzY29wZSwgd2l0aG91dCB0YWtpbmcgb3V0ZXIgc2NvcGVzIGludG8gYWNjb3VudC4gSWYgeW91IGhhdmUgbWFueSB0YXNrIGxvY2FsIHZhcmlhYmxlcyBhbmQgeW91IG9ubHkgbmVlZCBhIGZldywgY29uc2lkZXIgdXNpbmdcblx0ICoge0BsaW5rICNnZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsKFN0cmluZywgQ29sbGVjdGlvbil9IGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHJldHVybiB0aGUgdmFyaWFibGVzIG9yIGFuIGVtcHR5IG1hcCBpZiBubyBzdWNoIHZhcmlhYmxlcyBhcmUgZm91bmQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIHRhc2sgaXMgZm91bmQgZm9yIHRoZSBnaXZlbiB0YXNrSWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lcz86IHN0cmluZ1tdKTogTWFwPHN0cmluZywgVmFyaWFibGVJbnN0YW5jZT4ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbCh2YXJpYWJsZU5hbWVzKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCh0YXNrSWQsIHZhcmlhYmxlTmFtZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIHZhcmlhYmxlIGZyb20gdGhlIHRhc2suIFdoZW4gdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LCBub3RoaW5nIGhhcHBlbnMuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVmFyaWFibGUodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5yZW1vdmVWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgdmFyaWFibGUgZnJvbSB0aGUgdGFzayAobm90IGNvbnNpZGVyaW5nIHBhcmVudCBzY29wZXMpLiBXaGVuIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCwgbm90aGluZyBoYXBwZW5zLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlTG9jYWwodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5yZW1vdmVWYXJpYWJsZUxvY2FsKHRhc2tJZCwgdmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCB2YXJpYWJsZXMgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgdGFzay4gTm9uIGV4aXN0aW5nIHZhcmlhYmxlIG5hbWVzIGFyZSBzaW1wbHkgaWdub3JlZC5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZXModGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5yZW1vdmVWYXJpYWJsZXModGFza0lkLCB2YXJpYWJsZU5hbWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCB2YXJpYWJsZXMgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgdGFzayAobm90IGNvbnNpZGVyaW5nIHBhcmVudCBzY29wZXMpLiBOb24gZXhpc3RpbmcgdmFyaWFibGUgbmFtZXMgYXJlIHNpbXBseSBpZ25vcmVkLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlc0xvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UucmVtb3ZlVmFyaWFibGVzTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBbGwgRGF0YU9iamVjdHMgdmlzaWJsZSBmcm9tIHRoZSBnaXZlbiBleGVjdXRpb24gc2NvcGUgKGluY2x1ZGluZyBwYXJlbnQgc2NvcGVzKS5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gZGF0YU9iamVjdE5hbWVzXG5cdCAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2YgRGF0YU9iamVjdCBuYW1lcyB0aGF0IHNob3VsZCBiZSByZXRyaWV2ZWQuXG5cdCAqIEBwYXJhbSBsb2NhbGVcblx0ICogICAgICAgICAgICBsb2NhbGUgdGhlIERhdGFPYmplY3QgbmFtZSBhbmQgZGVzY3JpcHRpb24gc2hvdWxkIGJlIHJldHVybmVkIGluIChpZiBhdmFpbGFibGUpLlxuXHQgKiBAcGFyYW0gd2l0aExvY2FsaXphdGlvbkZhbGxiYWNrXG5cdCAqICAgICAgICAgICAgV2hlbiB0cnVlIGxvY2FsaXphdGlvbiB3aWxsIGZhbGxiYWNrIHRvIG1vcmUgZ2VuZXJhbCBsb2NhbGVzIGlmIHRoZSBzcGVjaWZpZWQgbG9jYWxlIGlzIG5vdCBmb3VuZC5cblx0ICogQHJldHVybiB0aGUgRGF0YU9iamVjdHMgb3IgYW4gZW1wdHkgbWFwIGlmIG5vIHN1Y2ggdmFyaWFibGVzIGFyZSBmb3VuZC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBpcyBmb3VuZCBmb3IgdGhlIGdpdmVuIHRhc2tJZC5cblx0ICovXG5cdHB1YmxpYyBnZXREYXRhT2JqZWN0cyh0YXNrSWQ6IHN0cmluZywgZGF0YU9iamVjdE5hbWVzPzogc3RyaW5nW10sIGxvY2FsZT86IHN0cmluZywgd2l0aExvY2FsaXphdGlvbkZhbGxiYWNrPzogYm9vbGVhbik6IE1hcDxzdHJpbmcsIERhdGFPYmplY3Q+IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwoZGF0YU9iamVjdE5hbWVzKSAmJiB0aGlzLmlzTm90TnVsbChsb2NhbGUpICYmIHRoaXMuaXNOb3ROdWxsKHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjaykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3RzKHRhc2tJZCwgZGF0YU9iamVjdE5hbWVzLCBsb2NhbGUsIHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjayk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbChkYXRhT2JqZWN0TmFtZXMpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXREYXRhT2JqZWN0cyh0YXNrSWQsIGRhdGFPYmplY3ROYW1lcyk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbChsb2NhbGUpICYmIHRoaXMuaXNOb3ROdWxsKHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjaykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3RzKHRhc2tJZCwgbG9jYWxlLCB3aXRoTG9jYWxpemF0aW9uRmFsbGJhY2spO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXREYXRhT2JqZWN0cyh0YXNrSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgRGF0YU9iamVjdC4gU2VhcmNoaW5nIGZvciB0aGUgRGF0YU9iamVjdCBpcyBkb25lIGluIGFsbCBzY29wZXMgdGhhdCBhcmUgdmlzaWJsZSB0byB0aGUgZ2l2ZW4gdGFzayAoaW5jbHVkaW5nIHBhcmVudCBzY29wZXMpLiBSZXR1cm5zIG51bGwgd2hlbiBubyBEYXRhT2JqZWN0IHZhbHVlIGlzIGZvdW5kIHdpdGggdGhlIGdpdmVuXG5cdCAqIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGRhdGFPYmplY3Rcblx0ICogICAgICAgICAgICBuYW1lIG9mIERhdGFPYmplY3QsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gbG9jYWxlXG5cdCAqICAgICAgICAgICAgbG9jYWxlIHRoZSBEYXRhT2JqZWN0IG5hbWUgYW5kIGRlc2NyaXB0aW9uIHNob3VsZCBiZSByZXR1cm5lZCBpbiAoaWYgYXZhaWxhYmxlKS5cblx0ICogQHBhcmFtIHdpdGhMb2NhbGl6YXRpb25GYWxsYmFja1xuXHQgKiAgICAgICAgICAgIFdoZW4gdHJ1ZSBsb2NhbGl6YXRpb24gd2lsbCBmYWxsYmFjayB0byBtb3JlIGdlbmVyYWwgbG9jYWxlcyBpbmNsdWRpbmcgdGhlIGRlZmF1bHQgbG9jYWxlIG9mIHRoZSBKVk0gaWYgdGhlIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLlxuXHQgKiBAcmV0dXJuIHRoZSBEYXRhT2JqZWN0IG9yIG51bGwgaWYgdGhlIHZhcmlhYmxlIGlzIHVuZGVmaW5lZC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBpcyBmb3VuZCBmb3IgdGhlIGdpdmVuIHRhc2tJZC5cblx0ICovXG5cdHB1YmxpYyBnZXREYXRhT2JqZWN0KHRhc2tJZDogc3RyaW5nLCBkYXRhT2JqZWN0OiBzdHJpbmcsIGxvY2FsZT86IHN0cmluZywgd2l0aExvY2FsaXphdGlvbkZhbGxiYWNrPzogYm9vbGVhbik6IERhdGFPYmplY3Qge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbChsb2NhbGUpICYmIHRoaXMuaXNOb3ROdWxsKHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjaykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3QodGFza0lkLCBkYXRhT2JqZWN0LCBsb2NhbGUsIHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjayk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3QodGFza0lkLCBkYXRhT2JqZWN0KTtcblx0XHR9XG5cdH1cblxuXHQvKiogQWRkIGEgY29tbWVudCB0byBhIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UuICovXG5cdHB1YmxpYyBhZGRDb21tZW50KHRhc2tJZDogc3RyaW5nLCBwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBDb21tZW50IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodHlwZSkpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmFkZENvbW1lbnQodGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgdHlwZSwgbWVzc2FnZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmFkZENvbW1lbnQodGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgbWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFVwZGF0ZSBhIGNvbW1lbnQgdG8gYSB0YXNrIGFuZC9vciBwcm9jZXNzIGluc3RhbmNlLiAqL1xuXHRwdWJsaWMgc2F2ZUNvbW1lbnQoY29tbWVudDogQ29tbWVudCk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc2F2ZUNvbW1lbnQoY29tbWVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpbmRpdmlkdWFsIGNvbW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQuIFJldHVybnMgbnVsbCBpZiBubyBjb21tZW50IGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBpZC5cblx0ICovXG5cdHB1YmxpYyBnZXRDb21tZW50KGNvbW1lbnRJZDogc3RyaW5nKTogQ29tbWVudCB7XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0Q29tbWVudChjb21tZW50SWQpO1xuXHR9XG5cblx0LyoqIFJlbW92ZXMgYWxsIGNvbW1lbnRzIGZyb20gdGhlIHByb3ZpZGVkIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UgKi9cblx0cHVibGljIGRlbGV0ZUNvbW1lbnRzKHRhc2tJZDogc3RyaW5nLCBwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVDb21tZW50cyh0YXNrSWQsIHByb2Nlc3NJbnN0YW5jZUlkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFuIGluZGl2aWR1YWwgY29tbWVudCB3aXRoIHRoZSBnaXZlbiBpZC5cblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIGNvbW1lbnQgZXhpc3RzIHdpdGggdGhlIGdpdmVuIGlkLlxuXHQgKi9cblx0cHVibGljIGRlbGV0ZUNvbW1lbnQoY29tbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZUNvbW1lbnQoY29tbWVudElkKTtcblx0fVxuXG5cdC8qKiBUaGUgY29tbWVudHMgcmVsYXRlZCB0byB0aGUgZ2l2ZW4gdGFzay4gKi9cblx0cHVibGljIGdldFRhc2tDb21tZW50cyh0YXNrSWQ6IHN0cmluZywgdHlwZT86IHN0cmluZyk6IENvbW1lbnRbXSB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHR5cGUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRUYXNrQ29tbWVudHModGFza0lkLCB0eXBlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0VGFza0NvbW1lbnRzKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIEFsbCBjb21tZW50cyBvZiBhIGdpdmVuIHR5cGUuICovXG5cdHB1YmxpYyBnZXRDb21tZW50c0J5VHlwZSh0eXBlOiBzdHJpbmcpOiBDb21tZW50W10ge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldENvbW1lbnRzQnlUeXBlKHR5cGUpO1xuXHR9XG5cblx0LyoqIFRoZSBhbGwgZXZlbnRzIHJlbGF0ZWQgdG8gdGhlIGdpdmVuIHRhc2suICovXG5cdHB1YmxpYyBnZXRUYXNrRXZlbnRzKHRhc2tJZDogc3RyaW5nKTogVGFza0V2ZW50W10ge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFRhc2tFdmVudHModGFza0lkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIGluZGl2aWR1YWwgZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gaWQuIFJldHVybnMgbnVsbCBpZiBubyBldmVudCBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnQoZXZlbnRJZDogc3RyaW5nKTogVGFza0V2ZW50IHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRFdmVudChldmVudElkKTtcblx0fVxuXG5cdC8qKiBUaGUgY29tbWVudHMgcmVsYXRlZCB0byB0aGUgZ2l2ZW4gcHJvY2VzcyBpbnN0YW5jZS4gKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUNvbW1lbnRzKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBDb21tZW50W10ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbCh0eXBlKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0UHJvY2Vzc0luc3RhbmNlQ29tbWVudHMocHJvY2Vzc0luc3RhbmNlSWQsIHR5cGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRQcm9jZXNzSW5zdGFuY2VDb21tZW50cyhwcm9jZXNzSW5zdGFuY2VJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIG5ldyBhdHRhY2htZW50IHRvIGEgdGFzayBhbmQvb3IgYSBwcm9jZXNzIGluc3RhbmNlIGFuZCB1c2UgYW4gaW5wdXQgc3RyZWFtIHRvIHByb3ZpZGUgdGhlIGNvbnRlbnRcblx0ICovXG5cdHB1YmxpYyBjcmVhdGVBdHRhY2htZW50KGF0dGFjaG1lbnRUeXBlOiBzdHJpbmcsIHRhc2tJZDogc3RyaW5nLCBwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBhdHRhY2htZW50TmFtZTogc3RyaW5nLCBhdHRhY2htZW50RGVzY3JpcHRpb246IHN0cmluZywgY29udGVudD86IGFueVtdLCB1cmw/OiBzdHJpbmcpOiBBdHRhY2htZW50IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodXJsKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuY3JlYXRlQXR0YWNobWVudChhdHRhY2htZW50VHlwZSwgdGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgYXR0YWNobWVudE5hbWUsIGF0dGFjaG1lbnREZXNjcmlwdGlvbiwgdXJsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuY3JlYXRlQXR0YWNobWVudChhdHRhY2htZW50VHlwZSwgdGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgYXR0YWNobWVudE5hbWUsIGF0dGFjaG1lbnREZXNjcmlwdGlvbiwgU3RyZWFtcy5jcmVhdGVCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50KSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFVwZGF0ZSB0aGUgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgYW4gYXR0YWNobWVudCAqL1xuXHRwdWJsaWMgc2F2ZUF0dGFjaG1lbnQoYXR0YWNobWVudDogQXR0YWNobWVudCk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc2F2ZUF0dGFjaG1lbnQoYXR0YWNobWVudCk7XG5cdH1cblxuXHQvKiogUmV0cmlldmUgYSBwYXJ0aWN1bGFyIGF0dGFjaG1lbnQgKi9cblx0cHVibGljIGdldEF0dGFjaG1lbnQoYXR0YWNobWVudElkOiBzdHJpbmcpOiBBdHRhY2htZW50IHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRBdHRhY2htZW50KGF0dGFjaG1lbnRJZCk7XG5cdH1cblxuXHQvKiogUmV0cmlldmUgc3RyZWFtIGNvbnRlbnQgb2YgYSBwYXJ0aWN1bGFyIGF0dGFjaG1lbnQgKi9cblx0cHVibGljIGdldEF0dGFjaG1lbnRDb250ZW50KGF0dGFjaG1lbnRJZDogc3RyaW5nKTogYW55W10ge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSB0aGlzLnRhc2tTZXJ2aWNlLmdldEF0dGFjaG1lbnRDb250ZW50KGF0dGFjaG1lbnRJZCk7XG5cdFx0Y29uc3QgYmFvcyA9IFN0cmVhbXMuY3JlYXRlQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7XG5cdFx0U3RyZWFtcy5jb3B5TGFyZ2UoY29udGVudCwgYmFvcyk7XG5cdFx0cmV0dXJuIGJhb3MuZ2V0Qnl0ZXMoKVxuXHR9O1xuXG5cdC8qKiBUaGUgbGlzdCBvZiBhdHRhY2htZW50cyBhc3NvY2lhdGVkIHRvIGEgdGFzayAqL1xuXHRwdWJsaWMgZ2V0VGFza0F0dGFjaG1lbnRzKHRhc2tJZDogc3RyaW5nKTogQXR0YWNobWVudFtdIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRUYXNrQXR0YWNobWVudHModGFza0lkKTtcblx0fVxuXG5cdC8qKiBUaGUgbGlzdCBvZiBhdHRhY2htZW50cyBhc3NvY2lhdGVkIHRvIGEgcHJvY2VzcyBpbnN0YW5jZSAqL1xuXHRwdWJsaWMgZ2V0UHJvY2Vzc0luc3RhbmNlQXR0YWNobWVudHMocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZyk6IEF0dGFjaG1lbnRbXSB7XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0UHJvY2Vzc0luc3RhbmNlQXR0YWNobWVudHMocHJvY2Vzc0luc3RhbmNlSWQpO1xuXHR9XG5cblx0LyoqIERlbGV0ZSBhbiBhdHRhY2htZW50ICovXG5cdHB1YmxpYyBkZWxldGVBdHRhY2htZW50KGF0dGFjaG1lbnRJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVBdHRhY2htZW50KGF0dGFjaG1lbnRJZCk7XG5cdH1cblxuXHQvKiogVGhlIGxpc3Qgb2Ygc3VidGFza3MgZm9yIHRoaXMgcGFyZW50IHRhc2sgKi9cblx0cHVibGljIGdldFN1YlRhc2tzKHBhcmVudFRhc2tJZDogc3RyaW5nKTogVGFza1tdIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRTdWJUYXNrcyhwYXJlbnRUYXNrSWQpO1xuXHR9XG5cblx0cHJpdmF0ZSBpc05vdE51bGwocHJvcGVydHk6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBwcm9wZXJ0eSAhPT0gbnVsbCAmJiBwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkO1xuXHR9XG59XG5cbmNsYXNzIFRhc2tEYXRhIHtcblxuXHRwcml2YXRlIGRhdGE6IGFueTtcblxuXHRjb25zdHJ1Y3RvcihkYXRhOiBhbnkpIHtcblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xuXHR9XG5cblx0cHVibGljIGdldElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmV2aXNpb24oKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLnJldmlzaW9uO1xuXHR9XG5cblx0cHVibGljIGdldE93bmVyKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5vd25lciA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0QXNzaWduZWVVcGRhdGVkQ291bnQoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFzc2lnbmVlVXBkYXRlZENvdW50O1xuXHR9XG5cblx0cHVibGljIGdldE9yaWdpbmFsQXNzaWduZWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLm9yaWdpbmFsQXNzaWduZWUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldEFzc2lnbmVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hc3NpZ25lZSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RGVsZWdhdGlvblN0YXRlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5kZWxlZ2F0aW9uU3RhdGUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFBhcmVudFRhc2tJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEucGFyZW50VGFza0lkID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5uYW1lID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRMb2NhbGl6ZWROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5sb2NhbGl6ZWROYW1lID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXREZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuZGVzY3JpcHRpb24gPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldExvY2FsaXplZERlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5sb2NhbGl6ZWREZXNjcmlwdGlvbiA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJpb3JpdHkoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLnByaW9yaXR5O1xuXHR9XG5cblx0cHVibGljIGdldENyZWF0ZVRpbWUoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5jcmVhdGVUaW1lID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXREdWVEYXRlKCk6IERhdGUgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuZHVlRGF0ZSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U3VzcGVuc2lvblN0YXRlKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5zdXNwZW5zaW9uU3RhdGUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldENhdGVnb3J5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5jYXRlZ29yeSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgaXNJZGVudGl0eUxpbmtzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pc0lkZW50aXR5TGlua3NJbml0aWFsaXplZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRFeGVjdXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuZXhlY3V0aW9uSWQgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5wcm9jZXNzSW5zdGFuY2VJZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJvY2Vzc0RlZmluaXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEucHJvY2Vzc0RlZmluaXRpb25JZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U2NvcGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuc2NvcGVJZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U3ViU2NvcGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuc3ViU2NvcGVJZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U2NvcGVUeXBlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5zY29wZVR5cGUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFNjb3BlRGVmaW5pdGlvbklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5zY29wZURlZmluaXRpb25JZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0VGFza0RlZmluaXRpb25LZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLnRhc2tEZWZpbml0aW9uS2V5ID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRGb3JtS2V5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5mb3JtS2V5ID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBpc0RlbGV0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pc0RlbGV0ZWQ7XG5cdH1cblxuXHRwdWJsaWMgaXNDYW5jZWxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmlzQ2FuY2VsZWQ7XG5cdH1cblxuXHRwdWJsaWMgaXNDb3VudEVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pc0NvdW50RW5hYmxlZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUNvdW50KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS52YXJpYWJsZUNvdW50O1xuXHR9XG5cblx0cHVibGljIGdldElkZW50aXR5TGlua0NvdW50KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pZGVudGl0eUxpbmtDb3VudDtcblx0fVxuXG5cdHB1YmxpYyBnZXRDbGFpbVRpbWUoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5jbGFpbVRpbWUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFRlbmFudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS50ZW5hbnRJZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRFdmVudE5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmV2ZW50TmFtZSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RXZlbnRIYW5kbGVySWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmV2ZW50SGFuZGxlcklkID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBpc0ZvcmNlZFVwZGF0ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmZvcmNlZFVwZGF0ZTtcblx0fVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgb25lIHRhc2sgZm9yIGEgaHVtYW4gdXNlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrIGV4dGVuZHMgVGFza0luZm8ge1xuXG5cdC8qKiBOYW1lIG9yIHRpdGxlIG9mIHRoZSB0YXNrLiAqL1xuXHRzZXROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIFNldHMgYW4gb3B0aW9uYWwgbG9jYWxpemVkIG5hbWUgZm9yIHRoZSB0YXNrLiAqL1xuXHRzZXRMb2NhbGl6ZWROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIENoYW5nZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2sgKi9cblx0c2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIFNldHMgYW4gb3B0aW9uYWwgbG9jYWxpemVkIGRlc2NyaXB0aW9uIGZvciB0aGUgdGFzay4gKi9cblx0c2V0TG9jYWxpemVkRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIFNldHMgdGhlIGluZGljYXRpb24gb2YgaG93IGltcG9ydGFudC91cmdlbnQgdGhpcyB0YXNrIGlzICovXG5cdHNldFByaW9yaXR5KHByaW9yaXR5OiBudW1iZXIpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciBpZCBvZiB0aGUgcGVyc29uIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgdGFzay5cblx0ICovXG5cdHNldE93bmVyKG93bmVyOiBzdHJpbmcpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciBpZCBvZiB0aGUgcGVyc29uIHRvIHdoaWNoIHRoaXMgdGFzayBpcyBkZWxlZ2F0ZWQuXG5cdCAqL1xuXHRzZXRBc3NpZ25lZShhc3NpZ25lZTogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogVGhlIGN1cnJlbnQge0BsaW5rIERlbGVnYXRpb25TdGF0ZX0gZm9yIHRoaXMgdGFzay4gKi9cblx0Z2V0RGVsZWdhdGlvblN0YXRlKCk6IERlbGVnYXRpb25TdGF0ZTtcblxuXHQvKiogVGhlIGN1cnJlbnQge0BsaW5rIERlbGVnYXRpb25TdGF0ZX0gZm9yIHRoaXMgdGFzay4gKi9cblx0c2V0RGVsZWdhdGlvblN0YXRlKGRlbGVnYXRpb25TdGF0ZTogRGVsZWdhdGlvblN0YXRlKTogdm9pZDtcblxuXHQvKiogQ2hhbmdlIGR1ZSBkYXRlIG9mIHRoZSB0YXNrLiAqL1xuXHRzZXREdWVEYXRlKGR1ZURhdGU6IERhdGUpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGNhdGVnb3J5IG9mIHRoZSB0YXNrLiBUaGlzIGlzIGFuIG9wdGlvbmFsIGZpZWxkIGFuZCBhbGxvd3MgdG8gJ3RhZycgdGFza3MgYXMgYmVsb25naW5nIHRvIGEgY2VydGFpbiBjYXRlZ29yeS5cblx0ICovXG5cdHNldENhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiB2b2lkO1xuXG5cdC8qKiB0aGUgcGFyZW50IHRhc2sgZm9yIHdoaWNoIHRoaXMgdGFzayBpcyBhIHN1YnRhc2sgKi9cblx0c2V0UGFyZW50VGFza0lkKHBhcmVudFRhc2tJZDogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogQ2hhbmdlIHRoZSB0ZW5hbnRJZCBvZiB0aGUgdGFzayAqL1xuXHRzZXRUZW5hbnRJZCh0ZW5hbnRJZDogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogQ2hhbmdlIHRoZSBmb3JtIGtleSBvZiB0aGUgdGFzayAqL1xuXHRzZXRGb3JtS2V5KGZvcm1LZXk6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdGFzayBpcyBzdXNwZW5kZWQgb3Igbm90LiAqL1xuXHRpc1N1c3BlbmRlZCgpOiBib29sZWFuO1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza0luZm8ge1xuXG5cdC8qKiBEQiBpZCBvZiB0aGUgdGFzay4gKi9cblx0Z2V0SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBOYW1lIG9yIHRpdGxlIG9mIHRoZSB0YXNrLlxuXHQgKi9cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIEZyZWUgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgdGFzay5cblx0ICovXG5cdGdldERlc2NyaXB0aW9uKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogSW5kaWNhdGlvbiBvZiBob3cgaW1wb3J0YW50L3VyZ2VudCB0aGlzIHRhc2sgaXNcblx0ICovXG5cdGdldFByaW9yaXR5KCk6IG51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIHRhc2suXG5cdCAqL1xuXHRnZXRPd25lcigpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIGlkIG9mIHRoZSBwZXJzb24gdG8gd2hpY2ggdGhpcyB0YXNrIGlzIGRlbGVnYXRlZC5cblx0ICovXG5cdGdldEFzc2lnbmVlKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzIGluc3RhbmNlIG9yIG51bGwgaWYgaXQgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHBhdGggb2YgZXhlY3V0aW9uIG9yIG51bGwgaWYgaXQgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0Z2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHRhc2sgZGVmaW5pdGlvbiBvciBudWxsIGlmIGl0IGlzIG5vdCByZWxhdGVkIHRvIGFueSB0YXNrIGRlZmluaXRpb24uXG5cdCAqL1xuXHRnZXRUYXNrRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzIGRlZmluaXRpb24gb3IgbnVsbCBpZiBpdCBpcyBub3QgcmVsYXRlZCB0byBhIHByb2Nlc3MuXG5cdCAqL1xuXHRnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIGEgc2NvcGUgaWRlbnRpZmllciBvciBudWxsIGlmIG5vbmUgaXMgc2V0IChlLmcuIGZvciBicG1uIHByb2Nlc3MgdGFzayBpdCBpcyBudWxsKVxuXHQgKi9cblx0Z2V0U2NvcGVJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFJlZmVyZW5jZSB0byBhIHN1YiBzY29wZSBpZGVudGlmaWVyIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQgKGUuZy4gZm9yIGJwbW4gcHJvY2VzcyB0YXNrIGl0IGlzIG51bGwpXG5cdCAqL1xuXHRnZXRTdWJTY29wZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIGEgc2NvcGUgdHlwZSBvciBudWxsIGlmIG5vbmUgaXMgc2V0IChlLmcuIGZvciBicG1uIHByb2Nlc3MgdGFzayBpdCBpcyBudWxsKVxuXHQgKi9cblx0Z2V0U2NvcGVUeXBlKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIGEgc2NvcGUgZGVmaW5pdGlvbiBpZGVudGlmaWVyIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQgKGUuZy4gZm9yIGJwbW4gcHJvY2VzcyB0YXNrIGl0IGlzIG51bGwpXG5cdCAqL1xuXHRnZXRTY29wZURlZmluaXRpb25JZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIElmIHRoaXMgdGFzayBydW5zIGluIHRoZSBjb250ZXh0IG9mIGEgY2FzZSBhbmQgc3RhZ2UsIHRoaXMgbWV0aG9kIHJldHVybnMgaXQncyBjbG9zZXN0IHBhcmVudCBzdGFnZSBpbnN0YW5jZSBpZCAodGhlIHN0YWdlIHBsYW4gaXRlbSBpbnN0YW5jZSBpZCB0byBiZVxuXHQgKiBwcmVjaXNlKS4gRXZlbiBpZiB0aGUgZGlyZWN0IHBhcmVudCBvZiB0aGUgdGFzayBpcyBhIHByb2Nlc3Mgd2hpY2ggaXRzZWxmIG1pZ2h0IGhhdmUgYmVlbiBjcmVhdGVkIG91dCBvZiBhIHByb2Nlc3MgdGFzayBvZiBhIGNhc2UsIGl0cyBzdGFnZSBpbnN0YW5jZVxuXHQgKiBpcyByZWZsZWN0ZWQgaW4gdGhlIHRhc2suXG5cdCAqXG5cdCAqIEByZXR1cm4gdGhlIHN0YWdlIGluc3RhbmNlIGlkIHRoaXMgdGFzayBiZWxvbmdzIHRvIG9yIG51bGwsIGlmIHRoaXMgdGFzayBpcyBub3QgcGFydCBvZiBhIGNhc2UgYXQgYWxsIG9yIGlzIG5vdCBhIGNoaWxkIGVsZW1lbnQgb2YgYSBzdGFnZVxuXHQgKi9cblx0Z2V0UHJvcGFnYXRlZFN0YWdlSW5zdGFuY2VJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSBzdGF0ZSBvZiB0aGlzIHRhc2tcblx0ICovXG5cdGdldFN0YXRlKCk6IHN0cmluZztcblxuXHQvKiogVGhlIGRhdGUvdGltZSB3aGVuIHRoaXMgdGFzayB3YXMgY3JlYXRlZCAqL1xuXHRnZXRDcmVhdGVUaW1lKCk6IERhdGU7XG5cblx0LyoqIFRoZSBkYXRlL3RpbWUgd2hlbiB0aGlzIHRhc2sgd2FzIHB1dCBpbiBwcm9ncmVzcyAqL1xuXHRnZXRJblByb2dyZXNzU3RhcnRUaW1lKCk6IERhdGU7XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIHJlZmVyZW5jZSB0aGF0IHB1dCB0aGlzIHRhc2sgaW4gcHJvZ3Jlc3Ncblx0ICovXG5cdGdldEluUHJvZ3Jlc3NTdGFydGVkQnkoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgY2xhaW0gdGltZSBvZiB0aGlzIHRhc2tcblx0ICovXG5cdGdldENsYWltVGltZSgpOiBEYXRlO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBjbGFpbWVkIHRoaXMgdGFza1xuXHQgKi9cblx0Z2V0Q2xhaW1lZEJ5KCk6IFN0cmluZztcblxuXHQvKipcblx0ICogVGhlIHN1c3BlbmRlZCB0aW1lIG9mIHRoaXMgdGFza1xuXHQgKi9cblx0Z2V0U3VzcGVuZGVkVGltZSgpOiBEYXRlO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdXNwZW5kZWQgdGhpcyB0YXNrXG5cdCAqL1xuXHRnZXRTdXNwZW5kZWRCeSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSBpZCBvZiB0aGUgYWN0aXZpdHkgaW4gdGhlIHByb2Nlc3MgZGVmaW5pbmcgdGhpcyB0YXNrIG9yIG51bGwgaWYgdGhpcyBpcyBub3QgcmVsYXRlZCB0byBhIHByb2Nlc3Ncblx0ICovXG5cdGdldFRhc2tEZWZpbml0aW9uS2V5KCk6IHN0cmluZztcblxuXHQvKipcblx0ICogSW4gcHJvZ3Jlc3Mgc3RhcnQgZHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRnZXRJblByb2dyZXNzU3RhcnREdWVEYXRlKCk6IERhdGU7XG5cblx0LyoqXG5cdCAqIER1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKi9cblx0Z2V0RHVlRGF0ZSgpOiBEYXRlO1xuXG5cdC8qKlxuXHQgKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIHRhc2suIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgYW5kIGFsbG93cyB0byAndGFnJyB0YXNrcyBhcyBiZWxvbmdpbmcgdG8gYSBjZXJ0YWluIGNhdGVnb3J5LlxuXHQgKi9cblx0Z2V0Q2F0ZWdvcnkoKTsgc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHRhc2sgZm9yIHdoaWNoIHRoaXMgdGFzayBpcyBhIHN1YnRhc2tcblx0ICovXG5cdGdldFBhcmVudFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSB0ZW5hbnQgaWRlbnRpZmllciBvZiB0aGlzIHRhc2tcblx0ICovXG5cdGdldFRlbmFudElkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIGZvcm0ga2V5IGZvciB0aGUgdXNlciB0YXNrXG5cdCAqL1xuXHRnZXRGb3JtS2V5KCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbG9jYWwgdGFzayB2YXJpYWJsZXMgaWYgcmVxdWVzdGVkIGluIHRoZSB0YXNrIHF1ZXJ5XG5cdCAqL1xuXHRnZXRUYXNrTG9jYWxWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgT2JqZWN0PjtcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcHJvY2VzcyB2YXJpYWJsZXMgaWYgcmVxdWVzdGVkIGluIHRoZSB0YXNrIHF1ZXJ5XG5cdCAqL1xuXHRnZXRQcm9jZXNzVmFyaWFibGVzKCk6IE1hcDxzdHJpbmcsIE9iamVjdD47XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGNhc2UgdmFyaWFibGVzIGlmIHJlcXVlc3RlZCBpbiB0aGUgdGFzayBxdWVyeVxuXHQgKi9cblx0Z2V0Q2FzZVZhcmlhYmxlcygpOiBNYXA8c3RyaW5nLCBPYmplY3Q+O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBpZGVudGl0eSBsaW5rcy5cblx0ICovXG5cdGdldElkZW50aXR5TGlua3MoKTogSWRlbnRpdHlMaW5rSW5mb1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TGlua0luZm8ge1xuXHRnZXRUeXBlKCk6IHN0cmluZztcblxuXHRnZXRVc2VySWQoKTogc3RyaW5nO1xuXG5cdGdldEdyb3VwSWQoKTogc3RyaW5nO1xuXG5cdGdldFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG5cdGdldFNjb3BlSWQoKTogc3RyaW5nO1xuXG5cdGdldFN1YlNjb3BlSWQoKTogc3RyaW5nO1xuXG5cdGdldFNjb3BlVHlwZSgpOiBzdHJpbmc7XG5cblx0Z2V0U2NvcGVEZWZpbml0aW9uSWQoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TGluayBleHRlbmRzIElkZW50aXR5TGlua0luZm8ge1xuXG5cdC8qKlxuXHQgKiBUaGUgcHJvY2VzcyBkZWZpbml0aW9uIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlkZW50aXR5IGxpbmsuXG5cdCAqL1xuXHRnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxufVxuXG5leHBvcnQgZW51bSBEZWxlZ2F0aW9uU3RhdGUge1xuXG5cdC8qKlxuXHQgKiBUaGUgb3duZXIgZGVsZWdhdGVkIHRoZSB0YXNrIGFuZCB3YW50cyB0byByZXZpZXcgdGhlIHJlc3VsdCBhZnRlciB0aGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLiBXaGVuIHRoZSBhc3NpZ25lZSBjb21wbGV0ZXMgdGhlIHRhc2ssIHRoZSB0YXNrIGlzIG1hcmtlZCBhcyB7QGxpbmsgI1JFU09MVkVEfSBhbmQgc2VudCBiYWNrXG5cdCAqIHRvIHRoZSBvd25lci4gV2hlbiB0aGF0IGhhcHBlbnMsIHRoZSBvd25lciBpcyBzZXQgYXMgdGhlIGFzc2lnbmVlIHNvIHRoYXQgdGhlIG93bmVyIGdldHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8uXG5cdCAqL1xuXHRQRU5ESU5HLFxuXG5cdC8qKlxuXHQgKiBUaGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLCB0aGUgYXNzaWduZWUgd2FzIHNldCB0byB0aGUgb3duZXIgYWdhaW4gYW5kIHRoZSBvd25lciBub3cgZmluZHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8gbGlzdCBmb3IgcmV2aWV3LiBUaGUgb3duZXIgbm93IGlzIGFibGUgdG8gY29tcGxldGUgdGhlIHRhc2suXG5cdCAqL1xuXHRSRVNPTFZFRFxufVxuXG4vKipcbiAqIFdyYXBzIHtAbGluayBUYXNrSW5mb30gdG8gdGhlIGJ1aWxkZXIuXG4gKiBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrQnVpbGRlciB7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGFzayBpbnN0YW5jZSBhY2NvcmRpbmcgdmFsdWVzIHNldCBpbiB0aGUgYnVpbGRlclxuXHQgKiBcblx0ICogQHJldHVybiB0YXNrIGluc3RhbmNlXG5cdCAqL1xuXHRjcmVhdGUoKTogVGFzaztcblxuXHQvKipcblx0ICogREIgaWQgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRpZChpZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldElkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogTmFtZSBvciB0aXRsZSBvZiB0aGUgdGFzay5cblx0ICovXG5cdG5hbWUobmFtZTogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldE5hbWUoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBGcmVlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRkZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldERlc2NyaXB0aW9uKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogSW5kaWNhdGlvbiBvZiBob3cgaW1wb3J0YW50L3VyZ2VudCB0aGlzIHRhc2sgaXNcblx0ICovXG5cdHByaW9yaXR5KHByaW9yaXR5OiBudW1iZXIpOiBUYXNrQnVpbGRlcjtcblx0Z2V0UHJpb3JpdHkoKTogbnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlcklkIG9mIHRoZSBwZXJzb24gdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyB0YXNrLlxuXHQgKi9cblx0b3duZXIob3duZXJJZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldE93bmVyKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIHVzZXJJZCBvZiB0aGUgcGVyc29uIHRvIHdoaWNoIHRoaXMgdGFzayBpcyBkZWxlZ2F0ZWQuXG5cdCAqL1xuXHRhc3NpZ25lZShhc3NpZ25lSWQ6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRBc3NpZ25lZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIENoYW5nZSBkdWUgZGF0ZSBvZiB0aGUgdGFzay5cblx0ICovXG5cdGR1ZURhdGUoZHVlRGF0ZTogRGF0ZSk6IFRhc2tCdWlsZGVyO1xuXHRnZXREdWVEYXRlKCk6IERhdGU7XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgY2F0ZWdvcnkgb2YgdGhlIHRhc2suIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgYW5kIGFsbG93cyB0byAndGFnJyB0YXNrcyBhcyBiZWxvbmdpbmcgdG8gYSBjZXJ0YWluIGNhdGVnb3J5LlxuXHQgKi9cblx0Y2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRDYXRlZ29yeSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIHRoZSBwYXJlbnQgdGFzayBmb3Igd2hpY2ggdGhpcyB0YXNrIGlzIGEgc3VidGFza1xuXHQgKi9cblx0cGFyZW50VGFza0lkKHBhcmVudFRhc2tJZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldFBhcmVudFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgdGVuYW50SWQgb2YgdGhlIHRhc2tcblx0ICovXG5cdHRlbmFudElkKHRlbmFudElkOiBzdHJpbmcpOiBUYXNrQnVpbGRlcjtcblx0Z2V0VGVuYW50SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGZvcm0ga2V5IG9mIHRoZSB0YXNrXG5cdCAqL1xuXHRmb3JtS2V5KGZvcm1LZXk6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRGb3JtS2V5KCk6IHN0cmluZztcblxuXHQvKipcblx0ICogdGFzayBkZWZpbml0aW9uIGlkIHRvIGNyZWF0ZSB0YXNrIGZyb21cblx0ICovXG5cdHRhc2tEZWZpbml0aW9uSWQodGFza0RlZmluaXRpb25JZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldFRhc2tEZWZpbml0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiB0YXNrIGRlZmluaXRpb24ga2V5IHRvIGNyZWF0ZSB0YXNrIGZyb21cblx0ICovXG5cdHRhc2tEZWZpbml0aW9uS2V5KHRhc2tEZWZpbml0aW9uS2V5OiBzdHJpbmcpOiBUYXNrQnVpbGRlcjtcblx0Z2V0VGFza0RlZmluaXRpb25LZXkoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBhZGQgaWRlbnRpdHkgbGlua3MgdG8gdGhlIHRhc2tcblx0ICovXG5cdGlkZW50aXR5TGlua3MoaWRlbnRpdHlMaW5rczogU2V0PElkZW50aXR5TGlua0luZm8+KTogVGFza0J1aWxkZXI7XG5cdGdldElkZW50aXR5TGlua3MoKTogU2V0PElkZW50aXR5TGlua0luZm8+O1xuXG5cdC8qKlxuXHQgKiBhZGQgdGFzayBzY29wZUlkXG5cdCAqL1xuXHRzY29wZUlkKHNjb3BlSWQ6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRTY29wZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQWRkIHNjb3BlIHR5cGVcblx0ICovXG5cdHNjb3BlVHlwZShzY29wZVR5cGU6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRTY29wZVR5cGUoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1JbmZvIHtcblxuXHRnZXRJZCgpOiBzdHJpbmc7XG5cblx0c2V0SWQoaWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG5cblx0c2V0TmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkO1xuXG5cdGdldERlc2NyaXB0aW9uKCk6IHN0cmluZztcblxuXHRzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZDtcblxuXHRnZXRLZXkoKTogc3RyaW5nO1xuXG5cdHNldEtleShrZXk6IHN0cmluZyk6IHZvaWQ7XG5cblx0Z2V0VmVyc2lvbigpOiBudW1iZXI7XG5cblx0c2V0VmVyc2lvbih2ZXJzaW9uOiBudW1iZXIpOiB2b2lkO1xuXG5cdGdldEZvcm1Nb2RlbCgpOiBhbnk7XG5cblx0c2V0Rm9ybU1vZGVsKGZvcm1Nb2RlbDogYW55KTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWx1ZUZpZWxkcyB7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlXG5cdCAqL1xuXHRnZXROYW1lKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgcHJvY2VzcyBpbnN0YW5jZSBpZCBvZiB0aGUgdmFyaWFibGVcblx0ICovXG5cdGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgZXhlY3V0aW9uIGlkIG9mIHRoZSB2YXJpYWJsZVxuXHQgKi9cblx0Z2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHRoZSBzY29wZSBpZCBvZiB0aGUgdmFyaWFibGVcblx0ICovXG5cdGdldFNjb3BlSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHRoZSBzdWIgc2NvcGUgaWQgb2YgdGhlIHZhcmlhYmxlXG5cdCAqL1xuXHRnZXRTdWJTY29wZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgc2NvcGUgdHlwZSBvZiB0aGUgdmFyaWFibGVcblx0ICovXG5cdGdldFNjb3BlVHlwZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIHRhc2sgaWQgb2YgdGhlIHZhcmlhYmxlXG5cdCAqL1xuXHRnZXRUYXNrSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHRoZSBmaXJzdCB0ZXh0IHZhbHVlLCBpZiBhbnksIG9yIG51bGwuXG5cdCAqL1xuXHRnZXRUZXh0VmFsdWUoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBmaXJzdCB0ZXh0IHZhbHVlLiBBIHZhbHVlIG9mIG51bGwgaXMgYWxsb3dlZC5cblx0ICovXG5cdHNldFRleHRWYWx1ZSh0ZXh0VmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIHNlY29uZCB0ZXh0IHZhbHVlLCBpZiBhbnksIG9yIG51bGwuXG5cdCAqL1xuXHRnZXRUZXh0VmFsdWUyKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogU2V0cyBzZWNvbmQgdGV4dCB2YWx1ZS4gQSB2YWx1ZSBvZiBudWxsIGlzIGFsbG93ZWQuXG5cdCAqL1xuXHRzZXRUZXh0VmFsdWUyKHRleHRWYWx1ZTI6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIGxvbmcgdmFsdWUsIGlmIGFueSwgb3IgbnVsbC5cblx0ICovXG5cdGdldExvbmdWYWx1ZSgpOiBudW1iZXI7XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGxvbmcgdmFsdWUuIEEgdmFsdWUgb2YgbnVsbCBpcyBhbGxvd2VkLlxuXHQgKi9cblx0c2V0TG9uZ1ZhbHVlKGxvbmdWYWx1ZTogbnVtYmVyKTogdm9pZDtcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgZG91YmxlIHZhbHVlLCBpZiBhbnksIG9yIG51bGwuXG5cdCAqL1xuXHRnZXREb3VibGVWYWx1ZSgpOiBudW1iZXI7XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGRvdWJsZSB2YWx1ZS4gQSB2YWx1ZSBvZiBudWxsIGlzIGFsbG93ZWQuXG5cdCAqL1xuXHRzZXREb3VibGVWYWx1ZShkb3VibGVWYWx1ZTogbnVtYmVyKTogdm9pZDtcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgYnl0ZSBhcnJheSB2YWx1ZSwgaWYgYW55LCBvciBudWxsLlxuXHQgKi9cblx0Z2V0Qnl0ZXMoKTogYW55W107XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJ5dGUgYXJyYXkgdmFsdWUuIEEgdmFsdWUgb2YgbnVsbCBpcyBhbGxvd2VkLlxuXHQgKi9cblx0c2V0Qnl0ZXMoYnl0ZXM6IGFueVtdKTogdm9pZDtcblxuXHRnZXRDYWNoZWRWYWx1ZSgpOiBhbnk7XG5cblx0c2V0Q2FjaGVkVmFsdWUoY2FjaGVkVmFsdWU6IGFueSk6IHZvaWQ7XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYXJpYWJsZUluc3RhbmNlIGV4dGVuZHMgVmFsdWVGaWVsZHMge1xuXG5cdGdldElkKCk6IHN0cmluZztcblxuXHRzZXRJZChpZDogc3RyaW5nKTogdm9pZDtcblxuXHRzZXROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0RXhlY3V0aW9uSWQoZXhlY3V0aW9uSWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0UHJvY2Vzc0luc3RhbmNlSWQocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0UHJvY2Vzc0RlZmluaXRpb25JZChwcm9jZXNzRGVmaW5pdGlvbklkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdGdldFByb2Nlc3NEZWZpbml0aW9uSWQoKTogc3RyaW5nO1xuXG5cdGdldFZhbHVlKCk6IGFueTtcblxuXHRzZXRWYWx1ZSh2YWx1ZTogYW55KTogdm9pZDtcblxuXHRnZXRUeXBlTmFtZSgpOiBzdHJpbmc7XG5cblx0c2V0VHlwZU5hbWUodHlwZU5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0aXNSZWFkT25seSgpOiBib29sZWFuO1xuXG5cdHNldFRhc2tJZCh0YXNrSWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0U2NvcGVJZChzY29wZUlkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdHNldFN1YlNjb3BlSWQoc3ViU2NvcGVJZDogc3RyaW5nKTogdm9pZDtcblxuXHRzZXRTY29wZVR5cGUoc2NvcGVUeXBlOiBzdHJpbmcpOiB2b2lkO1xuXG5cdHNldFNjb3BlRGVmaW5pdGlvbklkKHNjb3BlRGVmaW5pdGlvbklkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdGdldFNjb3BlRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxuXHRnZXRNZXRhSW5mbygpOiBzdHJpbmc7XG5cblx0c2V0TWV0YUluZm8obWV0YUluZm86IHN0cmluZyk6IHZvaWQ7XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhT2JqZWN0IHtcblxuXHQvKipcblx0ICogVGhlIHVuaXF1ZSBpZCBvZiB0aGlzIERhdGEgT2JqZWN0LlxuXHQgKi9cblx0Z2V0SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgLyoqXG5cdCAqIFRoZSBpZCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0aGF0IHRoaXMgRGF0YSBPYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKi9cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgaWQgb2YgdGhlIGV4ZWN1dGlvbiBpbiB3aGljaCB0aGlzIERhdGEgT2JqZWN0IHJlc2lkZXMuIEEgRGF0YU9iamVjdCBvbmx5IHJlc2lkZXMgb24gYSBwcm9jZXNzIGluc3RhbmNlXG5cdCAqIGV4ZWN1dGlvbiBvciBhIHN1YnByb2Nlc3MgZXhlY3V0aW9uLlxuXHQgKi9cblx0Z2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBOYW1lIG9mIHRoZSBEYXRhT2JqZWN0LlxuXHQgKi9cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIExvY2FsaXplZCBOYW1lIG9mIHRoZSBEYXRhT2JqZWN0LlxuXHQgKi9cblx0Z2V0TG9jYWxpemVkTmFtZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIERlc2NyaXB0aW9uIG9mIHRoZSBEYXRhT2JqZWN0LlxuXHQgKi9cblx0Z2V0RGVzY3JpcHRpb24oKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBWYWx1ZSBvZiB0aGUgRGF0YU9iamVjdC5cblx0ICovXG5cdGdldFZhbHVlKCk6IGFueTtcblxuXHQvKipcblx0ICogVHlwZSBvZiB0aGUgRGF0YU9iamVjdC5cblx0ICovXG5cdGdldFR5cGUoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgaWQgb2YgdGhlIGZsb3cgZWxlbWVudCBpbiB0aGUgcHJvY2VzcyBkZWZpbmluZyB0aGlzIGRhdGEgb2JqZWN0LlxuXHQgKi9cblx0Z2V0RGF0YU9iamVjdERlZmluaXRpb25LZXkoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1lbnQge1xuXG5cdC8qKiB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjb21tZW50ICovXG5cdGdldElkKCk6IHN0cmluZztcblxuXHQvKiogcmVmZXJlbmNlIHRvIHRoZSB1c2VyIHRoYXQgbWFkZSB0aGUgY29tbWVudCAqL1xuXHRnZXRVc2VySWQoKTogc3RyaW5nO1xuXG5cdHNldFVzZXJJZCh1c2VySWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0Z2V0VGltZSgpOiBEYXRlO1xuXG5cdHNldFRpbWUodGltZTogRGF0ZSk7XG5cblx0LyoqIHJlZmVyZW5jZSB0byB0aGUgdGFzayBvbiB3aGljaCB0aGlzIGNvbW1lbnQgd2FzIG1hZGUgKi9cblx0Z2V0VGFza0lkKCk6IHN0cmluZztcblxuXHRzZXRUYXNrSWQodGFza0lkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHByb2Nlc3MgaW5zdGFuY2Ugb24gd2hpY2ggdGhpcyBjb21tZW50IHdhcyBtYWRlICovXG5cdGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZztcblxuXHRzZXRQcm9jZXNzSW5zdGFuY2VJZChwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogcmVmZXJlbmNlIHRvIHRoZSB0eXBlIGdpdmVuIHRvIHRoZSBjb21tZW50ICovXG5cdGdldFR5cGUoKTogc3RyaW5nO1xuXG5cdHNldFR5cGUodHlwZTogc3RyaW5nKTogdm9pZDtcblxuXHQvKipcblx0ICogdGhlIGZ1bGwgY29tbWVudCBtZXNzYWdlIHRoZSB1c2VyIGhhZCByZWxhdGVkIHRvIHRoZSB0YXNrIGFuZC9vciBwcm9jZXNzIGluc3RhbmNlXG5cdCAqIFxuXHQgKiBAc2VlIFRhc2tTZXJ2aWNlI2dldFRhc2tDb21tZW50cyhTdHJpbmcpXG5cdCAqL1xuXHRnZXRGdWxsTWVzc2FnZSgpOiBzdHJpbmc7XG5cblx0c2V0RnVsbE1lc3NhZ2UoZnVsbE1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza0V2ZW50IHtcblxuXHQvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQgKi9cblx0Z2V0SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhlIHR5cGUgb2Ygb2YgYWN0aW9uIGFuZCBhbHNvIGluZGljYXRlcyB0aGUgbWVhbmluZyBvZiB0aGUgcGFydHMgYXMgZXhwb3NlZCBpbiB7QGxpbmsgI2dldE1lc3NhZ2VQYXJ0cygpfVxuXHQgKi9cblx0Z2V0QWN0aW9uKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIG1lYW5pbmcgb2YgdGhlIG1lc3NhZ2UgcGFydHMgaXMgZGVmaW5lZCBieSB0aGUgYWN0aW9uIGFzIHlvdSBjYW4gZmluZCBpbiB7QGxpbmsgI2dldEFjdGlvbigpfVxuXHQgKi9cblx0Z2V0TWVzc2FnZVBhcnRzKCk6IHN0cmluZ1tdO1xuXG5cdC8qKlxuXHQgKiBUaGUgbWVzc2FnZSB0aGF0IGNhbiBiZSB1c2VkIGluIGNhc2UgdGhpcyBhY3Rpb24gb25seSBoYXMgYSBzaW5nbGUgbWVzc2FnZSBwYXJ0LlxuXHQgKi9cblx0Z2V0TWVzc2FnZSgpOiBzdHJpbmc7XG5cblx0LyoqIHJlZmVyZW5jZSB0byB0aGUgdXNlciB0aGF0IG1hZGUgdGhlIGNvbW1lbnQgKi9cblx0Z2V0VXNlcklkKCk6IHN0cmluZztcblxuXHQvKiogdGltZSBhbmQgZGF0ZSB3aGVuIHRoZSB1c2VyIG1hZGUgdGhlIGNvbW1lbnQgKi9cblx0Z2V0VGltZSgpOiBEYXRlO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHRhc2sgb24gd2hpY2ggdGhpcyBjb21tZW50IHdhcyBtYWRlICovXG5cdGdldFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0LyoqIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VzcyBpbnN0YW5jZSBvbiB3aGljaCB0aGlzIGNvbW1lbnQgd2FzIG1hZGUgKi9cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG5cblx0LyoqIHVuaXF1ZSBpZCBmb3IgdGhpcyBhdHRhY2htZW50ICovXG5cdGdldElkKCk6IHN0cmluZztcblxuXHQvKiogZnJlZSB1c2VyIGRlZmluZWQgc2hvcnQgKG1heCAyNTUgY2hhcnMpIG5hbWUgZm9yIHRoaXMgYXR0YWNobWVudCAqL1xuXHRnZXROYW1lKCk6IHN0cmluZztcblxuXHQvKiogZnJlZSB1c2VyIGRlZmluZWQgc2hvcnQgKG1heCAyNTUgY2hhcnMpIG5hbWUgZm9yIHRoaXMgYXR0YWNobWVudCAqL1xuXHRzZXROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIGxvbmcgKG1heCAyNTUgY2hhcnMpIGV4cGxhbmF0aW9uIHdoYXQgdGhpcyBhdHRhY2htZW50IGlzIGFib3V0IGluIGNvbnRleHQgb2YgdGhlIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UgaXQncyBsaW5rZWQgdG8uXG5cdCAqL1xuXHRnZXREZXNjcmlwdGlvbigpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIGxvbmcgKG1heCAyNTUgY2hhcnMpIGV4cGxhbmF0aW9uIHdoYXQgdGhpcyBhdHRhY2htZW50IGlzIGFib3V0IGluIGNvbnRleHQgb2YgdGhlIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UgaXQncyBsaW5rZWQgdG8uXG5cdCAqL1xuXHRzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZDtcblxuXHQvKipcblx0ICogaW5kaWNhdGlvbiBvZiB0aGUgdHlwZSBvZiBjb250ZW50IHRoYXQgdGhpcyBhdHRhY2htZW50IHJlZmVycyB0by4gQ2FuIGJlIG1pbWUgdHlwZSBvciBhbnkgb3RoZXIgaW5kaWNhdGlvbi5cblx0ICovXG5cdGdldFR5cGUoKTogc3RyaW5nO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHRhc2sgdG8gd2hpY2ggdGhpcyBhdHRhY2htZW50IGlzIGFzc29jaWF0ZWQuICovXG5cblx0Z2V0VGFza0lkKCk6IHN0cmluZztcblx0LyoqXG5cdCAqIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byB3aGljaCB0aGlzIGF0dGFjaG1lbnQgaXMgYXNzb2NpYXRlZC5cblx0ICovXG5cdGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogdGhlIHJlbW90ZSBVUkwgaW4gY2FzZSB0aGlzIGlzIHJlbW90ZSBjb250ZW50LiBJZiB0aGUgYXR0YWNobWVudCBjb250ZW50IHdhcyB7QGxpbmsgVGFza1NlcnZpY2UjY3JlYXRlQXR0YWNobWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgamF2YS5pby5JbnB1dFN0cmVhbSkgdXBsb2FkZWQgd2l0aCBhblxuXHQgKiBpbnB1dCBzdHJlYW19LCB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBhbmQgdGhlIGNvbnRlbnQgY2FuIGJlIGZldGNoZWQgd2l0aCB7QGxpbmsgVGFza1NlcnZpY2UjZ2V0QXR0YWNobWVudENvbnRlbnQoU3RyaW5nKX0uXG5cdCAqL1xuXHRnZXRVcmwoKTogc3RyaW5nO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHVzZXIgd2hvIGNyZWF0ZWQgdGhpcyBhdHRhY2htZW50LiAqL1xuXHRnZXRVc2VySWQoKTogc3RyaW5nO1xuXG5cdC8qKiB0aW1lc3RhbXAgd2hlbiB0aGlzIGF0dGFjaG1lbnQgd2FzIGNyZWF0ZWQgKi9cblx0Z2V0VGltZSgpOiBEYXRlO1xuXG5cdC8qKiB0aW1lc3RhbXAgd2hlbiB0aGlzIGF0dGFjaG1lbnQgd2FzIGNyZWF0ZWQgKi9cblx0c2V0VGltZSh0aW1lOiBEYXRlKTogdm9pZDtcblxuXHQvKiogdGhlIGlkIG9mIHRoZSBieXRlIGFycmF5IGVudGl0eSBzdG9yaW5nIHRoZSBjb250ZW50ICovXG5cdGdldENvbnRlbnRJZCgpOiBzdHJpbmc7XG5cbn1cblxuZXhwb3J0IGVudW0gTnVsbEhhbmRsaW5nT25PcmRlciB7XG5cdE5VTExTX0ZJUlNULCBOVUxMU19MQVNUXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlQcm9wZXJ0eSB7XG5cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnk8VCwgVT4ge1xuXG5cdC8qKlxuXHQgKiBPcmRlciB0aGUgcmVzdWx0cyBhc2NlbmRpbmcgb24gdGhlIGdpdmVuIHByb3BlcnR5IGFzIGRlZmluZWQgaW4gdGhpcyBjbGFzcyAobmVlZHMgdG8gY29tZSBhZnRlciBhIGNhbGwgdG8gb25lIG9mIHRoZSBvcmRlckJ5WHh4eCBtZXRob2RzKS5cblx0ICovXG5cdGFzYygpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciB0aGUgcmVzdWx0cyBkZXNjZW5kaW5nIG9uIHRoZSBnaXZlbiBwcm9wZXJ0eSBhcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MgKG5lZWRzIHRvIGNvbWUgYWZ0ZXIgYSBjYWxsIHRvIG9uZSBvZiB0aGUgb3JkZXJCeVh4eHggbWV0aG9kcykuXG5cdCAqL1xuXHRkZXNjKCk6IFQ7XG5cblx0b3JkZXJCeShwcm9wZXJ0eTogUXVlcnlQcm9wZXJ0eSk6IFQ7XG5cblx0b3JkZXJCeShwcm9wZXJ0eTogUXVlcnlQcm9wZXJ0eSwgbnVsbEhhbmRsaW5nT25PcmRlcjogTnVsbEhhbmRsaW5nT25PcmRlcik6IFQ7XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlc3VsdHNcblx0ICovXG5cdGNvdW50KCk6IG51bWJlcjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgZW50aXR5IG9yIG51bGwgaWYgbm8gZW50aXR5IG1hdGNoZXMgdGhlIHF1ZXJ5IGNyaXRlcmlhLlxuXHQgKlxuXHQgKiBAdGhyb3dzIG9yZy5mbG93YWJsZS5jb21tb24uZW5naW5lLmFwaS5GbG93YWJsZUV4Y2VwdGlvbiB3aGVuIHRoZSBxdWVyeSByZXN1bHRzIGluIG1vcmUgdGhhbiBvbmUgZW50aXRpZXMuXG5cdCAqL1xuXHRzaW5nbGVSZXN1bHQoKTogVTtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCBnZXQgYSBsaXN0IG9mIGVudGl0aWVzIGFzIHRoZSByZXN1bHQuXG5cdCAqL1xuXHRsaXN0KCk6IFVbXTtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCBnZXQgYSBsaXN0IG9mIGVudGl0aWVzIGFzIHRoZSByZXN1bHQuXG5cdCAqL1xuXHRsaXN0UGFnZShmaXJzdFJlc3VsdDogbnVtYmVyLCBtYXhSZXN1bHRzOiBudW1iZXIpOiBVW107XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBUYXNrSW5mb1F1ZXJ5PFQsIFYgZXh0ZW5kcyBUYXNrSW5mbz4gZXh0ZW5kcyBRdWVyeTxULCBWPiB7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIHRhc2sgaWQgKGluIHByYWN0aWNlLCB0aGVyZSB3aWxsIGJlIG1heGltdW0gb25lIG9mIHRoaXMga2luZClcblx0ICovXG5cdHRhc2tJZCh0YXNrSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYW4gaWQgdGhhdCBpcyBpbiB0aGUgZ2l2ZW4gbGlzdFxuXHQgKlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIFdoZW4gcGFzc2VkIGlkIGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKi9cblx0dGFza0lkcyh0YXNrSWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIG5hbWUgKi9cblx0dGFza05hbWUobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIG5hbWUgdGhhdCBpcyBpbiB0aGUgZ2l2ZW4gbGlzdFxuXHQgKiBcblx0ICogQHRocm93cyBGbG93YWJsZUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICBXaGVuIHBhc3NlZCBuYW1lIGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKi9cblx0dGFza05hbWVJbihuYW1lTGlzdDogc3RyaW5nW10pOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGEgbmFtZSB0aGF0IGlzIGluIHRoZSBnaXZlbiBsaXN0XG5cdCAqIFxuXHQgKiBUaGlzIG1ldGhvZCwgdW5saWtlIHRoZSB7QGxpbmsgI3Rhc2tOYW1lSW4oQ29sbGVjdGlvbil9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlcnMgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZSBxdWVyeSBpcyBleGVjdXRlZC5cblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgV2hlbiBwYXNzZWQgbmFtZSBsaXN0IGlzIGVtcHR5IG9yIDxjb2RlPm51bGw8L2NvZGU+IG9yIGNvbnRhaW5zIDxjb2RlPm51bGwgU3RyaW5nPC9jb2RlPi5cblx0ICovXG5cdHRhc2tOYW1lSW5JZ25vcmVDYXNlKG5hbWVMaXN0OiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBuYW1lIG1hdGNoaW5nIHRoZSBwYXJhbWV0ZXIuIFRoZSBzeW50YXggaXMgdGhhdCBvZiBTUUw6IGZvciBleGFtcGxlIHVzYWdlOiBuYW1lTGlrZSgldGVzdCUpXG5cdCAqL1xuXHR0YXNrTmFtZUxpa2UobmFtZUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBuYW1lIG1hdGNoaW5nIHRoZSBwYXJhbWV0ZXIuIFRoZSBzeW50YXggaXMgdGhhdCBvZiBTUUw6IGZvciBleGFtcGxlIHVzYWdlOiBuYW1lTGlrZSgldGVzdCUpXG5cdCAqIFxuXHQgKiBUaGlzIG1ldGhvZCwgdW5saWtlIHRoZSB7QGxpbmsgI3Rhc2tOYW1lTGlrZShTdHJpbmcpfSBtZXRob2Qgd2lsbCBub3QgdGFrZSBpbiBhY2NvdW50IHRoZSB1cHBlci9sb3dlciBjYXNlOiBib3RoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZSBxdWVyeSBpc1xuXHQgKiBleGVjdXRlZC5cblx0ICovXG5cdHRhc2tOYW1lTGlrZUlnbm9yZUNhc2UobmFtZUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0aW9uLiAqL1xuXHR0YXNrRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBkZXNjcmlwdGlvbiBtYXRjaGluZyB0aGUgcGFyYW1ldGVyIC4gVGhlIHN5bnRheCBpcyB0aGF0IG9mIFNRTDogZm9yIGV4YW1wbGUgdXNhZ2U6IGRlc2NyaXB0aW9uTGlrZSgldGVzdCUpXG5cdCAqL1xuXHR0YXNrRGVzY3JpcHRpb25MaWtlKGRlc2NyaXB0aW9uTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIGRlc2NyaXB0aW9uIG1hdGNoaW5nIHRoZSBwYXJhbWV0ZXIgLiBUaGUgc3ludGF4IGlzIHRoYXQgb2YgU1FMOiBmb3IgZXhhbXBsZSB1c2FnZTogZGVzY3JpcHRpb25MaWtlKCV0ZXN0JSlcblx0ICogXG5cdCAqIFRoaXMgbWV0aG9kLCB1bmxpa2UgdGhlIHtAbGluayAjdGFza0Rlc2NyaXB0aW9uTGlrZShTdHJpbmcpfSBtZXRob2Qgd2lsbCBub3QgdGFrZSBpbiBhY2NvdW50IHRoZSB1cHBlci9sb3dlciBjYXNlOiBib3RoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZSBxdWVyeSBpc1xuXHQgKiBleGVjdXRlZC5cblx0ICovXG5cdHRhc2tEZXNjcmlwdGlvbkxpa2VJZ25vcmVDYXNlKGRlc2NyaXB0aW9uTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2l0aCB0aGUgZ2l2ZW4gcHJpb3JpdHkuICovXG5cdHRhc2tQcmlvcml0eShwcmlvcml0eTogbnVtYmVyKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2l0aCB0aGUgZ2l2ZW4gcHJpb3JpdHkgb3IgaGlnaGVyLiAqL1xuXHR0YXNrTWluUHJpb3JpdHkobWluUHJpb3JpdHk6IG51bWJlcik6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIHByaW9yaXR5IG9yIGxvd2VyLiAqL1xuXHR0YXNrTWF4UHJpb3JpdHkobWF4UHJpb3JpdHk6IG51bWJlcik6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBhc3NpZ25lZCB0byB0aGUgZ2l2ZW4gdXNlci4gKi9cblx0dGFza0Fzc2lnbmVlKGFzc2lnbmVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCB3ZXJlIGxhc3QgYXNzaWduZWQgdG8gYW4gYXNzaWduZWUgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBzeW50YXggdGhhdCBzaG91bGQgYmUgdXNlZCBpcyB0aGUgc2FtZSBhcyBpbiBTUUwsIGVnLiAldGVzdCUuXG5cdCAqL1xuXHR0YXNrQXNzaWduZWVMaWtlKGFzc2lnbmVlTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggd2VyZSBsYXN0IGFzc2lnbmVkIHRvIGFuIGFzc2lnbmVlIGxpa2UgdGhlIGdpdmVuIHZhbHVlLiBUaGUgc3ludGF4IHRoYXQgc2hvdWxkIGJlIHVzZWQgaXMgdGhlIHNhbWUgYXMgaW4gU1FMLCBlZy4gJXRlc3QlLlxuXHQgKiBcblx0ICogVGhpcyBtZXRob2QsIHVubGlrZSB0aGUge0BsaW5rICN0YXNrQXNzaWduZWVMaWtlKFN0cmluZyl9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlciBhcyB0aGUgY29sdW1uIHZhbHVlIGFyZSBsb3dlcmNhc2VkIHdoZW4gdGhlIHF1ZXJ5IGlzXG5cdCAqIGV4ZWN1dGVkLlxuXHQgKi9cblx0dGFza0Fzc2lnbmVlTGlrZUlnbm9yZUNhc2UoYXNzaWduZWVMaWtlSWdub3JlQ2FzZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggZG9uJ3QgaGF2ZSBhbiBhc3NpZ25lZS4gKi9cblx0dGFza1VuYXNzaWduZWQoKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIGFzc2lnbmVkIHRvIGFueSB1c2VyICovXG5cdHRhc2tBc3NpZ25lZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGFuIGFzc2lnbmVlIHRoYXQgaXMgaW4gdGhlIGdpdmVuIGxpc3Rcblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgV2hlbiBwYXNzZWQgbmFtZSBsaXN0IGlzIGVtcHR5IG9yIDxjb2RlPm51bGw8L2NvZGU+IG9yIGNvbnRhaW5zIDxjb2RlPm51bGwgU3RyaW5nPC9jb2RlPi5cblx0ICovXG5cdHRhc2tBc3NpZ25lZUlkcyhhc3NpZ25lZUxpc3RJZHM6IHN0cmluZ1tdKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZSBnaXZlbiB1c2VyIGlzIHRoZSBvd25lci4gKi9cblx0dGFza093bmVyKG93bmVyOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCB3ZXJlIGxhc3QgYXNzaWduZWQgdG8gYW4gb3duZXIgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBzeW50YXggdGhhdCBzaG91bGQgYmUgdXNlZCBpcyB0aGUgc2FtZSBhcyBpbiBTUUwsIGVnLiAldGVzdCUuXG5cdCAqL1xuXHR0YXNrT3duZXJMaWtlKG93bmVyTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggd2VyZSBsYXN0IGFzc2lnbmVkIHRvIGFuIG93bmVyIGxpa2UgdGhlIGdpdmVuIHZhbHVlLiBUaGUgc3ludGF4IHRoYXQgc2hvdWxkIGJlIHVzZWQgaXMgdGhlIHNhbWUgYXMgaW4gU1FMLCBlZy4gJXRlc3QlLlxuXHQgKiBcblx0ICogVGhpcyBtZXRob2QsIHVubGlrZSB0aGUge0BsaW5rICN0YXNrT3duZXJMaWtlKFN0cmluZyl9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlciBhcyB0aGUgY29sdW1uIHZhbHVlIGFyZSBsb3dlcmNhc2VkIHdoZW4gdGhlIHF1ZXJ5IGlzXG5cdCAqIGV4ZWN1dGVkLlxuXHQgKi9cblx0dGFza093bmVyTGlrZUlnbm9yZUNhc2Uob3duZXJMaWtlSWdub3JlQ2FzZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZSBnaXZlbiB1c2VyIGlzIGEgY2FuZGlkYXRlLiAqL1xuXHR0YXNrQ2FuZGlkYXRlVXNlcihjYW5kaWRhdGVVc2VyOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3Igd2hpY2ggdGhlcmUgZXhpc3QgYW4ge0BsaW5rIElkZW50aXR5TGlua30gd2l0aCB0aGUgZ2l2ZW4gdXNlciwgaW5jbHVkaW5nIHRhc2tzIHdoaWNoIGhhdmUgYmVlbiBhc3NpZ25lZCB0byB0aGUgZ2l2ZW4gdXNlciAoYXNzaWduZWUpIG9yIG93bmVkIGJ5IHRoZSBnaXZlbiB1c2VyIChvd25lcikuXG5cdCAqL1xuXHR0YXNrSW52b2x2ZWRVc2VyKGludm9sdmVkVXNlcjogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZXJlIGV4aXN0IGFuIHtAbGluayBJZGVudGl0eUxpbmt9IHdpdGggdGhlIGdpdmVuIEdyb3Vwcy5cblx0ICovXG5cdHRhc2tJbnZvbHZlZEdyb3VwcyhpbnZvbHZlZEdyb3VwOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIEFsbG93cyB0byBzZWxlY3QgYSB0YXNrIHVzaW5nIHtAbGluayAjdGFza0NhbmRpZGF0ZUdyb3VwKFN0cmluZyl9IHtAbGluayAjdGFza0NhbmRpZGF0ZUdyb3VwSW4oQ29sbGVjdGlvbil9IG9yIHtAbGluayAjdGFza0NhbmRpZGF0ZVVzZXIoU3RyaW5nKX0gYnV0IGlnbm9yZSB0aGUgYXNzaWduZWUgdmFsdWUgaW5zdGVhZCBvZiBxdWVyeWluZyBmb3IgYW4gZW1wdHkgYXNzaWduZWUuXG5cdCAqL1xuXHRpZ25vcmVBc3NpZ25lZVZhbHVlKCk6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB3aGljaCB1c2VycyBpbiB0aGUgZ2l2ZW4gZ3JvdXAgYXJlIGNhbmRpZGF0ZXMuICovXG5cdHRhc2tDYW5kaWRhdGVHcm91cChjYW5kaWRhdGVHcm91cDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZSAnY2FuZGlkYXRlR3JvdXAnIGlzIG9uZSBvZiB0aGUgZ2l2ZW4gZ3JvdXBzLlxuXHQgKiBcblx0ICogQHRocm93cyBGbG93YWJsZUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICBXaGVuIHF1ZXJ5IGlzIGV4ZWN1dGVkIGFuZCB7QGxpbmsgI3Rhc2tDYW5kaWRhdGVHcm91cChTdHJpbmcpfSBvciB7QGxpbmsgI3Rhc2tDYW5kaWRhdGVVc2VyKFN0cmluZyl9IGhhcyBiZWVuIGV4ZWN1dGVkIG9uIHRoZSBxdWVyeSBpbnN0YW5jZS4gV2hlbiBwYXNzZWQgZ3JvdXAgbGlzdCBpcyBlbXB0eSBvclxuXHQgKiAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi5cblx0ICovXG5cdHRhc2tDYW5kaWRhdGVHcm91cEluKGNhbmRpZGF0ZUdyb3Vwczogc3RyaW5nW10pOiBUXG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gdGVuYW50IGlkLlxuXHQgKi9cblx0dGFza1RlbmFudElkKHRlbmFudElkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGEgdGVuYW50IGlkIGxpa2UgdGhlIGdpdmVuIG9uZS5cblx0ICovXG5cdHRhc2tUZW5hbnRJZExpa2UodGVuYW50SWRMaWtlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGRvIG5vdCBoYXZlIGEgdGVuYW50IGlkLlxuXHQgKi9cblx0dGFza1dpdGhvdXRUZW5hbnRJZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3IgdGhlIGdpdmVuIHByb2Nlc3MgaW5zdGFuY2UgaWQuXG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VJZChwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGlkcy5cblx0ICovXG5cdHByb2Nlc3NJbnN0YW5jZUlkSW4ocHJvY2Vzc0luc3RhbmNlSWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGhvdXQgYSBwcm9jZXNzIGluc3RhbmNlIGlkLlxuXHQgKi9cblx0d2l0aG91dFByb2Nlc3NJbnN0YW5jZUlkKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gYnVzaW5lc3Mga2V5XG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleShwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIGJ1c2luZXNzIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSBUaGUgc3ludGF4IGlzIHRoYXQgb2YgU1FMOiBmb3IgZXhhbXBsZSB1c2FnZTogcHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NLZXlMaWtlKFwiJXRlc3QlXCIpLlxuXHQgKi9cblx0cHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NLZXlMaWtlKHByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5TGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIGJ1c2luZXNzIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSBUaGUgc3ludGF4IGlzIHRoYXQgb2YgU1FMOiBmb3IgZXhhbXBsZSB1c2FnZTogcHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NLZXlMaWtlKFwiJXRlc3QlXCIpLlxuXHQgKiBcblx0ICogVGhpcyBtZXRob2QsIHVubGlrZSB0aGUge0BsaW5rICNwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleUxpa2UoU3RyaW5nKX0gbWV0aG9kIHdpbGwgbm90IHRha2UgaW4gYWNjb3VudCB0aGUgdXBwZXIvbG93ZXIgY2FzZTogYm90aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGFzIHRoZSBjb2x1bW4gdmFsdWUgYXJlIGxvd2VyY2FzZWQgd2hlblxuXHQgKiB0aGUgcXVlcnkgaXMgZXhlY3V0ZWQuXG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleUxpa2VJZ25vcmVDYXNlKHByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5TGlrZUlnbm9yZUNhc2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gZXhlY3V0aW9uLlxuXHQgKi9cblx0ZXhlY3V0aW9uSWQoZXhlY3V0aW9uSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gY2FzZSBpbnN0YW5jZS5cblx0ICovXG5cdGNhc2VJbnN0YW5jZUlkKGNhc2VJbnN0YW5jZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3IgdGhlIGdpdmVuIGNhc2UgZGVmaW5pdGlvbi5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uSWQoY2FzZURlZmluaXRpb25JZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBjYXNlIGluc3RhbmNlIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gY2FzZSBkZWZpbml0aW9uIGtleS5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uS2V5KGNhc2VEZWZpbml0aW9uS2V5OiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIGNhc2UgaW5zdGFuY2Ugd2hpY2ggaGFzIGEgY2FzZSBkZWZpbml0aW9uIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIHN5bnRheCB0aGF0IHNob3VsZCBiZSB1c2VkIGlzIHRoZSBzYW1lIGFzIGluIFNRTCwgZWcuICV0ZXN0JS5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uS2V5TGlrZShjYXNlRGVmaW5pdGlvbktleUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgY2FzZSBpbnN0YW5jZSB3aGljaCBoYXMgYSBjYXNlIGRlZmluaXRpb24ga2V5IGxpa2UgdGhlIGdpdmVuIHZhbHVlLiBUaGUgc3ludGF4IHRoYXQgc2hvdWxkIGJlIHVzZWQgaXMgdGhlIHNhbWUgYXMgaW4gU1FMLCBlZy4gJXRlc3QlLlxuXHQgKlxuXHQgKiBUaGlzIG1ldGhvZCwgdW5saWtlIHRoZSB7QGxpbmsgI2Nhc2VEZWZpbml0aW9uS2V5TGlrZShTdHJpbmcpfSBtZXRob2Qgd2lsbCBub3QgdGFrZSBpbiBhY2NvdW50IHRoZSB1cHBlci9sb3dlciBjYXNlOiBib3RoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZVxuXHQgKiBxdWVyeSBpcyBleGVjdXRlZC5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uS2V5TGlrZUlnbm9yZUNhc2UoY2FzZURlZmluaXRpb25LZXlMaWtlSWdub3JlQ2FzZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3MgdGhhdCBoYXZlIGEgY2FzZSBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUga2V5IGlzIHByZXNlbnQgaW4gdGhlIGdpdmVuIGxpc3QgKiovXG5cdGNhc2VEZWZpbml0aW9uS2V5SW4oY2FzZURlZmluaXRpb25LZXlzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gcGxhbiBpdGVtIGluc3RhbmNlLiBcblx0ICovXG5cdHBsYW5JdGVtSW5zdGFuY2VJZChwbGFuSXRlbUluc3RhbmNlSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gc2NvcGUgaWRlbnRpZmllci4gXG5cdCAqL1xuXHRzY29wZUlkKHNjb3BlSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gc3ViIHNjb3BlIGlkZW50aWZpZXIuIFxuXHQgKi9cblx0c3ViU2NvcGVJZChzdWJTY29wZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3IgdGhlIGdpdmVuIHNjb3BlIHR5cGUuIFxuXHQgKi9cblx0c2NvcGVUeXBlKHNjb3BlVHlwZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHRoZSBnaXZlbiBzY29wZSBkZWZpbml0aW9uIGlkZW50aWZpZXIuIFxuXHQgKi9cblx0c2NvcGVEZWZpbml0aW9uSWQoc2NvcGVEZWZpbml0aW9uSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gc3RhZ2UsIGRlZmluZWQgdGhyb3VnaCBpdHMgc3RhZ2UgaW5zdGFuY2UgaWQuXG5cdCAqL1xuXHRwcm9wYWdhdGVkU3RhZ2VJbnN0YW5jZUlkKHByb3BhZ2F0ZWRTdGFnZUluc3RhbmNlSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIFNlbGVjdCBhbGwgdGFza3MgZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGluc3RhbmNlIGlkIGFuZCBpdHMgY2hpbGRyZW4uXG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VJZFdpdGhDaGlsZHJlbihwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogU2VsZWN0IGFsbCB0YXNrcyBmb3IgdGhlIGdpdmVuIGNhc2UgaW5zdGFuY2UgaWQgYW5kIGl0cyBjaGlsZHJlbi5cblx0ICovXG5cdGNhc2VJbnN0YW5jZUlkV2l0aENoaWxkcmVuKGNhc2VJbnN0YW5jZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBjcmVhdGVkIG9uIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0NyZWF0ZWRPbihjcmVhdGVUaW1lOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrQ3JlYXRlZEJlZm9yZShiZWZvcmU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBjcmVhdGVkIGFmdGVyIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0NyZWF0ZWRBZnRlcihhZnRlcjogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHRoYXQgYXJlIHN0YXJ0ZWQgaW4gcHJvZ3Jlc3Mgb24gdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrSW5Qcm9ncmVzc1N0YXJ0VGltZU9uKGNsYWltZWRUaW1lOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgc3RhcnRlZCBpbiBwcm9ncmVzcyBiZWZvcmUgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrSW5Qcm9ncmVzc1N0YXJ0VGltZUJlZm9yZShiZWZvcmU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBzdGFydGVkIGluIHByb2dyZXNzIGFmdGVyIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0luUHJvZ3Jlc3NTdGFydFRpbWVBZnRlcihhZnRlcjogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIFNlbGVjdCBhbGwgdGFza3MgdGhhdCBoYXZlIGFuIGluIHByb2dyZXNzIHN0YXJ0ZWQgdXNlciByZWZlcmVuY2UgZm9yIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdHRhc2tJblByb2dyZXNzU3RhcnRlZEJ5KHN0YXJ0ZWRCeTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgY2xhaW1lZCBvbiB0aGUgZ2l2ZW4gZGF0ZS5cblx0ICovXG5cdHRhc2tDbGFpbWVkT24oY2xhaW1lZFRpbWU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBjbGFpbWVkIGJlZm9yZSB0aGUgZ2l2ZW4gZGF0ZS5cblx0ICovXG5cdHRhc2tDbGFpbWVkQmVmb3JlKGJlZm9yZTogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHRoYXQgYXJlIGNsYWltZWQgYWZ0ZXIgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrQ2xhaW1lZEFmdGVyKGFmdGVyOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogU2VsZWN0IGFsbCB0YXNrcyB0aGF0IGhhdmUgYSBjbGFpbWVkIGJ5IHVzZXIgcmVmZXJlbmNlIGZvciB0aGUgZ2l2ZW4gdmFsdWUuXG5cdCAqL1xuXHR0YXNrQ2xhaW1lZEJ5KGNsYWltZWRCeTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgc3VzcGVuZGVkIG9uIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza1N1c3BlbmRlZE9uKHN1c3BlbmRlZFRpbWU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBzdXNwZW5kZWQgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza1N1c3BlbmRlZEJlZm9yZShiZWZvcmU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBzdXNwZW5kZWQgYWZ0ZXIgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrU3VzcGVuZGVkQWZ0ZXIoYWZ0ZXI6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBTZWxlY3QgYWxsIHRhc2tzIHRoYXQgaGF2ZSBhIHN1c3BlbmRlZCBieSB1c2VyIHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIHZhbHVlLlxuXHQgKi9cblx0dGFza1N1c3BlbmRlZEJ5KHN1c3BlbmRlZEJ5OiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiBjYXRlZ29yeS5cblx0ICovXG5cdHRhc2tDYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgYmVsb25naW5nIHRvIG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBpbiB0aGUgZ2l2ZW4gbGlzdC5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tDYXRlZ29yeUluTGlzdFxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFdoZW4gcGFzc2VkIGNhdGVnb3J5IGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbDwvY29kZT4gU3RyaW5nLlxuXHQgKi9cblx0dGFza0NhdGVnb3J5SW4odGFza0NhdGVnb3J5SW5MaXN0OiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBkZWZpbmVkIGNhdGVnb3J5IHdoaWNoIGRvIG5vdCBiZWxvbmcgdG8gYSBjYXRlZ29yeSBwcmVzZW50IGluIHRoZSBnaXZlbiBsaXN0LlxuXHQgKiA8cD5cblx0ICogTk9URTogVGhpcyBtZXRob2QgZG9lcyA8Yj5ub3Q8L2I+IHJldHVybiB0YXNrcyA8Yj53aXRob3V0PC9iPiBjYXRlZ29yeSBlLmcuIHRhc2tzIGhhdmluZyBhIDxjb2RlPm51bGw8L2NvZGU+IGNhdGVnb3J5LlxuXHQgKiBUbyBpbmNsdWRlIDxjb2RlPm51bGw8L2NvZGU+IGNhdGVnb3JpZXMsIHVzZSA8Y29kZT5xdWVyeS5vcigpLnRhc2tDYXRlZ29yeU5vdEluKC4uLikudGFza1dpdGhvdXRDYXRlZ29yeSgpLmVuZE9yKCk8L2NvZGU+XG5cdCAqIDwvcD5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tDYXRlZ29yeU5vdEluTGlzdFxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFdoZW4gcGFzc2VkIGNhdGVnb3J5IGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKiBAc2VlICN0YXNrV2l0aG91dENhdGVnb3J5XG5cdCAqL1xuXHR0YXNrQ2F0ZWdvcnlOb3RJbih0YXNrQ2F0ZWdvcnlOb3RJbkxpc3Q6IHN0cmluZ1tdKTogVDtcblxuXHQvKipcblx0ICogU2VsZWN0cyB0YXNrcyB3aXRob3V0IGNhdGVnb3J5LlxuXHQgKiA8cD5cblx0ICogQ2FuIGFsc28gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG90aGVyIGZpbHRlciBjcml0ZXJpYSB0byBpbmNsdWRlIHRhc2tzIHdpdGhvdXQgY2F0ZWdvcnkgZS5nLiBpbiA8Y29kZT5vcjwvY29kZT4gcXVlcmllcy5cblx0ICogPC9wPlxuXHQgKiBAc2VlICN0YXNrQ2F0ZWdvcnlOb3RJbihDb2xsZWN0aW9uKVxuXHQgKi9cblx0dGFza1dpdGhvdXRDYXRlZ29yeSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGZvcm0ga2V5LlxuXHQgKi9cblx0dGFza1dpdGhGb3JtS2V5KCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIGZvcm1LZXkuXG5cdCAqL1xuXHR0YXNrRm9ybUtleShmb3JtS2V5OiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiB0YXNrRGVmaW5pdGlvbktleS4gVGhlIHRhc2sgZGVmaW5pdGlvbiBrZXkgaXMgdGhlIGlkIG9mIHRoZSB1c2VyVGFzazogJmx0O3VzZXJUYXNrIGlkPVwieHh4XCIgLi4uLyZndDtcblx0ICoqL1xuXHR0YXNrRGVmaW5pdGlvbktleShrZXk6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSB0YXNrRGVmaW5pdGlvbktleSB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXJhbWV0ZXIuIFRoZSBzeW50YXggaXMgdGhhdCBvZiBTUUw6IGZvciBleGFtcGxlIHVzYWdlOiB0YXNrRGVmaW5pdGlvbktleUxpa2UoXCIldGVzdCVcIikuIFRoZSB0YXNrIGRlZmluaXRpb24ga2V5IGlzIHRoZSBpZCBvZlxuXHQgKiB0aGUgdXNlclRhc2s6ICZsdDt1c2VyVGFzayBpZD1cInh4eFwiIC4uLi8mZ3Q7XG5cdCAqKi9cblx0dGFza0RlZmluaXRpb25LZXlMaWtlKGtleUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIHRhc2tEZWZpbml0aW9uS2V5cy4gVGhlIHRhc2sgZGVmaW5pdGlvbiBrZXkgaXMgdGhlIGlkIG9mIHRoZSB1c2VyVGFzazogJmx0O3VzZXJUYXNrIGlkPVwieHh4XCIgLi4uLyZndDtcblx0ICoqL1xuXHR0YXNrRGVmaW5pdGlvbktleXMoa2V5czogc3RyaW5nW10pOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiBzdGF0ZS5cblx0ICoqL1xuXHR0YXNrU3RhdGUoc3RhdGU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIGluIHByb2dyZXNzIHN0YXJ0IGR1ZSBkYXRlLlxuXHQgKi9cblx0dGFza0luUHJvZ3Jlc3NTdGFydER1ZURhdGUoZHVlRGF0ZTogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYW4gaW4gcHJvZ3Jlc3Mgc3RhcnQgZHVlIGRhdGUgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0luUHJvZ3Jlc3NTdGFydER1ZUJlZm9yZShkdWVEYXRlOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhbiBpbiBwcm9ncmVzcyBzdGFydCBkdWUgZGF0ZSBhZnRlciB0aGUgZ2l2ZW4gZGF0ZS5cblx0ICovXG5cdHRhc2tJblByb2dyZXNzU3RhcnREdWVBZnRlcihkdWVEYXRlOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBubyBpbiBwcm9ncmVzcyBzdGFydCBkdWUgZGF0ZS5cblx0ICovXG5cdHdpdGhvdXRUYXNrSW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiBkdWUgZGF0ZS5cblx0ICovXG5cdHRhc2tEdWVEYXRlKGR1ZURhdGU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZHVlIGRhdGUgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0R1ZUJlZm9yZShkdWVEYXRlOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGR1ZSBkYXRlIGFmdGVyIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0R1ZUFmdGVyKGR1ZURhdGU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIG5vIGR1ZSBkYXRlLlxuXHQgKi9cblx0d2l0aG91dFRhc2tEdWVEYXRlKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyBpbnN0YW5jZSB3aGljaCBoYXMgdGhlIGdpdmVuIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkuXG5cdCAqL1xuXHRwcm9jZXNzRGVmaW5pdGlvbktleShwcm9jZXNzRGVmaW5pdGlvbktleTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdoaWNoIGhhcyBhIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBzeW50YXggdGhhdCBzaG91bGQgYmUgdXNlZCBpcyB0aGUgc2FtZSBhcyBpbiBTUUwsIGVnLiAldGVzdCUuXG5cdCAqL1xuXHRwcm9jZXNzRGVmaW5pdGlvbktleUxpa2UocHJvY2Vzc0RlZmluaXRpb25LZXlMaWtlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgaW5zdGFuY2Ugd2hpY2ggaGFzIGEgcHJvY2VzcyBkZWZpbml0aW9uIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIHN5bnRheCB0aGF0IHNob3VsZCBiZSB1c2VkIGlzIHRoZSBzYW1lIGFzIGluIFNRTCwgZWcuICV0ZXN0JS5cblx0ICogXG5cdCAqIFRoaXMgbWV0aG9kLCB1bmxpa2UgdGhlIHtAbGluayAjcHJvY2Vzc0RlZmluaXRpb25LZXlMaWtlKFN0cmluZyl9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlciBhcyB0aGUgY29sdW1uIHZhbHVlIGFyZSBsb3dlcmNhc2VkIHdoZW4gdGhlXG5cdCAqIHF1ZXJ5IGlzIGV4ZWN1dGVkLlxuXHQgKi9cblx0cHJvY2Vzc0RlZmluaXRpb25LZXlMaWtlSWdub3JlQ2FzZShwcm9jZXNzRGVmaW5pdGlvbktleUxpa2VJZ25vcmVDYXNlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGhhdmUgYSBwcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBrZXkgaXMgcHJlc2VudCBpbiB0aGUgZ2l2ZW4gbGlzdCAqKi9cblx0cHJvY2Vzc0RlZmluaXRpb25LZXlJbihwcm9jZXNzRGVmaW5pdGlvbktleXM6IHN0cmluZ1tdKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiB0YXNrIGRlZmluaXRpb24gcmVmZXJlbmNlZCBieSBpZC5cblx0ICovXG5cdHRhc2tEZWZpbml0aW9uSWQodGFza0RlZmluaXRpb25JZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gcHJvY2VzcyBkZWZpbml0aW9uIGlkLlxuXHQgKi9cblx0cHJvY2Vzc0RlZmluaXRpb25JZChwcm9jZXNzRGVmaW5pdGlvbklkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgaW5zdGFuY2Ugd2hpY2ggaGFzIHRoZSBnaXZlbiBwcm9jZXNzIGRlZmluaXRpb24gbmFtZS5cblx0ICovXG5cdHByb2Nlc3NEZWZpbml0aW9uTmFtZShwcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyBpbnN0YW5jZSB3aGljaCBoYXMgYSBwcm9jZXNzIGRlZmluaXRpb24gbmFtZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIHN5bnRheCB0aGF0IHNob3VsZCBiZSB1c2VkIGlzIHRoZSBzYW1lIGFzIGluIFNRTCwgZWcuICV0ZXN0JS5cblx0ICovXG5cdHByb2Nlc3NEZWZpbml0aW9uTmFtZUxpa2UocHJvY2Vzc0RlZmluaXRpb25OYW1lTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdob3NlIGRlZmluaXRpb24gYmVsb25ncyB0byB0aGUgY2F0ZWdvcnkgd2hpY2ggaXMgcHJlc2VudCBpbiB0aGUgZ2l2ZW4gbGlzdC5cblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgV2hlbiBwYXNzZWQgY2F0ZWdvcnkgbGlzdCBpcyBlbXB0eSBvciA8Y29kZT5udWxsPC9jb2RlPiBvciBjb250YWlucyA8Y29kZT5udWxsIFN0cmluZzwvY29kZT4uXG5cdCAqIEBwYXJhbSBwcm9jZXNzQ2F0ZWdvcnlJbkxpc3Rcblx0ICovXG5cdHByb2Nlc3NDYXRlZ29yeUluKHByb2Nlc3NDYXRlZ29yeUluTGlzdDogc3RyaW5nW10pOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgaW5zdGFuY2Ugd2hvc2UgZGVmaW5pdGlvbiBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIGNhdGVnb3J5IHdoaWNoIGlzIHByZXNlbnQgaW4gdGhlIGdpdmVuIGxpc3QuXG5cdCAqIFxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIFdoZW4gcGFzc2VkIGNhdGVnb3J5IGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0NhdGVnb3J5Tm90SW5MaXN0XG5cdCAqL1xuXHRwcm9jZXNzQ2F0ZWdvcnlOb3RJbihwcm9jZXNzQ2F0ZWdvcnlOb3RJbkxpc3Q6IHN0cmluZ1tdKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gZGVwbG95bWVudCBpZC5cblx0ICovXG5cdGRlcGxveW1lbnRJZChkZXBsb3ltZW50SWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyBpbnN0YW5jZSB3aGljaCBoYXMgdGhlIGdpdmVuIGRlcGxveW1lbnQgaWQuXG5cdCAqL1xuXHRkZXBsb3ltZW50SWRJbihkZXBsb3ltZW50SWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSByZWxhdGVkIHRvIGEgY2FzZSBpbnN0YW5jZSBmb3IgdG8gdGhlIGdpdmVuIGRlcGxveW1lbnQgaWQuXG5cdCAqL1xuXHRjbW1uRGVwbG95bWVudElkKGNtbW5EZXBsb3ltZW50SWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSByZWxhdGVkIHRvIGEgY2FzZSBpbnN0YW5jZXMgZm9yIHRoZSBnaXZlbiBkZXBsb3ltZW50IGlkLlxuXHQgKi9cblx0Y21tbkRlcGxveW1lbnRJZEluKGNtbW5EZXBsb3ltZW50SWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGRvbid0IGhhdmUgYSBzY29wZSBpZCBzZXQuXG5cdCAqL1xuXHR3aXRob3V0U2NvcGVJZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdGFzayB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVWYWx1ZUVxdWFscyh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhdCBsZWFzdCBvbmUgbG9jYWwgdGFzayB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlRXF1YWxzKHZhcmlhYmxlVmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCBzdHJpbmcgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqIDxwPlxuXHQgKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIHlvdXIgZGF0YWJhc2UgaGFzIGVuY29kaW5nL2NvbGxhdGlvbiB0aGF0IHN1cHBvcnRzIGNhc2Utc2Vuc2l0aXZlIHF1ZXJpZXMuIEZvciBleGFtcGxlLCB1c2UgXCJjb2xsYXRlIFVURi04XCIgb24gTXlTUUwgYW5kIGZvciBNU1NRTCwgc2VsZWN0IG9uZSBvZiB0aGUgY2FzZS1zZW5zaXRpdmVcblx0ICogQ29sbGF0aW9ucyBhdmFpbGFibGUgKDxhIGhyZWY9XCJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTAodj1zcWwuMTA1KS5hc3B4XCIgPk1TRE4gU2VydmVyIENvbGxhdGlvbiBSZWZlcmVuY2U8L2E+KS5cblx0ICogPC9wPlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlVmFsdWVFcXVhbHNJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB0YXNrIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUsIGJ1dCB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIHRoYW4gdGhlIHBhc3NlZCB2YWx1ZS4gQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlXG5cdCAqIHR5cGUgd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlVmFsdWVOb3RFcXVhbHModmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCBzdHJpbmcgdmFyaWFibGUgd2l0aCBpcyBub3QgdGhlIGdpdmVuIHZhbHVlLCBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKiA8cD5cblx0ICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB5b3VyIGRhdGFiYXNlIGhhcyBlbmNvZGluZy9jb2xsYXRpb24gdGhhdCBzdXBwb3J0cyBjYXNlLXNlbnNpdGl2ZSBxdWVyaWVzLiBGb3IgZXhhbXBsZSwgdXNlIFwiY29sbGF0ZSBVVEYtOFwiIG9uIE15U1FMIGFuZCBmb3IgTVNTUUwsIHNlbGVjdCBvbmUgb2YgdGhlIGNhc2Utc2Vuc2l0aXZlXG5cdCAqIENvbGxhdGlvbnMgYXZhaWxhYmxlICg8YSBocmVmPVwiaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjUwKHY9c3FsLjEwNSkuYXNweFwiID5NU0ROIFNlcnZlciBDb2xsYXRpb24gUmVmZXJlbmNlPC9hPikuXG5cdCAqIDwvcD5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlTm90RXF1YWxzSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdmFyaWFibGUgdmFsdWUgZ3JlYXRlciB0aGFuIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGUgd3JhcHBlcnMpXG5cdCAqIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmVcblx0ICogdHlwZSB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlR3JlYXRlclRoYW5PckVxdWFsKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBsZXNzIHRoYW4gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZSBlbmRlZC5Cb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGUgd3JhcHBlcnMpIGFyZVxuXHQgKiBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVWYWx1ZUxlc3NUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZVxuXHQgKiB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlTGVzc1RoYW5PckVxdWFsKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIFRoaXMgY2FuIGJlIHVzZWQgb24gc3RyaW5nIHZhcmlhYmxlcyBvbmx5LlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuIFRoZSBzdHJpbmcgY2FuIGluY2x1ZGUgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciAnJScgdG8gZXhwcmVzcyBsaWtlLXN0cmF0ZWd5OiBzdGFydHMgd2l0aCAoc3RyaW5nJSksIGVuZHMgd2l0aCAoJXN0cmluZykgb3IgY29udGFpbnMgKCVzdHJpbmclKS5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlTGlrZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdmFyaWFibGUgdmFsdWUgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUgKGNhc2UgaW5zZW5zaXRpdmUpIHdoZW4gdGhleSBlbmRlZC4gVGhpcyBjYW4gYmUgdXNlZCBvbiBzdHJpbmcgdmFyaWFibGVzIG9ubHkuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC4gVGhlIHN0cmluZyBjYW4gaW5jbHVkZSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyICclJyB0byBleHByZXNzIGxpa2Utc3RyYXRlZ3k6IHN0YXJ0cyB3aXRoIChzdHJpbmclKSwgZW5kcyB3aXRoICglc3RyaW5nKSBvciBjb250YWlucyAoJXN0cmluZyUpLlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlVmFsdWVMaWtlSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVFeGlzdHMobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIGxvY2FsIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlTm90RXhpc3RzKG5hbWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyB0aGF0IGhhcyBhIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUgc2V0IHRvIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlRXF1YWxzKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YXJpYWJsZVZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgdGhhdCBoYXMgYXQgbGVhc3Qgb25lIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIHZhbHVlLlxuXHQgKi9cblx0cHJvY2Vzc1ZhcmlhYmxlVmFsdWVFcXVhbHModmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIHRoYXQgaGFzIGEgbG9jYWwgc3RyaW5nIHZhcmlhYmxlIHdoaWNoIGlzIG5vdCB0aGUgZ2l2ZW4gdmFsdWUsIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqIDxwPlxuXHQgKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIHlvdXIgZGF0YWJhc2UgaGFzIGVuY29kaW5nL2NvbGxhdGlvbiB0aGF0IHN1cHBvcnRzIGNhc2Utc2Vuc2l0aXZlIHF1ZXJpZXMuIEZvciBleGFtcGxlLCB1c2UgXCJjb2xsYXRlIFVURi04XCIgb24gTXlTUUwgYW5kIGZvciBNU1NRTCwgc2VsZWN0IG9uZSBvZiB0aGUgY2FzZS1zZW5zaXRpdmVcblx0ICogQ29sbGF0aW9ucyBhdmFpbGFibGUgKDxhIGhyZWY9XCJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTAodj1zcWwuMTA1KS5hc3B4XCIgPk1TRE4gU2VydmVyIENvbGxhdGlvbiBSZWZlcmVuY2U8L2E+KS5cblx0ICogPC9wPlxuXHQgKi9cblx0cHJvY2Vzc1ZhcmlhYmxlVmFsdWVFcXVhbHNJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBidXQgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSB0aGFuIHRoZSBwYXNzZWQgdmFsdWUuIEJ5dGUtYXJyYXlzIGFuZCB7QGxpbmsgU2VyaWFsaXphYmxlfSBvYmplY3RzICh3aGljaCBhcmUgbm90IHByaW1pdGl2ZSB0eXBlXG5cdCAqIHdyYXBwZXJzKSBhcmUgbm90IHN1cHBvcnRlZC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlTm90RXF1YWxzKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YXJpYWJsZVZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgdGhhdCBoYXMgYSBzdHJpbmcgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqIDxwPlxuXHQgKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIHlvdXIgZGF0YWJhc2UgaGFzIGVuY29kaW5nL2NvbGxhdGlvbiB0aGF0IHN1cHBvcnRzIGNhc2Utc2Vuc2l0aXZlIHF1ZXJpZXMuIEZvciBleGFtcGxlLCB1c2UgXCJjb2xsYXRlIFVURi04XCIgb24gTXlTUUwgYW5kIGZvciBNU1NRTCwgc2VsZWN0IG9uZSBvZiB0aGUgY2FzZS1zZW5zaXRpdmVcblx0ICogQ29sbGF0aW9ucyBhdmFpbGFibGUgKDxhIGhyZWY9XCJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTAodj1zcWwuMTA1KS5hc3B4XCIgPk1TRE4gU2VydmVyIENvbGxhdGlvbiBSZWZlcmVuY2U8L2E+KS5cblx0ICogPC9wPlxuXHQgKi9cblx0cHJvY2Vzc1ZhcmlhYmxlVmFsdWVOb3RFcXVhbHNJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgZ3JlYXRlciB0aGFuIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGVcblx0ICogd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlXG5cdCAqIHR5cGUgd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuT3JFcXVhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHZhbHVlIGxlc3MgdGhhbiB0aGUgcGFzc2VkIHZhbHVlIHdoZW4gdGhlIGVuZGVkLkJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZSB3cmFwcGVycykgYXJlXG5cdCAqIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlTGVzc1RoYW4obmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZVxuXHQgKiB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlTGVzc1RoYW5PckVxdWFsKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBUaGlzIGNhbiBiZSB1c2VkIG9uIHN0cmluZyB2YXJpYWJsZXMgb25seS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLiBUaGUgc3RyaW5nIGNhbiBpbmNsdWRlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgJyUnIHRvIGV4cHJlc3MgbGlrZS1zdHJhdGVneTogc3RhcnRzIHdpdGggKHN0cmluZyUpLCBlbmRzIHdpdGggKCVzdHJpbmcpIG9yIGNvbnRhaW5zICglc3RyaW5nJSkuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUxpa2UobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSAoY2FzZSBpbnNlbnNpdGl2ZSkgd2hlbiB0aGV5IGVuZGVkLiBUaGlzIGNhbiBiZSB1c2VkIG9uIHN0cmluZyB2YXJpYWJsZXMgb25seS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLiBUaGUgc3RyaW5nIGNhbiBpbmNsdWRlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgJyUnIHRvIGV4cHJlc3MgbGlrZS1zdHJhdGVneTogc3RhcnRzIHdpdGggKHN0cmluZyUpLCBlbmRzIHdpdGggKCVzdHJpbmcpIG9yIGNvbnRhaW5zICglc3RyaW5nJSkuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUxpa2VJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVFeGlzdHMobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZU5vdEV4aXN0cyhuYW1lOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIGNhc2UgdGhhdCBoYXMgYSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUVxdWFscyh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBjYXNlIHRoYXQgaGFzIGF0IGxlYXN0IG9uZSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlRXF1YWxzKHZhcmlhYmxlVmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgY2FzZSB0aGF0IGhhcyBhIGxvY2FsIHN0cmluZyB2YXJpYWJsZSB3aGljaCBpcyBub3QgdGhlIGdpdmVuIHZhbHVlLCBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKiA8cD5cblx0ICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB5b3VyIGRhdGFiYXNlIGhhcyBlbmNvZGluZy9jb2xsYXRpb24gdGhhdCBzdXBwb3J0cyBjYXNlLXNlbnNpdGl2ZSBxdWVyaWVzLiBGb3IgZXhhbXBsZSwgdXNlIFwiY29sbGF0ZSBVVEYtOFwiIG9uIE15U1FMIGFuZCBmb3IgTVNTUUwsIHNlbGVjdCBvbmUgb2YgdGhlIGNhc2Utc2Vuc2l0aXZlXG5cdCAqIENvbGxhdGlvbnMgYXZhaWxhYmxlICg8YSBocmVmPVwiaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjUwKHY9c3FsLjEwNSkuYXNweFwiID5NU0ROIFNlcnZlciBDb2xsYXRpb24gUmVmZXJlbmNlPC9hPikuXG5cdCAqIDwvcD5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlRXF1YWxzSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgYnV0IHdpdGggYSBkaWZmZXJlbnQgdmFsdWUgdGhhbiB0aGUgcGFzc2VkIHZhbHVlLiBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZVxuXHQgKiB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZU5vdEVxdWFscyh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBjYXNlIHRoYXQgaGFzIGEgc3RyaW5nIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIHZhbHVlLCBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKiA8cD5cblx0ICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB5b3VyIGRhdGFiYXNlIGhhcyBlbmNvZGluZy9jb2xsYXRpb24gdGhhdCBzdXBwb3J0cyBjYXNlLXNlbnNpdGl2ZSBxdWVyaWVzLiBGb3IgZXhhbXBsZSwgdXNlIFwiY29sbGF0ZSBVVEYtOFwiIG9uIE15U1FMIGFuZCBmb3IgTVNTUUwsIHNlbGVjdCBvbmUgb2YgdGhlIGNhc2Utc2Vuc2l0aXZlXG5cdCAqIENvbGxhdGlvbnMgYXZhaWxhYmxlICg8YSBocmVmPVwiaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjUwKHY9c3FsLjEwNSkuYXNweFwiID5NU0ROIFNlcnZlciBDb2xsYXRpb24gUmVmZXJlbmNlPC9hPikuXG5cdCAqIDwvcD5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlTm90RXF1YWxzSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHZhbHVlIGdyZWF0ZXIgdGhhbiB0aGUgcGFzc2VkIHZhbHVlIHdoZW4gdGhleSBlbmRlZC4gQm9vbGVhbnMsIEJ5dGUtYXJyYXlzIGFuZCB7QGxpbmsgU2VyaWFsaXphYmxlfSBvYmplY3RzICh3aGljaCBhcmUgbm90IHByaW1pdGl2ZSB0eXBlXG5cdCAqIHdyYXBwZXJzKSBhcmUgbm90IHN1cHBvcnRlZC5cblx0ICpcblx0ICogQHBhcmFtIG5hbWUgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZSBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlR3JlYXRlclRoYW4obmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmVcblx0ICogdHlwZSB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBuYW1lIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWUgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuT3JFcXVhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHZhbHVlIGxlc3MgdGhhbiB0aGUgcGFzc2VkIHZhbHVlIHdoZW4gdGhlIGVuZGVkLkJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZSB3cmFwcGVycykgYXJlXG5cdCAqIG5vdCBzdXBwb3J0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBuYW1lIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWUgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUxlc3NUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGVcblx0ICogd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gbmFtZSBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlIGNhbm5vdCBiZSBudWxsLlxuXHQgKi9cblx0Y2FzZVZhcmlhYmxlVmFsdWVMZXNzVGhhbk9yRXF1YWwobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIFRoaXMgY2FuIGJlIHVzZWQgb24gc3RyaW5nIHZhcmlhYmxlcyBvbmx5LlxuXHQgKlxuXHQgKiBAcGFyYW0gbmFtZSBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlIGNhbm5vdCBiZSBudWxsLiBUaGUgc3RyaW5nIGNhbiBpbmNsdWRlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgJyUnIHRvIGV4cHJlc3MgbGlrZS1zdHJhdGVneTogc3RhcnRzIHdpdGggKHN0cmluZyUpLCBlbmRzIHdpdGggKCVzdHJpbmcpIG9yIGNvbnRhaW5zICglc3RyaW5nJSkuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUxpa2UobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSAoY2FzZSBpbnNlbnNpdGl2ZSkgd2hlbiB0aGV5IGVuZGVkLiBUaGlzIGNhbiBiZSB1c2VkIG9uIHN0cmluZyB2YXJpYWJsZXMgb25seS5cblx0ICpcblx0ICogQHBhcmFtIG5hbWUgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZSBjYW5ub3QgYmUgbnVsbC4gVGhlIHN0cmluZyBjYW4gaW5jbHVkZSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyICclJyB0byBleHByZXNzIGxpa2Utc3RyYXRlZ3k6IHN0YXJ0cyB3aXRoIChzdHJpbmclKSwgZW5kcyB3aXRoICglc3RyaW5nKSBvciBjb250YWlucyAoJXN0cmluZyUpLlxuXHQgKi9cblx0Y2FzZVZhcmlhYmxlVmFsdWVMaWtlSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSBuYW1lIGNhbm5vdCBiZSBudWxsLlxuXHQgKi9cblx0Y2FzZVZhcmlhYmxlRXhpc3RzKG5hbWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGRvZXMgbm90IGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICpcblx0ICogQHBhcmFtIG5hbWUgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVOb3RFeGlzdHMobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3RzIHRhc2tzIHdoaWNoIHdpdGggdGhlIGdpdmVuIHJvb3Qgc2NvcGUgaWRcblx0ICovXG5cdHRhc2tSb290U2NvcGVJZChwYXJlbnRTY29wZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdHMgdGFza3Mgd2hpY2ggd2l0aCB0aGUgZ2l2ZW4gcGFyZW50IHNjb3BlIGlkXG5cdCAqL1xuXHR0YXNrUGFyZW50U2NvcGVJZChwYXJlbnRTY29wZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBJbmNsdWRlIGxvY2FsIHRhc2sgdmFyaWFibGVzIGluIHRoZSB0YXNrIHF1ZXJ5IHJlc3VsdFxuXHQgKi9cblx0aW5jbHVkZVRhc2tMb2NhbFZhcmlhYmxlcygpOiBUO1xuXG5cdC8qKlxuXHQgKiBJbmNsdWRlIGdsb2JhbCBwcm9jZXNzIHZhcmlhYmxlcyBpbiB0aGUgdGFzayBxdWVyeSByZXN1bHRcblx0ICovXG5cdGluY2x1ZGVQcm9jZXNzVmFyaWFibGVzKCk6IFQ7XG5cblx0LyoqXG5cdCAqIEluY2x1ZGUgZ2xvYmFsIGNhc2UgdmFyaWFibGVzIGluIHRoZSB0YXNrIHF1ZXJ5IHJlc3VsdFxuXHQgKi9cblx0aW5jbHVkZUNhc2VWYXJpYWJsZXMoKTogVDtcblxuXHQvKipcblx0ICogSW5jbHVkZSBpZGVudGl0eSBsaW5rcyBpbiB0aGUgdGFzayBxdWVyeSByZXN1bHRcblx0ICovXG5cdGluY2x1ZGVJZGVudGl0eUxpbmtzKCk6IFQ7XG5cblx0LyoqXG5cdCAqIExvY2FsaXplIHRhc2sgbmFtZSBhbmQgZGVzY3JpcHRpb24gdG8gc3BlY2lmaWVkIGxvY2FsZS5cblx0ICovXG5cdGxvY2FsZShsb2NhbGU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIEluc3RydWN0IGxvY2FsaXphdGlvbiB0byBmYWxsYmFjayB0byBtb3JlIGdlbmVyYWwgbG9jYWxlcyBpbmNsdWRpbmcgdGhlIGRlZmF1bHQgbG9jYWxlIG9mIHRoZSBKVk0gaWYgdGhlIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLlxuXHQgKi9cblx0d2l0aExvY2FsaXphdGlvbkZhbGxiYWNrKCk6IFQ7XG5cblx0LyoqXG5cdCAqIEFsbCBxdWVyeSBjbGF1c2VzIGNhbGxlZCB3aWxsIGJlIGFkZGVkIHRvIGEgc2luZ2xlIG9yLXN0YXRlbWVudC4gVGhpcyBvci1zdGF0ZW1lbnQgd2lsbCBiZSBpbmNsdWRlZCB3aXRoIHRoZSBvdGhlciBhbHJlYWR5IGV4aXN0aW5nIGNsYXVzZXMgaW4gdGhlIHF1ZXJ5LCBqb2luZWQgYnkgYW4gJ2FuZCcuXG5cdCAqIDxwPlxuXHQgKiBDYWxsaW5nIGVuZE9yKCkgd2lsbCBhZGQgYWxsIGNsYXVzZXMgdG8gdGhlIHJlZ3VsYXIgcXVlcnkgYWdhaW4uIENhbGxpbmcgb3IoKSBhZnRlciBvcigpIGhhcyBiZWVuIGNhbGxlZCBvciBjYWxsaW5nIGVuZE9yKCkgYWZ0ZXIgZW5kT3IoKSBoYXMgYmVlbiBjYWxsZWQgd2lsbCByZXN1bHQgaW4gYW4gZXhjZXB0aW9uLlxuXHQgKiBJdCBpcyBwb3NzaWJsZSB0byBjYWxsIG9yKCkgZW5kT3IoKSBzZXZlcmFsIHRpbWVzIGlmIGVhY2ggb3IoKSBoYXMgYSBtYXRjaGluZyBlbmRPcigpLCBlLmcuOlxuXHQgKiA8L3A+XG5cdCAqIHtAY29kZSBxdWVyeS48Q29uZGl0aW9uQT59XG5cdCAqIHtAY29kZSAgLm9yKCkuPGNvbmRpdGlvbkI+Ljxjb25kaXRpb25DPi5lbmRPcigpfVxuXHQgKiB7QGNvZGUgIC48Y29uZGl0aW9uRD4uPGNvbmRpdGlvbkU+fVxuXHQgKiB7QGNvZGUgIC5vcigpLjxjb25kaXRpb25GPi48Y29uZGl0aW9uRz4uZW5kT3IoKX1cblx0ICogPHA+XG5cdCAqIHdpbGwgcmVzdWx0IGluOiBjb25kaXRpb25BICZhbXA7IChjb25kaXRpb25CIHwgY29uZGl0aW9uQykgJmFtcDsgY29uZGl0aW9uRCAmYW1wOyBjb25kaXRpb25FICZhbXA7IChjb25kaXRpb25GIHwgY29uZGl0aW9uRylcblx0ICovXG5cdG9yKCk6IFQ7XG5cblx0ZW5kT3IoKTogVDtcblxuXHQvLyBPUkRFUklOR1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSB0YXNrIGlkIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRhc2tJZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSB0YXNrIG5hbWUgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza05hbWUoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgZGVzY3JpcHRpb24gKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza0Rlc2NyaXB0aW9uKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IHByaW9yaXR5IChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRhc2tQcmlvcml0eSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSBhc3NpZ25lZSAobmVlZHMgdG8gYmUgZm9sbG93ZWQgYnkge0BsaW5rICNhc2MoKX0gb3Ige0BsaW5rICNkZXNjKCl9KS5cblx0ICovXG5cdG9yZGVyQnlUYXNrQXNzaWduZWUoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgdGhlIHRpbWUgb24gd2hpY2ggdGhlIHRhc2tzIHdlcmUgY3JlYXRlZCAobmVlZHMgdG8gYmUgZm9sbG93ZWQgYnkge0BsaW5rICNhc2MoKX0gb3Ige0BsaW5rICNkZXNjKCl9KS5cblx0ICovXG5cdG9yZGVyQnlUYXNrQ3JlYXRlVGltZSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSBwcm9jZXNzIGluc3RhbmNlIGlkIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVByb2Nlc3NJbnN0YW5jZUlkKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IGV4ZWN1dGlvbiBpZCAobmVlZHMgdG8gYmUgZm9sbG93ZWQgYnkge0BsaW5rICNhc2MoKX0gb3Ige0BsaW5rICNkZXNjKCl9KS5cblx0ICovXG5cdG9yZGVyQnlFeGVjdXRpb25JZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSBwcm9jZXNzIGRlZmluaXRpb24gaWQgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5UHJvY2Vzc0RlZmluaXRpb25JZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSB0YXNrIGR1ZSBkYXRlIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRhc2tEdWVEYXRlKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IHRhc2sgb3duZXIgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza093bmVyKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IHRhc2sgZGVmaW5pdGlvbiBrZXkgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza0RlZmluaXRpb25LZXkoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgdGVuYW50IGlkIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRlbmFudElkKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IGR1ZSBkYXRlIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLiBJZiBhbnkgb2YgdGhlIHRhc2tzIGhhdmUgbnVsbCBmb3IgdGhlIGR1ZSBkYXRlLCB0aGVzZSB3aWxsIGJlIGZpcnN0IGluIHRoZSByZXN1bHQuXG5cdCAqL1xuXHRvcmRlckJ5RHVlRGF0ZU51bGxzRmlyc3QoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgZHVlIGRhdGUgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuIElmIGFueSBvZiB0aGUgdGFza3MgaGF2ZSBudWxsIGZvciB0aGUgZHVlIGRhdGUsIHRoZXNlIHdpbGwgYmUgbGFzdCBpbiB0aGUgcmVzdWx0LlxuXHQgKi9cblx0b3JkZXJCeUR1ZURhdGVOdWxsc0xhc3QoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgY2F0ZWdvcnkgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5Q2F0ZWdvcnkoKTogVDtcblxufVxuXG4vLyBAdHMtaWdub3JlXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0Ly8gQHRzLWlnbm9yZVxuXHRtb2R1bGUuZXhwb3J0cyA9IFRhc2tzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBbUNBLFNBQVMsZUFBZTtBQUN4QixTQUFTLGNBQWM7QUFFdkIsTUFBTSxZQUFZLEtBQUssS0FBSyxvREFBb0Q7QUFFekUsTUFBTSxNQUFNO0FBQUEsRUFFbEIsT0FBYyxPQUFtQjtBQUNoQyxVQUFNLFFBQWUsS0FBSyxNQUFNLFVBQVUsU0FBUyxDQUFDO0FBQ3BELFdBQU8sTUFBTSxJQUFJLE9BQUssSUFBSSxTQUFTLENBQUMsQ0FBQztBQUFBLEVBQ3RDO0FBQUEsRUFFQSxPQUFjLFlBQVksUUFBZ0IsY0FBMkI7QUFDcEUsV0FBTyxPQUFPLFdBQVcsVUFBVSxnQkFBZ0IsUUFBUSxZQUFZLENBQUM7QUFBQSxFQUN6RTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBYyxhQUFhLFFBQWtDO0FBQzVELFdBQU8sT0FBTyxlQUFlLFVBQVUsaUJBQWlCLE1BQU0sQ0FBQztBQUFBLEVBQ2hFO0FBQUEsRUFFQSxPQUFjLFlBQVksUUFBZ0IsY0FBc0IsT0FBa0I7QUFDakYsY0FBVSxnQkFBZ0IsUUFBUSxjQUFjLE9BQU8sZUFBZSxLQUFLLENBQUM7QUFBQSxFQUM3RTtBQUFBLEVBRUEsT0FBYyxhQUFhLFFBQWdCLFdBQW1D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
|