@pipeline-builder/api-core 5.2.5 → 5.2.7
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/lib/constants/ai-providers.js +1 -1
- package/lib/constants/http-status.js +1 -1
- package/lib/constants/index.js +1 -1
- package/lib/constants/time.js +1 -1
- package/lib/errors/app-errors.js +1 -1
- package/lib/errors/index.js +1 -1
- package/lib/helpers/access-helpers.d.ts +19 -0
- package/lib/helpers/access-helpers.js +24 -4
- package/lib/helpers/content-disposition.js +1 -1
- package/lib/helpers/crud-helpers.js +1 -1
- package/lib/helpers/index.d.ts +1 -1
- package/lib/helpers/index.js +2 -2
- package/lib/helpers/org-hierarchy-http.js +1 -1
- package/lib/helpers/org-hierarchy.js +1 -1
- package/lib/helpers/restore-helpers.js +1 -1
- package/lib/helpers/sse-helpers.js +13 -2
- package/lib/helpers/support-calendar.js +1 -1
- package/lib/index.js +1 -1
- package/lib/middleware/ask-provenance.js +1 -1
- package/lib/middleware/assurance.js +1 -1
- package/lib/middleware/auth.js +1 -1
- package/lib/middleware/deferred-quota-check.js +1 -1
- package/lib/middleware/ecosystem-guard.js +1 -1
- package/lib/middleware/index.js +1 -1
- package/lib/middleware/jwt-verify.js +1 -1
- package/lib/middleware/mongo-sanitize.js +1 -1
- package/lib/middleware/on-behalf.js +1 -1
- package/lib/middleware/permission-gates.js +1 -1
- package/lib/middleware/quota-exempt-routes.js +1 -1
- package/lib/middleware/revocation.js +1 -1
- package/lib/middleware/route-table.js +16 -1
- package/lib/middleware/service-tokens.js +1 -1
- package/lib/middleware/step-up.js +1 -1
- package/lib/middleware/system-org.d.ts +18 -5
- package/lib/middleware/system-org.js +19 -6
- package/lib/openapi/extend-zod.js +1 -1
- package/lib/openapi/index.js +1 -1
- package/lib/openapi/registry.js +1 -1
- package/lib/openapi/routes/ask-routes.js +1 -1
- package/lib/openapi/routes/billing-routes.js +1 -1
- package/lib/openapi/routes/image-registry-routes.js +1 -1
- package/lib/openapi/routes/index.js +1 -1
- package/lib/openapi/routes/message-routes.js +1 -1
- package/lib/openapi/routes/pipeline-routes.js +1 -1
- package/lib/openapi/routes/pipeline-template-routes.js +1 -1
- package/lib/openapi/routes/plugin-routes.js +1 -1
- package/lib/openapi/routes/quota-routes.js +1 -1
- package/lib/openapi/schema-registry.js +1 -1
- package/lib/routes/health.js +1 -1
- package/lib/routes/index.js +1 -1
- package/lib/services/ai-call-weight.js +1 -1
- package/lib/services/alert-delivery.js +1 -1
- package/lib/services/api-key-exchange.js +1 -1
- package/lib/services/audit-context.js +1 -1
- package/lib/services/audit-spool.js +1 -1
- package/lib/services/cache-service.js +1 -1
- package/lib/services/circuit-breaker.js +1 -1
- package/lib/services/compliance-client.js +1 -1
- package/lib/services/compliance-event-subscriber.js +1 -1
- package/lib/services/durable-event-bus.js +1 -1
- package/lib/services/ecosystem-notify-client.d.ts +7 -1
- package/lib/services/ecosystem-notify-client.js +9 -3
- package/lib/services/entity-events.js +1 -1
- package/lib/services/env-redis.js +1 -1
- package/lib/services/http-client.js +19 -3
- package/lib/services/index.d.ts +1 -1
- package/lib/services/index.js +2 -2
- package/lib/services/jwks-cache.js +1 -1
- package/lib/services/leader-lock.js +1 -1
- package/lib/services/notification-channels.js +1 -1
- package/lib/services/org-ai-client.js +1 -1
- package/lib/services/pagerduty-inbound.js +1 -1
- package/lib/services/pagerduty.js +1 -1
- package/lib/services/quota-increment-batcher.js +1 -1
- package/lib/services/quota.js +1 -1
- package/lib/services/remote-audit-client.js +1 -1
- package/lib/services/retry-forever.js +1 -1
- package/lib/services/retry-strategy.js +1 -1
- package/lib/services/s3-client.js +1 -1
- package/lib/services/scheduler.js +1 -1
- package/lib/services/service-boot.js +1 -1
- package/lib/services/service-keys.js +2 -2
- package/lib/services/sse-ticket-store.js +1 -1
- package/lib/services/system-notification.js +1 -1
- package/lib/services/token-revocation.js +1 -1
- package/lib/services/version-vuln-policy.d.ts +11 -0
- package/lib/services/version-vuln-policy.js +33 -7
- package/lib/types/ai-catalog.js +1 -1
- package/lib/types/ask-proposals.d.ts +23 -0
- package/lib/types/ask-proposals.js +29 -1
- package/lib/types/audit-events.js +1 -1
- package/lib/types/build-catalog.d.ts +65 -0
- package/lib/types/build-catalog.js +95 -1
- package/lib/types/catalog-metadata.js +1 -1
- package/lib/types/common.js +1 -1
- package/lib/types/compliance-exemption.js +1 -1
- package/lib/types/ecosystem-notifications.d.ts +9 -0
- package/lib/types/ecosystem-notifications.js +15 -6
- package/lib/types/ecosystem.d.ts +1 -6
- package/lib/types/ecosystem.js +18 -5
- package/lib/types/error-codes.js +1 -1
- package/lib/types/feature-flags.d.ts +17 -1
- package/lib/types/feature-flags.js +1 -1
- package/lib/types/http.js +1 -1
- package/lib/types/index.d.ts +3 -3
- package/lib/types/index.js +4 -4
- package/lib/types/metadata-keys.js +1 -1
- package/lib/types/permissions.d.ts +60 -13
- package/lib/types/permissions.js +63 -14
- package/lib/types/pipeline-template.js +1 -1
- package/lib/types/pipeline.js +1 -1
- package/lib/types/plugin-catalog.js +1 -1
- package/lib/types/plugin-health.js +1 -1
- package/lib/types/plugin-scan.d.ts +69 -0
- package/lib/types/plugin-scan.js +77 -1
- package/lib/types/quota-catalog.js +15 -2
- package/lib/types/quota-tiers.d.ts +27 -160
- package/lib/types/quota-tiers.js +47 -255
- package/lib/types/remote-audit-actions.d.ts +1 -1
- package/lib/types/remote-audit-actions.js +9 -1
- package/lib/types/reserved-tags.js +1 -1
- package/lib/types/tier-limits.d.ts +210 -0
- package/lib/types/tier-limits.js +254 -0
- package/lib/types/usage-projection.js +1 -1
- package/lib/types/visibility.js +1 -1
- package/lib/types/wire-vocabulary.d.ts +7 -0
- package/lib/types/wire-vocabulary.js +7 -1
- package/lib/utils/alias-resolver.js +1 -1
- package/lib/utils/api-key.js +1 -1
- package/lib/utils/audit.js +1 -1
- package/lib/utils/aws-scrub.js +3 -3
- package/lib/utils/compliance-attributes.js +1 -1
- package/lib/utils/concurrency-gate.d.ts +98 -0
- package/lib/utils/concurrency-gate.js +110 -0
- package/lib/utils/concurrency.js +1 -1
- package/lib/utils/crash-handlers.js +1 -1
- package/lib/utils/date.js +1 -1
- package/lib/utils/dsse.js +1 -1
- package/lib/utils/env.d.ts +11 -0
- package/lib/utils/env.js +14 -1
- package/lib/utils/headers.js +1 -1
- package/lib/utils/identity.js +1 -1
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.js +2 -1
- package/lib/utils/jwk.js +2 -2
- package/lib/utils/logger.js +1 -1
- package/lib/utils/metric-emitter.js +1 -1
- package/lib/utils/object.js +1 -1
- package/lib/utils/params.js +1 -1
- package/lib/utils/plugin-compliance.d.ts +9 -1
- package/lib/utils/plugin-compliance.js +1 -1
- package/lib/utils/proof-of-work.js +1 -1
- package/lib/utils/response.js +1 -1
- package/lib/utils/retention.js +1 -1
- package/lib/utils/safe-require.js +1 -1
- package/lib/utils/secret-encryption.js +1 -1
- package/lib/utils/secret-rotation.js +1 -1
- package/lib/utils/secure-compare.js +1 -1
- package/lib/utils/sensitive-patterns.js +1 -1
- package/lib/utils/service-registry.js +1 -1
- package/lib/utils/ssrf.js +1 -1
- package/lib/validation/ai-schemas.js +1 -1
- package/lib/validation/common-schemas.js +1 -1
- package/lib/validation/dockerfile-static.js +1 -1
- package/lib/validation/index.d.ts +1 -1
- package/lib/validation/index.js +2 -2
- package/lib/validation/message-schemas.d.ts +73 -0
- package/lib/validation/message-schemas.js +63 -2
- package/lib/validation/middleware.js +1 -1
- package/lib/validation/pipeline-schemas.js +1 -1
- package/lib/validation/pipeline-template-schemas.js +1 -1
- package/lib/validation/plugin-base-images.js +1 -1
- package/lib/validation/plugin-catalog-detect.js +1 -1
- package/lib/validation/plugin-catalog-metadata.js +1 -1
- package/lib/validation/plugin-heuristics.js +1 -1
- package/lib/validation/plugin-lint.js +1 -1
- package/lib/validation/plugin-name-confusable.js +1 -1
- package/lib/validation/plugin-schemas.js +1 -1
- package/lib/validation/plugin-spec-schema.js +1 -1
- package/lib/validation/plugin-template-contract.js +1 -1
- package/package.json +11 -4
|
@@ -10,4 +10,4 @@
|
|
|
10
10
|
*/
|
|
11
11
|
/** Scalar types a template input can carry. */
|
|
12
12
|
export const TEMPLATE_INPUT_TYPES = ['string', 'number', 'boolean'];
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtdGVtcGxhdGUuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9waXBlbGluZS10ZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7O0dBT0c7QUFFSCwrQ0FBK0M7QUFDL0MsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogR29sZGVuLXBhdGggcGlwZWxpbmUgdGVtcGxhdGVzOiBhIHBhcmFtZXRlcml6ZWQgc3RhcnRlciBhIGRldmVsb3BlclxuICogaW5zdGFudGlhdGVzIChmaWxscyBpbnB1dHMpIHRvIGNyZWF0ZSBhIG5ldyBwaXBlbGluZS4gVGhlIHRlbXBsYXRlIGJvZHkgaXMgYVxuICogQnVpbGRlclByb3BzIHdpdGggYHt7IHZhcnMuKiB9fWAgcGxhY2Vob2xkZXJzOyBlYWNoIGRlY2xhcmVkIGlucHV0IG1hcHMgdG8gYVxuICogYHZhcnMuPG5hbWU+YCB2YWx1ZS4gSW5zdGFudGlhdGlvbiBiYWtlcyB0aGUgc3VwcGxpZWQgaW5wdXRzIGludG8gdGhlIG5ld1xuICogcGlwZWxpbmUncyBgcHJvcHMudmFyc2Ag4oCUIHRoZSBwbGFjZWhvbGRlcnMgcmVzb2x2ZSBhdCBzeW50aCB0aW1lIGxpa2UgYW55XG4gKiBvdGhlciBwaXBlbGluZSB2YXIgKG5vIHNlcGFyYXRlIHRlbXBsYXRlIHJ1bnRpbWUpLlxuICovXG5cbi8qKiBTY2FsYXIgdHlwZXMgYSB0ZW1wbGF0ZSBpbnB1dCBjYW4gY2FycnkuICovXG5leHBvcnQgY29uc3QgVEVNUExBVEVfSU5QVVRfVFlQRVMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgVGVtcGxhdGVJbnB1dFR5cGUgPSAodHlwZW9mIFRFTVBMQVRFX0lOUFVUX1RZUEVTKVtudW1iZXJdO1xuXG4vKipcbiAqIE9uZSBkZWNsYXJlZCBpbnB1dCBvZiBhIHBpcGVsaW5lIHRlbXBsYXRlLiBgbmFtZWAgaXMgdGhlIGB2YXJzLjxuYW1lPmAga2V5IHRoZVxuICogdGVtcGxhdGUgYm9keSByZWZlcmVuY2VzLiBUaGlzIGlzIHRoZSB0ZW1wbGF0ZSdzIGNvdW50ZXJwYXJ0IHRvIGEgcGx1Z2luJ3NcbiAqIGByZXF1aXJlZFZhcnNgIGNvbnRyYWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlSW5wdXQge1xuICAvKiogVmFyaWFibGUga2V5IOKAlCByZWZlcmVuY2VkIGluIHRoZSB0ZW1wbGF0ZSBib2R5IGFzIGB7eyB2YXJzLjxuYW1lPiB9fWAuICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIEh1bWFuIGxhYmVsIGZvciB0aGUgaW5zdGFudGlhdGUgZm9ybSAoZmFsbHMgYmFjayB0byBgbmFtZWApLiAqL1xuICByZWFkb25seSBsYWJlbD86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHR5cGU6IFRlbXBsYXRlSW5wdXRUeXBlO1xuICAvKiogV2hlbiB0cnVlLCBpbnN0YW50aWF0aW9uIGZhaWxzIGlmIG5vIHZhbHVlIChhbmQgbm8gZGVmYXVsdCkgaXMgc3VwcGxpZWQuICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgLyoqIERlZmF1bHQgYXBwbGllZCB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgaW5wdXQgYmxhbmsuICovXG4gIHJlYWRvbmx5IGRlZmF1bHQ/OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuICAvKiogT3B0aW9uYWwgZml4ZWQgY2hvaWNlIHNldCAocmVuZGVycyBhcyBhIHNlbGVjdCBpbiB0aGUgVUkpLiAqL1xuICByZWFkb25seSBvcHRpb25zPzogc3RyaW5nW107XG59XG4iXX0=
|
package/lib/types/pipeline.js
CHANGED
|
@@ -84,4 +84,4 @@ export const PluginType = {
|
|
|
84
84
|
SHELL_STEP: 'ShellStep',
|
|
85
85
|
MANUAL_APPROVAL_STEP: 'ManualApprovalStep',
|
|
86
86
|
};
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9waXBlbGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBV3RDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRztJQUN6QixLQUFLLEVBQUUsT0FBTztJQUNkLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLEtBQUssRUFBRSxPQUFPO0lBQ2QsUUFBUSxFQUFFLFVBQVU7Q0FDWixDQUFDO0FBR1g7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBMEM7SUFDM0UsS0FBSyxFQUFFLENBQUM7SUFDUixNQUFNLEVBQUUsQ0FBQztJQUNULEtBQUssRUFBRSxDQUFDO0lBQ1IsUUFBUSxFQUFFLEVBQUU7Q0FDYixDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxHQUE4QjtJQUNqRSxJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNoQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNqRyw0REFBNEQ7SUFDNUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN6RSxPQUFRLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDO0FBQy9GLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsVUFBcUMsRUFBRSxXQUErQjtJQUN0RyxJQUFJLFVBQVUsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVc7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN6RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLGVBQWUsRUFBRSxlQUFlO0lBQ2hDLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLG9CQUFvQixFQUFFLG9CQUFvQjtDQUNsQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU2hhcmVkIHBpcGVsaW5lIHR5cGVzIHVzZWQgYnkgYm90aCBwaXBlbGluZS1jb3JlIGFuZCBwaXBlbGluZS1kYXRhXG4gKi9cblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gZXh0cmFjdCB0aGUgdW5pb24gb2YgYWxsIHZhbHVlcyBmcm9tIGFuIG9iamVjdCB0eXBlXG4gKi9cbnR5cGUgVmFsdWVPZjxUPiA9IFRba2V5b2YgVF07XG5cbi8qKlxuICogQVdTIENvZGVCdWlsZCBjb21wdXRlIHJlc291cmNlIHNpemVzXG4gKlxuICogQHByb3BlcnR5IFNNQUxMIC0gMyBHQiBtZW1vcnksIDIgdkNQVXNcbiAqIEBwcm9wZXJ0eSBNRURJVU0gLSA3IEdCIG1lbW9yeSwgNCB2Q1BVc1xuICogQHByb3BlcnR5IExBUkdFIC0gMTUgR0IgbWVtb3J5LCA4IHZDUFVzXG4gKiBAcHJvcGVydHkgWDJfTEFSR0UgLSAxNDUgR0IgbWVtb3J5LCA3MiB2Q1BVc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NvZGVidWlsZC9sYXRlc3QvdXNlcmd1aWRlL2J1aWxkLWVudi1yZWYtY29tcHV0ZS10eXBlcy5odG1sXG4gKi9cbmV4cG9ydCBjb25zdCBDb21wdXRlVHlwZSA9IHtcbiAgU01BTEw6ICdTTUFMTCcsXG4gIE1FRElVTTogJ01FRElVTScsXG4gIExBUkdFOiAnTEFSR0UnLFxuICBYMl9MQVJHRTogJ1gyX0xBUkdFJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBDb21wdXRlVHlwZSA9IFZhbHVlT2Y8dHlwZW9mIENvbXB1dGVUeXBlPjtcblxuLyoqXG4gKiB2Q1BVIGVhY2ggQ29kZUJ1aWxkIGNvbXB1dGUgc2l6ZSBwcm92aWRlcywgZm9yIHR1cm5pbmcgYSBidWlsZCdzIERVUkFUSU9OXG4gKiBpbnRvIGBjcHVDcmVkaXRzYCAob25lIGNyZWRpdCA9IG9uZSB2Q1BVLW1pbnV0ZSkuXG4gKlxuICogRGVyaXZlZCBmcm9tIHRoZSBzYW1lIEFXUyB0YWJsZSB0aGUgYENvbXB1dGVUeXBlYCBkb2MgYWJvdmUgY2l0ZXMsIGFuZCBrZXB0XG4gKiBiZXNpZGUgaXQgb24gcHVycG9zZTogdGhlIG1lbW9yeS92Q1BVIGZpZ3VyZXMgaW4gdGhhdCBjb21tZW50IGFuZCB0aGUgbnVtYmVyc1xuICogaGVyZSBhcmUgdGhlIHNhbWUgZmFjdCwgYW5kIHNwbGl0dGluZyB0aGVtIGlzIGhvdyBvbmUgZ2V0cyB1cGRhdGVkIGFsb25lLlxuICpcbiAqIGBYMl9MQVJHRWAgaXMgNzIgdkNQVSDigJQgdGhpcnR5LXNpeCB0aW1lcyBTTUFMTC4gVGhhdCByYXRpbyBpcyB3aHkgcGlwZWxpbmVcbiAqIGV4ZWN1dGlvbiBjYW5ub3QgYmUgY2hhcmdlZCBieSB3YWxsLWNsb2NrIGFsb25lLCBhbmQgd2h5IGluZ2VzdGluZyBpdFxuICogKFBoYXNlIDQpIHJlLWRlcml2ZXMgdGhlIHRpZXIgbGFkZGVyIHJhdGhlciB0aGFuIHNpbXBseSBhZGRpbmcgdG8gaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBDT0RFQlVJTERfQ09NUFVURV9WQ1BVOiBSZWFkb25seTxSZWNvcmQ8Q29tcHV0ZVR5cGUsIG51bWJlcj4+ID0ge1xuICBTTUFMTDogMixcbiAgTUVESVVNOiA0LFxuICBMQVJHRTogOCxcbiAgWDJfTEFSR0U6IDcyLFxufTtcblxuLyoqXG4gKiBBV1MncyBvd24gc3BlbGxpbmcgb2YgYSBjb21wdXRlIHNpemUsIGFzIGBCYXRjaEdldEJ1aWxkc2AgcmV0dXJucyBpdFxuICogKGBlbnZpcm9ubWVudC5jb21wdXRlVHlwZWApLCBuYXJyb3dlZCB0byBvdXJzLlxuICpcbiAqIE5lZWRlZCBiZWNhdXNlIHRoZSB0d28gdm9jYWJ1bGFyaWVzIGRpZmZlcjogdGhlIHBpcGVsaW5lIGNvbmZpZyBzdG9yZXNcbiAqIGBNRURJVU1gLCBBV1MgYW5zd2VycyBgQlVJTERfR0VORVJBTDFfTUVESVVNYCwgYW5kIGEgd3JvbmcgbWF0Y2ggaGVyZSB3b3VsZFxuICogcHJpY2UgYSBidWlsZCBhdCB0aGUgd3JvbmcgdkNQVSByYXRoZXIgdGhhbiBmYWlsaW5nIHZpc2libHkuIEFueXRoaW5nXG4gKiB1bnJlY29nbmlzZWQgcmV0dXJucyBgbnVsbGAg4oCUIGFuIHVua25vd24gc2l6ZSBtdXN0IGJlIHJlcG9ydGVkIGFzIHVua25vd24sIG5vdFxuICogc2lsZW50bHkgcHJpY2VkIGFzIFNNQUxMLCB3aGljaCBpcyB0aGUgY2hlYXBlc3QgYW5kIHRoZXJlZm9yZSB0aGUgbW9zdFxuICogZmxhdHRlcmluZyBndWVzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXB1dGVUeXBlKHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IENvbXB1dGVUeXBlIHwgbnVsbCB7XG4gIGlmICghcmF3KSByZXR1cm4gbnVsbDtcbiAgY29uc3QgdXBwZXIgPSByYXcudG9VcHBlckNhc2UoKTtcbiAgY29uc3QgYmFyZSA9IHVwcGVyLnN0YXJ0c1dpdGgoJ0JVSUxEX0dFTkVSQUwxXycpID8gdXBwZXIuc2xpY2UoJ0JVSUxEX0dFTkVSQUwxXycubGVuZ3RoKSA6IHVwcGVyO1xuICAvLyBBV1Mgc3BlbGxzIHRoZSBsYXJnZXN0IG9uZSBgMlhMQVJHRWA7IG91cnMgaXMgYFgyX0xBUkdFYC5cbiAgY29uc3Qga2V5ID0gYmFyZSA9PT0gJzJYTEFSR0UnIHx8IGJhcmUgPT09ICdYMkxBUkdFJyA/ICdYMl9MQVJHRScgOiBiYXJlO1xuICByZXR1cm4gKE9iamVjdC5rZXlzKENPREVCVUlMRF9DT01QVVRFX1ZDUFUpIGFzIENvbXB1dGVUeXBlW10pLmZpbmQoKGMpID0+IGMgPT09IGtleSkgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBDcmVkaXRzIG9uZSBDb2RlQnVpbGQgYWN0aW9uIGNvbnN1bWVkLCBmcm9tIGl0cyBkdXJhdGlvbiBhbmQgY29tcHV0ZSBzaXplLlxuICpcbiAqIFJvdW5kcyBVUCB0byB0aGUgd2hvbGUgY3JlZGl0LCBtYXRjaGluZyB0aGUgcGx1Z2luLWJ1aWxkIG1ldGVyXG4gKiAoYGNyZWRpdHNGb3JCdWlsZGApIOKAlCB0d28gbWV0ZXJzIGZlZWRpbmcgb25lIGNvdW50ZXIgbXVzdCByb3VuZCB0aGUgc2FtZSB3YXlcbiAqIG9yIHRoZSBjb3VudGVyIG1lYW5zIG5laXRoZXIuXG4gKlxuICogUmV0dXJucyBgbnVsbGAgcmF0aGVyIHRoYW4gMCB3aGVuIGVpdGhlciBpbnB1dCBpcyBtaXNzaW5nLCBhbmQgdGhlIGRpc3RpbmN0aW9uXG4gKiBpcyB0aGUgcG9pbnQ6IGEgYnVpbGQgd2l0aCBubyBtZWFzdXJlZCBkdXJhdGlvbiB3YXMgbm90IG9ic2VydmVkLCBhbmRcbiAqIHJlcG9ydGluZyB0aGF0IGFzIHplcm8gY29uc3VtcHRpb24gd291bGQgbWFrZSB0aGUgY292ZXJhZ2UgZ2FwIGxvb2sgbGlrZVxuICogaWRsZW5lc3MuIFRoZSBpbmdlc3QgY291bnRzIHRob3NlIHNlcGFyYXRlbHkgKGBtZWFzdXJlZD1cImZhbHNlXCJgKSBzbyB0aGVcbiAqIGNvdmVyYWdlIHJhdGlvIGlzIHZpc2libGUgQkVGT1JFIGFueW9uZSBwcmljZXMgYSB0aWVyIG9mZiB0aGlzIHNlcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDcmVkaXRzRm9yKGR1cmF0aW9uTXM6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGNvbXB1dGVUeXBlOiBDb21wdXRlVHlwZSB8IG51bGwpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKGR1cmF0aW9uTXMgPT0gbnVsbCB8fCAhKGR1cmF0aW9uTXMgPiAwKSB8fCAhY29tcHV0ZVR5cGUpIHJldHVybiBudWxsO1xuICByZXR1cm4gTWF0aC5jZWlsKChkdXJhdGlvbk1zIC8gNjBfMDAwKSAqIENPREVCVUlMRF9DT01QVVRFX1ZDUFVbY29tcHV0ZVR5cGVdKTtcbn1cblxuLyoqXG4gKiBUeXBlcyBvZiBwaXBlbGluZSBzdGVwcyB0aGF0IGNhbiBiZSBjcmVhdGVkIGJ5IHBsdWdpbnNcbiAqXG4gKiBAcHJvcGVydHkgQ09ERV9CVUlMRF9TVEVQIC0gRnVsbCBDb2RlQnVpbGQgc3RlcCB3aXRoIGN1c3RvbSBidWlsZCBlbnZpcm9ubWVudFxuICogQHByb3BlcnR5IFNIRUxMX1NURVAgLSBTaW1wbGUgc2hlbGwgc3RlcCB3aXRob3V0IGN1c3RvbSBidWlsZCBlbnZpcm9ubWVudFxuICogQHByb3BlcnR5IE1BTlVBTF9BUFBST1ZBTF9TVEVQIC0gTmF0aXZlIENESyBhcHByb3ZhbCBnYXRlIChubyBEb2NrZXIgaW1hZ2UsIG5vIGNvbW1hbmRzKVxuICovXG5leHBvcnQgY29uc3QgUGx1Z2luVHlwZSA9IHtcbiAgQ09ERV9CVUlMRF9TVEVQOiAnQ29kZUJ1aWxkU3RlcCcsXG4gIFNIRUxMX1NURVA6ICdTaGVsbFN0ZXAnLFxuICBNQU5VQUxfQVBQUk9WQUxfU1RFUDogJ01hbnVhbEFwcHJvdmFsU3RlcCcsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUGx1Z2luVHlwZSA9IFZhbHVlT2Y8dHlwZW9mIFBsdWdpblR5cGU+O1xuXG4vKipcbiAqIE1ldGFkYXRhIHR5cGUgZm9yIHN0b3JpbmcgY29uZmlndXJhdGlvbiBhbmQgY3VzdG9tIHByb3BlcnRpZXNcbiAqXG4gKiBTdXBwb3J0czpcbiAqIC0gU3RhbmRhcmQga2V5LXZhbHVlIHBhaXJzIChzdHJpbmcsIGJvb2xlYW4sIG51bWJlcilcbiAqIC0gQ3VzdG9tIEFXUyBDREsga2V5cyB3aXRoIHRoZSBwYXR0ZXJuIGBhd3M6Y2RrOntuYW1lc3BhY2V9OntrZXl9YFxuICogICAoYWxsIGxvd2VyY2FzZSDigJQgbWF0Y2hlcyB0aGUgZm9ybWF0IHByb2R1Y2VkIGJ5IGBnZXRDdXN0b21LZXlgKVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtZXRhZGF0YTogTWV0YURhdGFUeXBlID0ge1xuICogICBCVUlMRF9FTlY6ICdwcm9kdWN0aW9uJyxcbiAqICAgTk9ERV9WRVJTSU9OOiAnMTgnLFxuICogICBFTkFCTEVfQ0FDSEU6IHRydWUsXG4gKiAgIE1BWF9SRVRSSUVTOiAzXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIE1ldGFEYXRhVHlwZSA9XG4gIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXI+ICZcbiAgeyBbSyBpbiBgYXdzOmNkazoke3N0cmluZ31gXT86IHVua25vd24gfTtcbiJdfQ==
|
|
@@ -36,4 +36,4 @@ export const PLUGIN_CATALOG_FIELDS = [
|
|
|
36
36
|
export const PLUGIN_CATALOG_LINK_FIELDS = ['homepageUrl', 'sourceUrl', 'documentationUrl'];
|
|
37
37
|
/** Where a catalog field's value came from (stored per version in `metadata_sources`; `user` = edited by a person). */
|
|
38
38
|
export const METADATA_SOURCES = ['spec', 'readme', 'dockerfile', 'derived', 'user'];
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWNhdGFsb2cuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wbHVnaW4tY2F0YWxvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7R0FNRztBQUVILDBCQUEwQjtBQUMxQixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFDdEMscUNBQXFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQztBQUMzQyxxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBQzNDLG9EQUFvRDtBQUNwRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7QUFDdEMsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUFDO0FBQzVDLG9DQUFvQztBQUNwQyxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2pELHNDQUFzQztBQUN0QyxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3BELG1DQUFtQztBQUNuQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBRW5DLDZHQUE2RztBQUM3RyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVTtJQUMzRCxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxJQUFJO0NBQ25ELENBQUM7QUFHWCxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUc7SUFDbkMsYUFBYSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTO0lBQzFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxRQUFRO0NBQ3JFLENBQUM7QUFHWCxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQXNDLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBRTlILHVIQUF1SDtBQUN2SCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFBsdWdpbiBjYXRhbG9nIHZvY2FidWxhcnk6IHRoZSBkZXNjcmlwdGl2ZSAoZWRpdGFibGUpIGZpZWxkcyBvZiBhIHBsdWdpblxuICogdmVyc2lvbiwgdGhlIGNhdGVnb3J5IGlkcywgdGhlIHBlci1maWVsZCBwcm92ZW5hbmNlIHZhbHVlcyBhbmQgdGhlIHNpemVcbiAqIGxpbWl0cy4gRGVwZW5kZW5jeS1mcmVlIHNvIHRoZSBicm93c2VyIGltcG9ydHMgaXQgdGhyb3VnaCB0aGVcbiAqIGBAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZS9wbHVnaW4tY2F0YWxvZ2Agc3VicGF0aDsgdGhlIFpvZCB2YWxpZGF0b3JzIGJ1aWx0XG4gKiBvbiBpdCBsaXZlIGluIGB2YWxpZGF0aW9uL3BsdWdpbi1jYXRhbG9nLW1ldGFkYXRhLnRzYC5cbiAqL1xuXG4vKiogQ2FyZCBvbmUtbGluZXIgY2FwLiAqL1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9TVU1NQVJZX01BWCA9IDE2MDtcbi8qKiBgZGVzY3JpcHRpb25gIGNhcCwgY2hhcmFjdGVycy4gKi9cbmV4cG9ydCBjb25zdCBQTFVHSU5fREVTQ1JJUFRJT05fTUFYID0gMjAwMDtcbi8qKiBgZGlzcGxheU5hbWVgIGNhcCwgY2hhcmFjdGVycy4gKi9cbmV4cG9ydCBjb25zdCBQTFVHSU5fRElTUExBWV9OQU1FX01BWCA9IDEwMDtcbi8qKiBNYXgga2V5d29yZHMsIGFuZCBtYXggY2hhcmFjdGVycyBwZXIga2V5d29yZC4gKi9cbmV4cG9ydCBjb25zdCBQTFVHSU5fS0VZV09SRFNfTUFYID0gMTA7XG5leHBvcnQgY29uc3QgUExVR0lOX0tFWVdPUkRfTUFYX0xFTkdUSCA9IDMyO1xuLyoqIFJFQURNRS5tZCBjYXAsIGJ5dGVzIChVVEYtOCkuICovXG5leHBvcnQgY29uc3QgUExVR0lOX1JFQURNRV9NQVhfQllURVMgPSA2NCAqIDEwMjQ7XG4vKiogYGNoYW5nZWxvZ2AgY2FwLCBieXRlcyAoVVRGLTgpLiAqL1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9DSEFOR0VMT0dfTUFYX0JZVEVTID0gMzIgKiAxMDI0O1xuLyoqIFByb2plY3QgVVJMIGNhcCwgY2hhcmFjdGVycy4gKi9cbmV4cG9ydCBjb25zdCBQTFVHSU5fVVJMX01BWCA9IDIwNDg7XG5cbi8qKiBDYW5vbmljYWwgcGx1Z2luIGNhdGVnb3JpZXMgKHRoZSBkaXJlY3RvcnkncyBjYXRlZ29yeSBncmlkLCBgcGx1Z2luLXNwZWMueWFtbGAsIGByZXBvcnQtc2NoZW1hLmpzb25gKS4gKi9cbmV4cG9ydCBjb25zdCBQTFVHSU5fQ0FURUdPUklFUyA9IFtcbiAgJ2xhbmd1YWdlJywgJ3NlY3VyaXR5JywgJ3F1YWxpdHknLCAnbW9uaXRvcmluZycsICdhcnRpZmFjdCcsXG4gICdkZXBsb3knLCAnaW5mcmFzdHJ1Y3R1cmUnLCAndGVzdGluZycsICdub3RpZmljYXRpb24nLCAnYWknLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBsdWdpbkNhdGFsb2dDYXRlZ29yeSA9IHR5cGVvZiBQTFVHSU5fQ0FURUdPUklFU1tudW1iZXJdO1xuXG4vKiogRXZlcnkgZGVzY3JpcHRpdmUgKGVkaXRhYmxlKSBjYXRhbG9nIGZpZWxkLCBpbiBkaXNwbGF5IG9yZGVyLiAqL1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9DQVRBTE9HX0ZJRUxEUyA9IFtcbiAgJ2Rpc3BsYXlOYW1lJywgJ3N1bW1hcnknLCAnZGVzY3JpcHRpb24nLCAnY2F0ZWdvcnknLCAna2V5d29yZHMnLCAnbGljZW5zZScsXG4gICdob21lcGFnZVVybCcsICdzb3VyY2VVcmwnLCAnZG9jdW1lbnRhdGlvblVybCcsICdpY29uJywgJ2NoYW5nZWxvZycsICdyZWFkbWUnLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBsdWdpbkNhdGFsb2dGaWVsZCA9IHR5cGVvZiBQTFVHSU5fQ0FUQUxPR19GSUVMRFNbbnVtYmVyXTtcblxuLyoqIFRoZSBsaW5rIGZpZWxkcyDigJQgYSB1c2VyLWVkaXRlZCBsaW5rIGlzIGhpZ2hsaWdodGVkIGluIHJldmlldy4gKi9cbmV4cG9ydCBjb25zdCBQTFVHSU5fQ0FUQUxPR19MSU5LX0ZJRUxEUzogUmVhZG9ubHlBcnJheTxQbHVnaW5DYXRhbG9nRmllbGQ+ID0gWydob21lcGFnZVVybCcsICdzb3VyY2VVcmwnLCAnZG9jdW1lbnRhdGlvblVybCddO1xuXG4vKiogV2hlcmUgYSBjYXRhbG9nIGZpZWxkJ3MgdmFsdWUgY2FtZSBmcm9tIChzdG9yZWQgcGVyIHZlcnNpb24gaW4gYG1ldGFkYXRhX3NvdXJjZXNgOyBgdXNlcmAgPSBlZGl0ZWQgYnkgYSBwZXJzb24pLiAqL1xuZXhwb3J0IGNvbnN0IE1FVEFEQVRBX1NPVVJDRVMgPSBbJ3NwZWMnLCAncmVhZG1lJywgJ2RvY2tlcmZpbGUnLCAnZGVyaXZlZCcsICd1c2VyJ10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBNZXRhZGF0YVNvdXJjZSA9IHR5cGVvZiBNRVRBREFUQV9TT1VSQ0VTW251bWJlcl07XG4vKiogUGVyLWZpZWxkIHByb3ZlbmFuY2Ugb2YgYSB2ZXJzaW9uJ3MgY2F0YWxvZyBtZXRhZGF0YS4gKi9cbmV4cG9ydCB0eXBlIE1ldGFkYXRhU291cmNlcyA9IFBhcnRpYWw8UmVjb3JkPFBsdWdpbkNhdGFsb2dGaWVsZCwgTWV0YWRhdGFTb3VyY2U+PjtcbiJdfQ==
|
|
@@ -171,4 +171,4 @@ export function healthBand(score) {
|
|
|
171
171
|
return 'fair';
|
|
172
172
|
return 'poor';
|
|
173
173
|
}
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhlYWx0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wbHVnaW4taGVhbHRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQVUsQ0FBQztBQUdySCwwREFBMEQ7QUFDMUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUE4QztJQUN2RSxPQUFPLEVBQUUsRUFBRTtJQUNYLEtBQUssRUFBRSxFQUFFO0lBQ1QsU0FBUyxFQUFFLEVBQUU7SUFDYixNQUFNLEVBQUUsRUFBRTtJQUNWLFNBQVMsRUFBRSxFQUFFO0lBQ2IsSUFBSSxFQUFFLEVBQUU7SUFDUixNQUFNLEVBQUUsRUFBRTtDQUNYLENBQUM7QUFFRix1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLGdFQUFnRTtBQUNoRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLCtDQUErQztBQUMvQyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDcEMsOEZBQThGO0FBQzlGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUMzQyxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLENBQUM7QUFDNUMsb0dBQW9HO0FBQ3BHLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUM5QyxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxHQUFHLENBQUM7QUF3Qy9DLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQztBQUUxQixNQUFNLE1BQU0s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QUNELE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFJRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDbkMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBRW5DLE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBZ0M7SUFDekQsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3ZGLElBQUksS0FBSyxJQUFJLGdCQUFnQjtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzdDLElBQUksS0FBSyxJQUFJLGdCQUFnQjtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzdDLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgcGx1Z2luIEhFQUxUSCBTQ09SRSAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCk6IG9uZSAw4oCTMTAwXG4gKiBudW1iZXIgcGVyIGxpc3RpbmcsIGZyb20gc2V2ZW4gY29tcG9uZW50cy4gUHVyZSBhbmQgZGVwZW5kZW5jeS1mcmVlIHNvIHRoZVxuICogcGx1Z2luIHNlcnZpY2UgKHRoZSBzdGF0cyBzd2VlcCksIHRoZSBmcm9udGVuZCAodGhlIGJyZWFrZG93biBwYW5lbCdzXG4gKiBsYWJlbHMpIGFuZCB0aGUgdGVzdHMgc2hhcmUgb25lIGRlZmluaXRpb24uXG4gKlxuICogRWFjaCBjb21wb25lbnQgc2NvcmVzIDAuLjEgYW5kIGNhcnJpZXMgYSBmaXhlZCB3ZWlnaHQuIEEgY29tcG9uZW50IHdob3NlXG4gKiBpbnB1dHMgYXJlIG1pc3NpbmcgaXMgRFJPUFBFRCBhbmQgdGhlIHJlbWFpbmluZyB3ZWlnaHRzIGFyZSByZW5vcm1hbGl6ZWQ7IHdpdGhcbiAqIGZld2VyIHRoYW4ge0BsaW5rIEhFQUxUSF9NSU5fQ09NUE9ORU5UU30gY29tcG9uZW50cyB0aGUgc2NvcmUgaXMgbnVsbCAoXCJub3RcbiAqIGVub3VnaCBkYXRhXCIpLCBuZXZlciBhIGd1ZXNzLlxuICpcbiAqIHwgY29tcG9uZW50ICB8IHdlaWdodCB8IHNjb3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCBydW50aW1lICAgIHwgMjUgICAgIHwgMzAtZGF5IHN1Y2Nlc3MgcmF0ZTsgb25seSB3aXRoIOKJpSAyMCBydW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCB2dWxucyAgICAgIHwgMjAgICAgIHwgMSDiiJIgMC41wrdjcml0aWNhbCDiiJIgMC4xwrdoaWdoIChmbG9vciAwKSwgbGF0ZXN0IGxpc3RlZCB2ZXJzaW9uOyBzY2FubmVkIG9ubHkgfFxuICogfCBmcmVzaG5lc3MgIHwgMTUgICAgIHwgcmVsZWFzZSBhZ2UgKOKJpDkwZCAxIOKGkiAwIGF0IDU0MGQpIGF2ZXJhZ2VkIHdpdGggYmFzZS1pbWFnZSBhZ2UgKOKJpDYwZCAxIOKGkiAwIGF0IDM2NWQpIHdoZW4gcmVjb3JkZWQgfFxuICogfCBzaWduZWQgICAgIHwgMTAgICAgIHwgaW1hZ2UgZGlnZXN0IHByZXNlbnQgYW5kIHNpZ25lZCDih5IgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBzbW9rZVRlc3QgIHwgMTAgICAgIHwgc21va2UgdGVzdCBkZWNsYXJlZCDih5IgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBkb2NzICAgICAgIHwgMTAgICAgIHwgUkVBRE1FIDAuNSArIGxpY2Vuc2UgMC41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgcmF0aW5nICAgICB8IDEwICAgICB8IEJheWVzaWFuIHJhdGluZyAvIDU7IG9ubHkgd2l0aCDiiaUgMyByYXRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqL1xuXG5leHBvcnQgY29uc3QgSEVBTFRIX0NPTVBPTkVOVFMgPSBbJ3J1bnRpbWUnLCAndnVsbnMnLCAnZnJlc2huZXNzJywgJ3NpZ25lZCcsICdzbW9rZVRlc3QnLCAnZG9jcycsICdyYXRpbmcnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEhlYWx0aENvbXBvbmVudCA9ICh0eXBlb2YgSEVBTFRIX0NPTVBPTkVOVFMpW251bWJlcl07XG5cbi8qKiBOb21pbmFsIHdlaWdodCBvZiBlYWNoIGNvbXBvbmVudCAodGhleSBzdW0gdG8gMTAwKS4gKi9cbmV4cG9ydCBjb25zdCBIRUFMVEhfV0VJR0hUUzogUmVhZG9ubHk8UmVjb3JkPEhlYWx0aENvbXBvbmVudCwgbnVtYmVyPj4gPSB7XG4gIHJ1bnRpbWU6IDI1LFxuICB2dWxuczogMjAsXG4gIGZyZXNobmVzczogMTUsXG4gIHNpZ25lZDogMTAsXG4gIHNtb2tlVGVzdDogMTAsXG4gIGRvY3M6IDEwLFxuICByYXRpbmc6IDEwLFxufTtcblxuLyoqIEZld2VyIGF2YWlsYWJsZSBjb21wb25lbnRzIHRoYW4gdGhpcyDih5Igbm8gc2NvcmUuICovXG5leHBvcnQgY29uc3QgSEVBTFRIX01JTl9DT01QT05FTlRTID0gMztcbi8qKiBSdW5zIG5lZWRlZCBpbiB0aGUgd2luZG93IGJlZm9yZSB0aGUgc3VjY2VzcyByYXRlIGNvdW50cy4gKi9cbmV4cG9ydCBjb25zdCBIRUFMVEhfTUlOX1JVTlMgPSAyMDtcbi8qKiBSYXRpbmdzIG5lZWRlZCBiZWZvcmUgdGhlIHJhdGluZyBjb3VudHMuICovXG5leHBvcnQgY29uc3QgSEVBTFRIX01JTl9SQVRJTkdTID0gMztcbi8qKiBSZWxlYXNlIGFnZTogZnVsbCBtYXJrcyB1cCB0byB0aGlzIG1hbnkgZGF5cywgemVybyBhdCB7QGxpbmsgSEVBTFRIX1JFTEVBU0VfWkVST19EQVlTfS4gKi9cbmV4cG9ydCBjb25zdCBIRUFMVEhfUkVMRUFTRV9GVUxMX0RBWVMgPSA5MDtcbmV4cG9ydCBjb25zdCBIRUFMVEhfUkVMRUFTRV9aRVJPX0RBWVMgPSA1NDA7XG4vKiogQmFzZS1pbWFnZSBhZ2U6IGZ1bGwgbWFya3MgdXAgdG8gdGhpcyBtYW55IGRheXMsIHplcm8gYXQge0BsaW5rIEhFQUxUSF9CQVNFX0lNQUdFX1pFUk9fREFZU30uICovXG5leHBvcnQgY29uc3QgSEVBTFRIX0JBU0VfSU1BR0VfRlVMTF9EQVlTID0gNjA7XG5leHBvcnQgY29uc3QgSEVBTFRIX0JBU0VfSU1BR0VfWkVST19EQVlTID0gMzY1O1xuXG4vKiogT25lIGNvbXBvbmVudCdzIGNvbnRyaWJ1dGlvbjogaXRzIDAuLjEgc2NvcmUgKG51bGwgPSBtaXNzaW5nLCBkcm9wcGVkKSBhbmQgaXRzIG5vbWluYWwgd2VpZ2h0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDb21wb25lbnRTY29yZSB7XG4gIHNjb3JlOiBudW1iZXIgfCBudWxsO1xuICB3ZWlnaHQ6IG51bWJlcjtcbn1cbmV4cG9ydCB0eXBlIEhlYWx0aEJyZWFrZG93biA9IFJlY29yZDxIZWFsdGhDb21wb25lbnQsIEhlYWx0aENvbXBvbmVudFNjb3JlPjtcblxuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhSZXN1bHQge1xuICAvKiogMOKAkzEwMCBpbnRlZ2VyLCBvciBudWxsIHdpdGggZmV3ZXIgdGhhbiB7QGxpbmsgSEVBTFRIX01JTl9DT01QT05FTlRTfSBjb21wb25lbnRzLiAqL1xuICBzY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgYnJlYWtkb3duOiBIZWFsdGhCcmVha2Rvd247XG59XG5cbi8qKlxuICogV2hhdCB0aGUgc2NvcmUgaXMgY29tcHV0ZWQgZnJvbS4gRXZlcnkgZmllbGQgaXMgb3B0aW9uYWw6IGB1bmRlZmluZWRgIC8gbnVsbFxuICogbWVhbnMgXCJub3Qga25vd25cIiwgd2hpY2ggZHJvcHMgdGhlIGNvbXBvbmVudCAob3IsIGZvciBmcmVzaG5lc3MsIHRoYXQgaGFsZikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoSW5wdXRzIHtcbiAgLyoqIFRlcm1pbmFsIHJ1bnMgaW4gdGhlIDMwLWRheSB3aW5kb3csIGFuZCB0aGUgc2hhcmUgdGhhdCBzdWNjZWVkZWQgKDAuLjEpLiAqL1xuICBydW5zMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgc3VjY2Vzc1JhdGUzMGQ/OiBudW1iZXIgfCBudWxsO1xuICAvKiogVGhlIGxhdGVzdCBsaXN0ZWQgdmVyc2lvbidzIHNjYW47IGBzY2FubmVkQXRgIG51bGwg4oeSIG5ldmVyIHNjYW5uZWQuICovXG4gIHZ1bG5Dcml0aWNhbD86IG51bWJlciB8IG51bGw7XG4gIHZ1bG5IaWdoPzogbnVtYmVyIHwgbnVsbDtcbiAgc2Nhbm5lZEF0PzogRGF0ZSB8IHN0cmluZyB8IG51bGw7XG4gIC8qKiBXaGVuIHRoZSBsYXRlc3QgbGlzdGVkIHZlcnNpb24gd2FzIHB1Ymxpc2hlZC4gKi9cbiAgbGFzdFJlbGVhc2VBdD86IERhdGUgfCBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhlIGxhdGVzdCBsaXN0ZWQgdmVyc2lvbidzIGJhc2UgaW1hZ2UgYGNyZWF0ZWRgIHRpbWUsIHdoZW4gcmVjb3JkZWQuICovXG4gIGJhc2VJbWFnZUNyZWF0ZWRBdD86IERhdGUgfCBzdHJpbmcgfCBudWxsO1xuICAvKiogTGF0ZXN0IGxpc3RlZCB2ZXJzaW9uIGhhcyBhbiBpbWFnZSBkaWdlc3QgQU5EIGEgc2lnbmF0dXJlIChpdHMgYHB1YmxpYy8qYCBjb3B5KS4gKi9cbiAgc2lnbmVkPzogYm9vbGVhbiB8IG51bGw7XG4gIHNtb2tlVGVzdERlY2xhcmVkPzogYm9vbGVhbiB8IG51bGw7XG4gIGhhc1JlYWRtZT86IGJvb2xlYW4gfCBudWxsO1xuICBoYXNMaWNlbnNlPzogYm9vbGVhbiB8IG51bGw7XG4gIHJhdGluZ0JheWVzPzogbnVtYmVyIHwgbnVsbDtcbiAgcmF0aW5nQ291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuXG5jb25zdCBEQVlfTVMgPSA4Nl80MDBfMDAwO1xuXG5jb25zdCByb3VuZDMgPSAobjogbnVtYmVyKTogbnVtYmVyID0+IE1hdGgucm91bmQobiAqIDEwMDApIC8gMTAwMDtcbmNvbnN0IGNsYW1wMDEgPSAobjogbnVtYmVyKTogbnVtYmVyID0+IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIG4pKTtcblxuZnVuY3Rpb24gdG9UaW1lKGQ6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmIChkID09PSBudWxsIHx8IGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHQgPSBuZXcgRGF0ZShkKS5nZXRUaW1lKCk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodCkgPyB0IDogbnVsbDtcbn1cblxuLyoqIDEgdXAgdG8gYGZ1bGxEYXlzYCwgZmFsbGluZyBsaW5lYXJseSB0byAwIGF0IGB6ZXJvRGF5c2AgKGEgZnV0dXJlIGRhdGUgY291bnRzIGFzIGZyZXNoKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2VTY29yZShhZ2VEYXlzOiBudW1iZXIsIGZ1bGxEYXlzOiBudW1iZXIsIHplcm9EYXlzOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoYWdlRGF5cyA8PSBmdWxsRGF5cykgcmV0dXJuIDE7XG4gIGlmIChhZ2VEYXlzID49IHplcm9EYXlzKSByZXR1cm4gMDtcbiAgcmV0dXJuIGNsYW1wMDEoMSAtIChhZ2VEYXlzIC0gZnVsbERheXMpIC8gKHplcm9EYXlzIC0gZnVsbERheXMpKTtcbn1cblxuLyoqIFRoZSB2dWxuZXJhYmlsaXR5IGNvbXBvbmVudDogMSDiiJIgMC41wrdjcml0aWNhbCDiiJIgMC4xwrdoaWdoLCBmbG9vcmVkIGF0IDAuICovXG5leHBvcnQgZnVuY3Rpb24gdnVsblNjb3JlKGNyaXRpY2FsOiBudW1iZXIsIGhpZ2g6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBjbGFtcDAxKDEgLSAwLjUgKiBNYXRoLm1heCgwLCBjcml0aWNhbCkgLSAwLjEgKiBNYXRoLm1heCgwLCBoaWdoKSk7XG59XG5cbmZ1bmN0aW9uIHJ1bnRpbWVDb21wb25lbnQoaTogSGVhbHRoSW5wdXRzKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmIChpLnJ1bnMzMGQgPT09IG51bGwgfHwgaS5ydW5zMzBkID09PSB1bmRlZmluZWQgfHwgaS5ydW5zMzBkIDwgSEVBTFRIX01JTl9SVU5TKSByZXR1cm4gbnVsbDtcbiAgaWYgKGkuc3VjY2Vzc1JhdGUzMGQgPT09IG51bGwgfHwgaS5zdWNjZXNzUmF0ZTMwZCA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUoaS5zdWNjZXNzUmF0ZTMwZCkpIHJldHVybiBudWxsO1xuICByZXR1cm4gY2xhbXAwMShpLnN1Y2Nlc3NSYXRlMzBkKTtcbn1cblxuZnVuY3Rpb24gdnVsbnNDb21wb25lbnQoaTogSGVhbHRoSW5wdXRzKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICh0b1RpbWUoaS5zY2FubmVkQXQpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHZ1bG5TY29yZShpLnZ1bG5Dcml0aWNhbCA/PyAwLCBpLnZ1bG5IaWdoID8/IDApO1xufVxuXG5mdW5jdGlvbiBmcmVzaG5lc3NDb21wb25lbnQoaTogSGVhbHRoSW5wdXRzLCBub3c6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBwYXJ0czogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgcmVsZWFzZSA9IHRvVGltZShpLmxhc3RSZWxlYXNlQXQpO1xuICBpZiAocmVsZWFzZSAhPT0gbnVsbCkgcGFydHMucHVzaChhZ2VTY29yZSgobm93IC0gcmVsZWFzZSkgLyBEQVlfTVMsIEhFQUxUSF9SRUxFQVNFX0ZVTExfREFZUywgSEVBTFRIX1JFTEVBU0VfWkVST19EQVlTKSk7XG4gIGNvbnN0IGJhc2UgPSB0b1RpbWUoaS5iYXNlSW1hZ2VDcmVhdGVkQXQpO1xuICBpZiAoYmFzZSAhPT0gbnVsbCkgcGFydHMucHVzaChhZ2VTY29yZSgobm93IC0gYmFzZSkgLyBEQVlfTVMsIEhFQUxUSF9CQVNFX0lNQUdFX0ZVTExfREFZUywgSEVBTFRIX0JBU0VfSU1BR0VfWkVST19EQVlTKSk7XG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICByZXR1cm4gcGFydHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyBwYXJ0cy5sZW5ndGg7XG59XG5cbmNvbnN0IGZsYWcgPSAoYjogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgfCBudWxsID0+IChiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBiID8gMSA6IDApO1xuXG5mdW5jdGlvbiBkb2NzQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cyk6IG51bWJlciB8IG51bGwge1xuICBpZiAoKGkuaGFzUmVhZG1lID09PSBudWxsIHx8IGkuaGFzUmVhZG1lID09PSB1bmRlZmluZWQpICYmIChpLmhhc0xpY2Vuc2UgPT09IG51bGwgfHwgaS5oYXNMaWNlbnNlID09PSB1bmRlZmluZWQpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIChpLmhhc1JlYWRtZSA/IDAuNSA6IDApICsgKGkuaGFzTGljZW5zZSA/IDAuNSA6IDApO1xufVxuXG5mdW5jdGlvbiByYXRpbmdDb21wb25lbnQoaTogSGVhbHRoSW5wdXRzKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmIChpLnJhdGluZ0NvdW50ID09PSBudWxsIHx8IGkucmF0aW5nQ291bnQgPT09IHVuZGVmaW5lZCB8fCBpLnJhdGluZ0NvdW50IDwgSEVBTFRIX01JTl9SQVRJTkdTKSByZXR1cm4gbnVsbDtcbiAgaWYgKGkucmF0aW5nQmF5ZXMgPT09IG51bGwgfHwgaS5yYXRpbmdCYXllcyA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUoaS5yYXRpbmdCYXllcykpIHJldHVybiBudWxsO1xuICByZXR1cm4gY2xhbXAwMShpLnJhdGluZ0JheWVzIC8gNSk7XG59XG5cbi8qKiBUaGUgaGVhbHRoIHNjb3JlIGFuZCBpdHMgcGVyLWNvbXBvbmVudCBicmVha2Rvd24uIFB1cmU7IGBub3dgIGlzIGluamVjdGFibGUgZm9yIHRlc3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVIZWFsdGhTY29yZShpbnB1dHM6IEhlYWx0aElucHV0cywgbm93OiBEYXRlID0gbmV3IERhdGUoKSk6IEhlYWx0aFJlc3VsdCB7XG4gIGNvbnN0IHQgPSBub3cuZ2V0VGltZSgpO1xuICBjb25zdCByYXc6IFJlY29yZDxIZWFsdGhDb21wb25lbnQsIG51bWJlciB8IG51bGw+ID0ge1xuICAgIHJ1bnRpbWU6IHJ1bnRpbWVDb21wb25lbnQoaW5wdXRzKSxcbiAgICB2dWxuczogdnVsbnNDb21wb25lbnQoaW5wdXRzKSxcbiAgICBmcmVzaG5lc3M6IGZyZXNobmVzc0NvbXBvbmVudChpbnB1dHMsIHQpLFxuICAgIHNpZ25lZDogZmxhZyhpbnB1dHMuc2lnbmVkKSxcbiAgICBzbW9rZVRlc3Q6IGZsYWcoaW5wdXRzLnNtb2tlVGVzdERlY2xhcmVkKSxcbiAgICBkb2NzOiBkb2NzQ29tcG9uZW50KGlucHV0cyksXG4gICAgcmF0aW5nOiByYXRpbmdDb21wb25lbnQoaW5wdXRzKSxcbiAgfTtcbiAgY29uc3QgYnJlYWtkb3duID0ge30gYXMgSGVhbHRoQnJlYWtkb3duO1xuICBsZXQgd2VpZ2h0ZWQgPSAwO1xuICBsZXQgdG90YWxXZWlnaHQgPSAwO1xuICBsZXQgYXZhaWxhYmxlID0gMDtcbiAgZm9yIChjb25zdCBjIG9mIEhFQUxUSF9DT01QT05FTlRTKSB7XG4gICAgY29uc3Qgc2NvcmUgPSByYXdbY107XG4gICAgYnJlYWtkb3duW2NdID0geyBzY29yZTogc2NvcmUgPT09IG51bGwgPyBudWxsIDogcm91bmQzKHNjb3JlKSwgd2VpZ2h0OiBIRUFMVEhfV0VJR0hUU1tjXSB9O1xuICAgIGlmIChzY29yZSA9PT0gbnVsbCkgY29udGludWU7XG4gICAgYXZhaWxhYmxlKys7XG4gICAgd2VpZ2h0ZWQgKz0gc2NvcmUgKiBIRUFMVEhfV0VJR0hUU1tjXTtcbiAgICB0b3RhbFdlaWdodCArPSBIRUFMVEhfV0VJR0hUU1tjXTtcbiAgfVxuICBjb25zdCBzY29yZSA9IGF2YWlsYWJsZSA8IEhFQUxUSF9NSU5fQ09NUE9ORU5UUyB8fCB0b3RhbFdlaWdodCA9PT0gMCA/IG51bGwgOiBNYXRoLnJvdW5kKCgxMDAgKiB3ZWlnaHRlZCkgLyB0b3RhbFdlaWdodCk7XG4gIHJldHVybiB7IHNjb3JlLCBicmVha2Rvd24gfTtcbn1cblxuLyoqXG4gKiBBIHB1Ymxpc2hlcidzIGhlYWx0aDogdGhlIGluc3RhbGwtd2VpZ2h0ZWQgbWVhbiBvZiBpdHMgbGlzdGluZ3MnIHNjb3Jlc1xuICogKGxpc3RpbmdzIHdpdGggbm8gc2NvcmUgYXJlIHNraXBwZWQ7IHdoZW4gbm8gbGlzdGluZyBoYXMgaW5zdGFsbHMsIHRoZSBwbGFpblxuICogbWVhbikuIE51bGwgd2hlbiBubyBsaXN0aW5nIGhhcyBhIHNjb3JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaGVySGVhbHRoU2NvcmUobGlzdGluZ3M6IFJlYWRvbmx5QXJyYXk8eyBoZWFsdGhTY29yZTogbnVtYmVyIHwgbnVsbDsgaW5zdGFsbENvdW50OiBudW1iZXIgfT4pOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3Qgc2NvcmVkID0gbGlzdGluZ3MuZmlsdGVyKChsKTogbCBpcyB7IGhlYWx0aFNjb3JlOiBudW1iZXI7IGluc3RhbGxDb3VudDogbnVtYmVyIH0gPT5cbiAgICBsLmhlYWx0aFNjb3JlICE9PSBudWxsICYmIE51bWJlci5pc0Zpbml0ZShsLmhlYWx0aFNjb3JlKSk7XG4gIGlmIChzY29yZWQubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qgd2VpZ2h0T2YgPSAobjogbnVtYmVyKSA9PiBNYXRoLm1heCgwLCBuKTtcbiAgY29uc3QgdG90YWxJbnN0YWxscyA9IHNjb3JlZC5yZWR1Y2UoKGEsIGwpID0+IGEgKyB3ZWlnaHRPZihsLmluc3RhbGxDb3VudCksIDApO1xuICBpZiAodG90YWxJbnN0YWxscyA9PT0gMCkgcmV0dXJuIE1hdGgucm91bmQoc2NvcmVkLnJlZHVjZSgoYSwgbCkgPT4gYSArIGwuaGVhbHRoU2NvcmUsIDApIC8gc2NvcmVkLmxlbmd0aCk7XG4gIHJldHVybiBNYXRoLnJvdW5kKHNjb3JlZC5yZWR1Y2UoKGEsIGwpID0+IGEgKyBsLmhlYWx0aFNjb3JlICogd2VpZ2h0T2YobC5pbnN0YWxsQ291bnQpLCAwKSAvIHRvdGFsSW5zdGFsbHMpO1xufVxuXG4vKipcbiAqIEEgcHVibGlzaGVyJ3MgMzAtZGF5IHN1Y2Nlc3MgcmF0ZSBhY3Jvc3MgaXRzIGxpc3RpbmdzLCB3ZWlnaHRlZCBieSBydW5zLlxuICogTnVsbCB3aGVuIG5vbmUgb2YgaXRzIGxpc3RpbmdzIHJhbiBpbiB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaGVyU3VjY2Vzc1JhdGUobGlzdGluZ3M6IFJlYWRvbmx5QXJyYXk8eyBzdWNjZXNzUmF0ZTMwZDogbnVtYmVyIHwgbnVsbDsgcnVuczMwZDogbnVtYmVyIH0+KTogbnVtYmVyIHwgbnVsbCB7XG4gIGxldCBydW5zID0gMDtcbiAgbGV0IHN1Y2NlZWRlZCA9IDA7XG4gIGZvciAoY29uc3QgbCBvZiBsaXN0aW5ncykge1xuICAgIGlmIChsLnN1Y2Nlc3NSYXRlMzBkID09PSBudWxsIHx8ICFOdW1iZXIuaXNGaW5pdGUobC5zdWNjZXNzUmF0ZTMwZCkgfHwgbC5ydW5zMzBkIDw9IDApIGNvbnRpbnVlO1xuICAgIHJ1bnMgKz0gbC5ydW5zMzBkO1xuICAgIHN1Y2NlZWRlZCArPSBsLnN1Y2Nlc3NSYXRlMzBkICogbC5ydW5zMzBkO1xuICB9XG4gIHJldHVybiBydW5zID09PSAwID8gbnVsbCA6IHJvdW5kMyhzdWNjZWVkZWQgLyBydW5zKTtcbn1cblxuLyoqIERpc3BsYXkgYmFuZCBmb3IgYSBzY29yZTogZ29vZCDiiaUgODAsIGZhaXIg4omlIDUwLCBwb29yIGJlbG93LCB1bmtub3duIHdoZW4gbnVsbC4gKi9cbmV4cG9ydCB0eXBlIEhlYWx0aEJhbmQgPSAnZ29vZCcgfCAnZmFpcicgfCAncG9vcicgfCAndW5rbm93bic7XG5leHBvcnQgY29uc3QgSEVBTFRIX0JBTkRfR09PRCA9IDgwO1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9CQU5EX0ZBSVIgPSA1MDtcblxuZXhwb3J0IGZ1bmN0aW9uIGhlYWx0aEJhbmQoc2NvcmU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBIZWFsdGhCYW5kIHtcbiAgaWYgKHNjb3JlID09PSBudWxsIHx8IHNjb3JlID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZShzY29yZSkpIHJldHVybiAndW5rbm93bic7XG4gIGlmIChzY29yZSA+PSBIRUFMVEhfQkFORF9HT09EKSByZXR1cm4gJ2dvb2QnO1xuICBpZiAoc2NvcmUgPj0gSEVBTFRIX0JBTkRfRkFJUikgcmV0dXJuICdmYWlyJztcbiAgcmV0dXJuICdwb29yJztcbn1cbiJdfQ==
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhlYWx0aC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL3BsdWdpbi1oZWFsdGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBVSxDQUFDO0FBR3JILDBEQUEwRDtBQUMxRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQThDO0lBQ3ZFLE9BQU8sRUFBRSxFQUFFO0lBQ1gsS0FBSyxFQUFFLEVBQUU7SUFDVCxTQUFTLEVBQUUsRUFBRTtJQUNiLE1BQU0sRUFBRSxFQUFFO0lBQ1YsU0FBUyxFQUFFLEVBQUU7SUFDYixJQUFJLEVBQUUsRUFBRTtJQUNSLE1BQU0sRUFBRSxFQUFFO0NBQ1gsQ0FBQztBQUVGLHVEQUF1RDtBQUN2RCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFDdkMsZ0VBQWdFO0FBQ2hFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDbEMsK0NBQStDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUNwQyw4RkFBOEY7QUFDOUYsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDO0FBQzNDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztBQUM1QyxvR0FBb0c7QUFDcEcsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEdBQUcsQ0FBQztBQXdDL0MsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDO0FBRTFCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBUyxF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QUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUlELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUNuQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFFbkMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFnQztJQUN6RCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDdkYsSUFBSSxLQUFLLElBQUksZ0JBQWdCO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDN0MsSUFBSSxLQUFLLElBQUksZ0JBQWdCO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDN0MsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBwbHVnaW4gSEVBTFRIIFNDT1JFIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKTogb25lIDDigJMxMDBcbiAqIG51bWJlciBwZXIgbGlzdGluZywgZnJvbSBzZXZlbiBjb21wb25lbnRzLiBQdXJlIGFuZCBkZXBlbmRlbmN5LWZyZWUgc28gdGhlXG4gKiBwbHVnaW4gc2VydmljZSAodGhlIHN0YXRzIHN3ZWVwKSwgdGhlIGZyb250ZW5kICh0aGUgYnJlYWtkb3duIHBhbmVsJ3NcbiAqIGxhYmVscykgYW5kIHRoZSB0ZXN0cyBzaGFyZSBvbmUgZGVmaW5pdGlvbi5cbiAqXG4gKiBFYWNoIGNvbXBvbmVudCBzY29yZXMgMC4uMSBhbmQgY2FycmllcyBhIGZpeGVkIHdlaWdodC4gQSBjb21wb25lbnQgd2hvc2VcbiAqIGlucHV0cyBhcmUgbWlzc2luZyBpcyBEUk9QUEVEIGFuZCB0aGUgcmVtYWluaW5nIHdlaWdodHMgYXJlIHJlbm9ybWFsaXplZDsgd2l0aFxuICogZmV3ZXIgdGhhbiB7QGxpbmsgSEVBTFRIX01JTl9DT01QT05FTlRTfSBjb21wb25lbnRzIHRoZSBzY29yZSBpcyBudWxsIChcIm5vdFxuICogZW5vdWdoIGRhdGFcIiksIG5ldmVyIGEgZ3Vlc3MuXG4gKlxuICogfCBjb21wb25lbnQgIHwgd2VpZ2h0IHwgc2NvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IHJ1bnRpbWUgICAgfCAyNSAgICAgfCAzMC1kYXkgc3VjY2VzcyByYXRlOyBvbmx5IHdpdGgg4omlIDIwIHJ1bnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHZ1bG5zICAgICAgfCAyMCAgICAgfCAxIOKIkiAwLjXCt2NyaXRpY2FsIOKIkiAwLjHCt2hpZ2ggKGZsb29yIDApLCBsYXRlc3QgbGlzdGVkIHZlcnNpb247IHNjYW5uZWQgb25seSB8XG4gKiB8IGZyZXNobmVzcyAgfCAxNSAgICAgfCByZWxlYXNlIGFnZSAo4omkOTBkIDEg4oaSIDAgYXQgNTQwZCkgYXZlcmFnZWQgd2l0aCBiYXNlLWltYWdlIGFnZSAo4omkNjBkIDEg4oaSIDAgYXQgMzY1ZCkgd2hlbiByZWNvcmRlZCB8XG4gKiB8IHNpZ25lZCAgICAgfCAxMCAgICAgfCBpbWFnZSBkaWdlc3QgcHJlc2VudCBhbmQgc2lnbmVkIOKHkiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHNtb2tlVGVzdCAgfCAxMCAgICAgfCBzbW9rZSB0ZXN0IGRlY2xhcmVkIOKHkiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IGRvY3MgICAgICAgfCAxMCAgICAgfCBSRUFETUUgMC41ICsgbGljZW5zZSAwLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCByYXRpbmcgICAgIHwgMTAgICAgIHwgQmF5ZXNpYW4gcmF0aW5nIC8gNTsgb25seSB3aXRoIOKJpSAzIHJhdGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICovXG5cbmV4cG9ydCBjb25zdCBIRUFMVEhfQ09NUE9ORU5UUyA9IFsncnVudGltZScsICd2dWxucycsICdmcmVzaG5lc3MnLCAnc2lnbmVkJywgJ3Ntb2tlVGVzdCcsICdkb2NzJywgJ3JhdGluZyddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSGVhbHRoQ29tcG9uZW50ID0gKHR5cGVvZiBIRUFMVEhfQ09NUE9ORU5UUylbbnVtYmVyXTtcblxuLyoqIE5vbWluYWwgd2VpZ2h0IG9mIGVhY2ggY29tcG9uZW50ICh0aGV5IHN1bSB0byAxMDApLiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9XRUlHSFRTOiBSZWFkb25seTxSZWNvcmQ8SGVhbHRoQ29tcG9uZW50LCBudW1iZXI+PiA9IHtcbiAgcnVudGltZTogMjUsXG4gIHZ1bG5zOiAyMCxcbiAgZnJlc2huZXNzOiAxNSxcbiAgc2lnbmVkOiAxMCxcbiAgc21va2VUZXN0OiAxMCxcbiAgZG9jczogMTAsXG4gIHJhdGluZzogMTAsXG59O1xuXG4vKiogRmV3ZXIgYXZhaWxhYmxlIGNvbXBvbmVudHMgdGhhbiB0aGlzIOKHkiBubyBzY29yZS4gKi9cbmV4cG9ydCBjb25zdCBIRUFMVEhfTUlOX0NPTVBPTkVOVFMgPSAzO1xuLyoqIFJ1bnMgbmVlZGVkIGluIHRoZSB3aW5kb3cgYmVmb3JlIHRoZSBzdWNjZXNzIHJhdGUgY291bnRzLiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9NSU5fUlVOUyA9IDIwO1xuLyoqIFJhdGluZ3MgbmVlZGVkIGJlZm9yZSB0aGUgcmF0aW5nIGNvdW50cy4gKi9cbmV4cG9ydCBjb25zdCBIRUFMVEhfTUlOX1JBVElOR1MgPSAzO1xuLyoqIFJlbGVhc2UgYWdlOiBmdWxsIG1hcmtzIHVwIHRvIHRoaXMgbWFueSBkYXlzLCB6ZXJvIGF0IHtAbGluayBIRUFMVEhfUkVMRUFTRV9aRVJPX0RBWVN9LiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9SRUxFQVNFX0ZVTExfREFZUyA9IDkwO1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9SRUxFQVNFX1pFUk9fREFZUyA9IDU0MDtcbi8qKiBCYXNlLWltYWdlIGFnZTogZnVsbCBtYXJrcyB1cCB0byB0aGlzIG1hbnkgZGF5cywgemVybyBhdCB7QGxpbmsgSEVBTFRIX0JBU0VfSU1BR0VfWkVST19EQVlTfS4gKi9cbmV4cG9ydCBjb25zdCBIRUFMVEhfQkFTRV9JTUFHRV9GVUxMX0RBWVMgPSA2MDtcbmV4cG9ydCBjb25zdCBIRUFMVEhfQkFTRV9JTUFHRV9aRVJPX0RBWVMgPSAzNjU7XG5cbi8qKiBPbmUgY29tcG9uZW50J3MgY29udHJpYnV0aW9uOiBpdHMgMC4uMSBzY29yZSAobnVsbCA9IG1pc3NpbmcsIGRyb3BwZWQpIGFuZCBpdHMgbm9taW5hbCB3ZWlnaHQuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENvbXBvbmVudFNjb3JlIHtcbiAgc2NvcmU6IG51bWJlciB8IG51bGw7XG4gIHdlaWdodDogbnVtYmVyO1xufVxuZXhwb3J0IHR5cGUgSGVhbHRoQnJlYWtkb3duID0gUmVjb3JkPEhlYWx0aENvbXBvbmVudCwgSGVhbHRoQ29tcG9uZW50U2NvcmU+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aFJlc3VsdCB7XG4gIC8qKiAw4oCTMTAwIGludGVnZXIsIG9yIG51bGwgd2l0aCBmZXdlciB0aGFuIHtAbGluayBIRUFMVEhfTUlOX0NPTVBPTkVOVFN9IGNvbXBvbmVudHMuICovXG4gIHNjb3JlOiBudW1iZXIgfCBudWxsO1xuICBicmVha2Rvd246IEhlYWx0aEJyZWFrZG93bjtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSBzY29yZSBpcyBjb21wdXRlZCBmcm9tLiBFdmVyeSBmaWVsZCBpcyBvcHRpb25hbDogYHVuZGVmaW5lZGAgLyBudWxsXG4gKiBtZWFucyBcIm5vdCBrbm93blwiLCB3aGljaCBkcm9wcyB0aGUgY29tcG9uZW50IChvciwgZm9yIGZyZXNobmVzcywgdGhhdCBoYWxmKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhJbnB1dHMge1xuICAvKiogVGVybWluYWwgcnVucyBpbiB0aGUgMzAtZGF5IHdpbmRvdywgYW5kIHRoZSBzaGFyZSB0aGF0IHN1Y2NlZWRlZCAoMC4uMSkuICovXG4gIHJ1bnMzMGQ/OiBudW1iZXIgfCBudWxsO1xuICBzdWNjZXNzUmF0ZTMwZD86IG51bWJlciB8IG51bGw7XG4gIC8qKiBUaGUgbGF0ZXN0IGxpc3RlZCB2ZXJzaW9uJ3Mgc2NhbjsgYHNjYW5uZWRBdGAgbnVsbCDih5IgbmV2ZXIgc2Nhbm5lZC4gKi9cbiAgdnVsbkNyaXRpY2FsPzogbnVtYmVyIHwgbnVsbDtcbiAgdnVsbkhpZ2g/OiBudW1iZXIgfCBudWxsO1xuICBzY2FubmVkQXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFdoZW4gdGhlIGxhdGVzdCBsaXN0ZWQgdmVyc2lvbiB3YXMgcHVibGlzaGVkLiAqL1xuICBsYXN0UmVsZWFzZUF0PzogRGF0ZSB8IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUaGUgbGF0ZXN0IGxpc3RlZCB2ZXJzaW9uJ3MgYmFzZSBpbWFnZSBgY3JlYXRlZGAgdGltZSwgd2hlbiByZWNvcmRlZC4gKi9cbiAgYmFzZUltYWdlQ3JlYXRlZEF0PzogRGF0ZSB8IHN0cmluZyB8IG51bGw7XG4gIC8qKiBMYXRlc3QgbGlzdGVkIHZlcnNpb24gaGFzIGFuIGltYWdlIGRpZ2VzdCBBTkQgYSBzaWduYXR1cmUgKGl0cyBgcHVibGljLypgIGNvcHkpLiAqL1xuICBzaWduZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgc21va2VUZXN0RGVjbGFyZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgaGFzUmVhZG1lPzogYm9vbGVhbiB8IG51bGw7XG4gIGhhc0xpY2Vuc2U/OiBib29sZWFuIHwgbnVsbDtcbiAgcmF0aW5nQmF5ZXM/OiBudW1iZXIgfCBudWxsO1xuICByYXRpbmdDb3VudD86IG51bWJlciB8IG51bGw7XG59XG5cbmNvbnN0IERBWV9NUyA9IDg2XzQwMF8wMDA7XG5cbmNvbnN0IHJvdW5kMyA9IChuOiBudW1iZXIpOiBudW1iZXIgPT4gTWF0aC5yb3VuZChuICogMTAwMCkgLyAxMDAwO1xuY29uc3QgY2xhbXAwMSA9IChuOiBudW1iZXIpOiBudW1iZXIgPT4gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgbikpO1xuXG5mdW5jdGlvbiB0b1RpbWUoZDogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKGQgPT09IG51bGwgfHwgZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgdCA9IG5ldyBEYXRlKGQpLmdldFRpbWUoKTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh0KSA/IHQgOiBudWxsO1xufVxuXG4vKiogMSB1cCB0byBgZnVsbERheXNgLCBmYWxsaW5nIGxpbmVhcmx5IHRvIDAgYXQgYHplcm9EYXlzYCAoYSBmdXR1cmUgZGF0ZSBjb3VudHMgYXMgZnJlc2gpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFnZVNjb3JlKGFnZURheXM6IG51bWJlciwgZnVsbERheXM6IG51bWJlciwgemVyb0RheXM6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChhZ2VEYXlzIDw9IGZ1bGxEYXlzKSByZXR1cm4gMTtcbiAgaWYgKGFnZURheXMgPj0gemVyb0RheXMpIHJldHVybiAwO1xuICByZXR1cm4gY2xhbXAwMSgxIC0gKGFnZURheXMgLSBmdWxsRGF5cykgLyAoemVyb0RheXMgLSBmdWxsRGF5cykpO1xufVxuXG4vKiogVGhlIHZ1bG5lcmFiaWxpdHkgY29tcG9uZW50OiAxIOKIkiAwLjXCt2NyaXRpY2FsIOKIkiAwLjHCt2hpZ2gsIGZsb29yZWQgYXQgMC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2dWxuU2NvcmUoY3JpdGljYWw6IG51bWJlciwgaGlnaDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGNsYW1wMDEoMSAtIDAuNSAqIE1hdGgubWF4KDAsIGNyaXRpY2FsKSAtIDAuMSAqIE1hdGgubWF4KDAsIGhpZ2gpKTtcbn1cblxuZnVuY3Rpb24gcnVudGltZUNvbXBvbmVudChpOiBIZWFsdGhJbnB1dHMpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKGkucnVuczMwZCA9PT0gbnVsbCB8fCBpLnJ1bnMzMGQgPT09IHVuZGVmaW5lZCB8fCBpLnJ1bnMzMGQgPCBIRUFMVEhfTUlOX1JVTlMpIHJldHVybiBudWxsO1xuICBpZiAoaS5zdWNjZXNzUmF0ZTMwZCA9PT0gbnVsbCB8fCBpLnN1Y2Nlc3NSYXRlMzBkID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZShpLnN1Y2Nlc3NSYXRlMzBkKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBjbGFtcDAxKGkuc3VjY2Vzc1JhdGUzMGQpO1xufVxuXG5mdW5jdGlvbiB2dWxuc0NvbXBvbmVudChpOiBIZWFsdGhJbnB1dHMpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKHRvVGltZShpLnNjYW5uZWRBdCkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICByZXR1cm4gdnVsblNjb3JlKGkudnVsbkNyaXRpY2FsID8/IDAsIGkudnVsbkhpZ2ggPz8gMCk7XG59XG5cbmZ1bmN0aW9uIGZyZXNobmVzc0NvbXBvbmVudChpOiBIZWFsdGhJbnB1dHMsIG5vdzogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IHBhcnRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCByZWxlYXNlID0gdG9UaW1lKGkubGFzdFJlbGVhc2VBdCk7XG4gIGlmIChyZWxlYXNlICE9PSBudWxsKSBwYXJ0cy5wdXNoKGFnZVNjb3JlKChub3cgLSByZWxlYXNlKSAvIERBWV9NUywgSEVBTFRIX1JFTEVBU0VfRlVMTF9EQVlTLCBIRUFMVEhfUkVMRUFTRV9aRVJPX0RBWVMpKTtcbiAgY29uc3QgYmFzZSA9IHRvVGltZShpLmJhc2VJbWFnZUNyZWF0ZWRBdCk7XG4gIGlmIChiYXNlICE9PSBudWxsKSBwYXJ0cy5wdXNoKGFnZVNjb3JlKChub3cgLSBiYXNlKSAvIERBWV9NUywgSEVBTFRIX0JBU0VfSU1BR0VfRlVMTF9EQVlTLCBIRUFMVEhfQkFTRV9JTUFHRV9aRVJPX0RBWVMpKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBwYXJ0cy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIHBhcnRzLmxlbmd0aDtcbn1cblxuY29uc3QgZmxhZyA9IChiOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IG51bGwgPT4gKGIgPT09IG51bGwgfHwgYiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGIgPyAxIDogMCk7XG5cbmZ1bmN0aW9uIGRvY3NDb21wb25lbnQoaTogSGVhbHRoSW5wdXRzKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICgoaS5oYXNSZWFkbWUgPT09IG51bGwgfHwgaS5oYXNSZWFkbWUgPT09IHVuZGVmaW5lZCkgJiYgKGkuaGFzTGljZW5zZSA9PT0gbnVsbCB8fCBpLmhhc0xpY2Vuc2UgPT09IHVuZGVmaW5lZCkpIHJldHVybiBudWxsO1xuICByZXR1cm4gKGkuaGFzUmVhZG1lID8gMC41IDogMCkgKyAoaS5oYXNMaWNlbnNlID8gMC41IDogMCk7XG59XG5cbmZ1bmN0aW9uIHJhdGluZ0NvbXBvbmVudChpOiBIZWFsdGhJbnB1dHMpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKGkucmF0aW5nQ291bnQgPT09IG51bGwgfHwgaS5yYXRpbmdDb3VudCA9PT0gdW5kZWZpbmVkIHx8IGkucmF0aW5nQ291bnQgPCBIRUFMVEhfTUlOX1JBVElOR1MpIHJldHVybiBudWxsO1xuICBpZiAoaS5yYXRpbmdCYXllcyA9PT0gbnVsbCB8fCBpLnJhdGluZ0JheWVzID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZShpLnJhdGluZ0JheWVzKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBjbGFtcDAxKGkucmF0aW5nQmF5ZXMgLyA1KTtcbn1cblxuLyoqIFRoZSBoZWFsdGggc2NvcmUgYW5kIGl0cyBwZXItY29tcG9uZW50IGJyZWFrZG93bi4gUHVyZTsgYG5vd2AgaXMgaW5qZWN0YWJsZSBmb3IgdGVzdHMuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUhlYWx0aFNjb3JlKGlucHV0czogSGVhbHRoSW5wdXRzLCBub3c6IERhdGUgPSBuZXcgRGF0ZSgpKTogSGVhbHRoUmVzdWx0IHtcbiAgY29uc3QgdCA9IG5vdy5nZXRUaW1lKCk7XG4gIGNvbnN0IHJhdzogUmVjb3JkPEhlYWx0aENvbXBvbmVudCwgbnVtYmVyIHwgbnVsbD4gPSB7XG4gICAgcnVudGltZTogcnVudGltZUNvbXBvbmVudChpbnB1dHMpLFxuICAgIHZ1bG5zOiB2dWxuc0NvbXBvbmVudChpbnB1dHMpLFxuICAgIGZyZXNobmVzczogZnJlc2huZXNzQ29tcG9uZW50KGlucHV0cywgdCksXG4gICAgc2lnbmVkOiBmbGFnKGlucHV0cy5zaWduZWQpLFxuICAgIHNtb2tlVGVzdDogZmxhZyhpbnB1dHMuc21va2VUZXN0RGVjbGFyZWQpLFxuICAgIGRvY3M6IGRvY3NDb21wb25lbnQoaW5wdXRzKSxcbiAgICByYXRpbmc6IHJhdGluZ0NvbXBvbmVudChpbnB1dHMpLFxuICB9O1xuICBjb25zdCBicmVha2Rvd24gPSB7fSBhcyBIZWFsdGhCcmVha2Rvd247XG4gIGxldCB3ZWlnaHRlZCA9IDA7XG4gIGxldCB0b3RhbFdlaWdodCA9IDA7XG4gIGxldCBhdmFpbGFibGUgPSAwO1xuICBmb3IgKGNvbnN0IGMgb2YgSEVBTFRIX0NPTVBPTkVOVFMpIHtcbiAgICBjb25zdCBzY29yZSA9IHJhd1tjXTtcbiAgICBicmVha2Rvd25bY10gPSB7IHNjb3JlOiBzY29yZSA9PT0gbnVsbCA/IG51bGwgOiByb3VuZDMoc2NvcmUpLCB3ZWlnaHQ6IEhFQUxUSF9XRUlHSFRTW2NdIH07XG4gICAgaWYgKHNjb3JlID09PSBudWxsKSBjb250aW51ZTtcbiAgICBhdmFpbGFibGUrKztcbiAgICB3ZWlnaHRlZCArPSBzY29yZSAqIEhFQUxUSF9XRUlHSFRTW2NdO1xuICAgIHRvdGFsV2VpZ2h0ICs9IEhFQUxUSF9XRUlHSFRTW2NdO1xuICB9XG4gIGNvbnN0IHNjb3JlID0gYXZhaWxhYmxlIDwgSEVBTFRIX01JTl9DT01QT05FTlRTIHx8IHRvdGFsV2VpZ2h0ID09PSAwID8gbnVsbCA6IE1hdGgucm91bmQoKDEwMCAqIHdlaWdodGVkKSAvIHRvdGFsV2VpZ2h0KTtcbiAgcmV0dXJuIHsgc2NvcmUsIGJyZWFrZG93biB9O1xufVxuXG4vKipcbiAqIEEgcHVibGlzaGVyJ3MgaGVhbHRoOiB0aGUgaW5zdGFsbC13ZWlnaHRlZCBtZWFuIG9mIGl0cyBsaXN0aW5ncycgc2NvcmVzXG4gKiAobGlzdGluZ3Mgd2l0aCBubyBzY29yZSBhcmUgc2tpcHBlZDsgd2hlbiBubyBsaXN0aW5nIGhhcyBpbnN0YWxscywgdGhlIHBsYWluXG4gKiBtZWFuKS4gTnVsbCB3aGVuIG5vIGxpc3RpbmcgaGFzIGEgc2NvcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaXNoZXJIZWFsdGhTY29yZShsaXN0aW5nczogUmVhZG9ubHlBcnJheTx7IGhlYWx0aFNjb3JlOiBudW1iZXIgfCBudWxsOyBpbnN0YWxsQ291bnQ6IG51bWJlciB9Pik6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBzY29yZWQgPSBsaXN0aW5ncy5maWx0ZXIoKGwpOiBsIGlzIHsgaGVhbHRoU2NvcmU6IG51bWJlcjsgaW5zdGFsbENvdW50OiBudW1iZXIgfSA9PlxuICAgIGwuaGVhbHRoU2NvcmUgIT09IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKGwuaGVhbHRoU2NvcmUpKTtcbiAgaWYgKHNjb3JlZC5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICBjb25zdCB3ZWlnaHRPZiA9IChuOiBudW1iZXIpID0+IE1hdGgubWF4KDAsIG4pO1xuICBjb25zdCB0b3RhbEluc3RhbGxzID0gc2NvcmVkLnJlZHVjZSgoYSwgbCkgPT4gYSArIHdlaWdodE9mKGwuaW5zdGFsbENvdW50KSwgMCk7XG4gIGlmICh0b3RhbEluc3RhbGxzID09PSAwKSByZXR1cm4gTWF0aC5yb3VuZChzY29yZWQucmVkdWNlKChhLCBsKSA9PiBhICsgbC5oZWFsdGhTY29yZSwgMCkgLyBzY29yZWQubGVuZ3RoKTtcbiAgcmV0dXJuIE1hdGgucm91bmQoc2NvcmVkLnJlZHVjZSgoYSwgbCkgPT4gYSArIGwuaGVhbHRoU2NvcmUgKiB3ZWlnaHRPZihsLmluc3RhbGxDb3VudCksIDApIC8gdG90YWxJbnN0YWxscyk7XG59XG5cbi8qKlxuICogQSBwdWJsaXNoZXIncyAzMC1kYXkgc3VjY2VzcyByYXRlIGFjcm9zcyBpdHMgbGlzdGluZ3MsIHdlaWdodGVkIGJ5IHJ1bnMuXG4gKiBOdWxsIHdoZW4gbm9uZSBvZiBpdHMgbGlzdGluZ3MgcmFuIGluIHRoZSB3aW5kb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaXNoZXJTdWNjZXNzUmF0ZShsaXN0aW5nczogUmVhZG9ubHlBcnJheTx7IHN1Y2Nlc3NSYXRlMzBkOiBudW1iZXIgfCBudWxsOyBydW5zMzBkOiBudW1iZXIgfT4pOiBudW1iZXIgfCBudWxsIHtcbiAgbGV0IHJ1bnMgPSAwO1xuICBsZXQgc3VjY2VlZGVkID0gMDtcbiAgZm9yIChjb25zdCBsIG9mIGxpc3RpbmdzKSB7XG4gICAgaWYgKGwuc3VjY2Vzc1JhdGUzMGQgPT09IG51bGwgfHwgIU51bWJlci5pc0Zpbml0ZShsLnN1Y2Nlc3NSYXRlMzBkKSB8fCBsLnJ1bnMzMGQgPD0gMCkgY29udGludWU7XG4gICAgcnVucyArPSBsLnJ1bnMzMGQ7XG4gICAgc3VjY2VlZGVkICs9IGwuc3VjY2Vzc1JhdGUzMGQgKiBsLnJ1bnMzMGQ7XG4gIH1cbiAgcmV0dXJuIHJ1bnMgPT09IDAgPyBudWxsIDogcm91bmQzKHN1Y2NlZWRlZCAvIHJ1bnMpO1xufVxuXG4vKiogRGlzcGxheSBiYW5kIGZvciBhIHNjb3JlOiBnb29kIOKJpSA4MCwgZmFpciDiiaUgNTAsIHBvb3IgYmVsb3csIHVua25vd24gd2hlbiBudWxsLiAqL1xuZXhwb3J0IHR5cGUgSGVhbHRoQmFuZCA9ICdnb29kJyB8ICdmYWlyJyB8ICdwb29yJyB8ICd1bmtub3duJztcbmV4cG9ydCBjb25zdCBIRUFMVEhfQkFORF9HT09EID0gODA7XG5leHBvcnQgY29uc3QgSEVBTFRIX0JBTkRfRkFJUiA9IDUwO1xuXG5leHBvcnQgZnVuY3Rpb24gaGVhbHRoQmFuZChzY29yZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IEhlYWx0aEJhbmQge1xuICBpZiAoc2NvcmUgPT09IG51bGwgfHwgc2NvcmUgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKHNjb3JlKSkgcmV0dXJuICd1bmtub3duJztcbiAgaWYgKHNjb3JlID49IEhFQUxUSF9CQU5EX0dPT0QpIHJldHVybiAnZ29vZCc7XG4gIGlmIChzY29yZSA+PSBIRUFMVEhfQkFORF9GQUlSKSByZXR1cm4gJ2ZhaXInO1xuICByZXR1cm4gJ3Bvb3InO1xufVxuIl19
|
|
@@ -171,6 +171,75 @@ export declare function gatedFixableCount(counts: {
|
|
|
171
171
|
vulnCriticalFixable: number | null;
|
|
172
172
|
vulnHighFixable: number | null;
|
|
173
173
|
}, failOn?: PluginVulnFailOn): number;
|
|
174
|
+
/**
|
|
175
|
+
* The two questions a caller can ask about a stored summary's image — and they
|
|
176
|
+
* are DIFFERENT questions, which is the thing worth writing down.
|
|
177
|
+
*
|
|
178
|
+
* A summary carries the digest of the image it described. A version rebuilt on
|
|
179
|
+
* a patched base is a different artifact, so a summary naming another digest is
|
|
180
|
+
* about something else. But a summary may also carry NO digest (an older row),
|
|
181
|
+
* and that is where the two callers legitimately part company:
|
|
182
|
+
*
|
|
183
|
+
* - {@link summaryDescribes} — "can this summary be SHOWN to describe this
|
|
184
|
+
* image?" Unknown counts as no. The publish gate asks this, because its
|
|
185
|
+
* failure is listing something unvetted; falling back to the raw columns
|
|
186
|
+
* merely leaves a plugin unlisted.
|
|
187
|
+
* - {@link summaryContradicts} — "is this summary KNOWN to be about another
|
|
188
|
+
* image?" Unknown counts as no. The resolver and the delete-safety grading
|
|
189
|
+
* ask this, because their failure is the opposite one: discarding a
|
|
190
|
+
* digest-less summary throws away the only findings they have and makes a
|
|
191
|
+
* warning quieter or a refusal less informative.
|
|
192
|
+
*
|
|
193
|
+
* They used to be two open-coded expressions that happened to differ, with
|
|
194
|
+
* nothing saying whether that was reasoning or accident. It was reasoning; this
|
|
195
|
+
* is that reasoning, named.
|
|
196
|
+
*/
|
|
197
|
+
export declare function summaryDescribes(summary: {
|
|
198
|
+
imageDigest?: unknown;
|
|
199
|
+
} | null | undefined, imageDigest: string | null | undefined): boolean;
|
|
200
|
+
/** See {@link summaryDescribes} — the permissive twin, for readers that lose
|
|
201
|
+
* information by discarding a digest-less summary. */
|
|
202
|
+
export declare function summaryContradicts(summary: {
|
|
203
|
+
imageDigest?: unknown;
|
|
204
|
+
} | null | undefined, imageDigest: string | null | undefined): boolean;
|
|
205
|
+
/**
|
|
206
|
+
* The gated count a STORED scan summary implies, with waivers re-evaluated now.
|
|
207
|
+
*
|
|
208
|
+
* WHY THIS EXISTS. {@link gatedFixableCount} reads the scanner's fixable
|
|
209
|
+
* columns, and those columns — as the note on it says — know nothing about
|
|
210
|
+
* waivers or KEV. The build floor never trusted them: it derives its count from
|
|
211
|
+
* the findings. The PUBLISH gate did trust them, so the two halves of the system
|
|
212
|
+
* disagreed about whether a plugin was shippable. A waived Critical stopped
|
|
213
|
+
* blocking the build and went on blocking the listing, silently, and a KEV-listed
|
|
214
|
+
* UNFIXABLE Critical did the reverse — blocked the build and was invisible to the
|
|
215
|
+
* listing. One definition, called from both, is the only thing that keeps them
|
|
216
|
+
* from drifting again.
|
|
217
|
+
*
|
|
218
|
+
* WAIVERS ARE RE-EVALUATED, NOT REPLAYED. `summary.waived` records what a waiver
|
|
219
|
+
* exempted AT SCAN TIME, and replaying those keys would be the cheaper fix and
|
|
220
|
+
* the wrong one: `PLUGIN_VULN_WAIVERS` entries carry an inclusive expiry, so a
|
|
221
|
+
* frozen key list would honour an exemption forever and an expiry that stopped
|
|
222
|
+
* blocking builds would never start blocking listings again. Re-running the
|
|
223
|
+
* waivers against the stored findings is what makes the expiry mean something on
|
|
224
|
+
* both paths.
|
|
225
|
+
*
|
|
226
|
+
* Returns `null` when the summary cannot be trusted to answer the question, so
|
|
227
|
+
* the caller falls back to the raw columns — FAIL CLOSED, because the failure
|
|
228
|
+
* this guards is "list something unvetted", not "leave something unlisted":
|
|
229
|
+
*
|
|
230
|
+
* - no summary at all (a version scanned before the column existed);
|
|
231
|
+
* - `truncated`: findings were capped at {@link SCAN_SUMMARY_MAX_FINDINGS}, so
|
|
232
|
+
* what is missing cannot be counted and a derived figure would undercount by
|
|
233
|
+
* an unknown amount;
|
|
234
|
+
* - a digest mismatch: the summary describes a DIFFERENT artifact, and a
|
|
235
|
+
* version rebuilt on a patched base is a different artifact.
|
|
236
|
+
*/
|
|
237
|
+
export declare function gatedFindingCount(summary: PluginScanSummary | null | undefined, subject: {
|
|
238
|
+
pluginName: string;
|
|
239
|
+
orgId?: string;
|
|
240
|
+
pluginVersion?: string;
|
|
241
|
+
imageDigest?: string | null;
|
|
242
|
+
}, failOn?: PluginVulnFailOn, now?: Date): number | null;
|
|
174
243
|
/** `Critical` / `Critical or High` — the gated severities, for messages. */
|
|
175
244
|
export declare function failOnLabel(failOn?: PluginVulnFailOn): string;
|
|
176
245
|
/**
|
package/lib/types/plugin-scan.js
CHANGED
|
@@ -84,6 +84,82 @@ export function atOrAboveFailOn(severity, failOn = pluginVulnFailOn()) {
|
|
|
84
84
|
export function gatedFixableCount(counts, failOn = pluginVulnFailOn()) {
|
|
85
85
|
return (counts.vulnCriticalFixable ?? 0) + (failOn === 'high' ? counts.vulnHighFixable ?? 0 : 0);
|
|
86
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* The two questions a caller can ask about a stored summary's image — and they
|
|
89
|
+
* are DIFFERENT questions, which is the thing worth writing down.
|
|
90
|
+
*
|
|
91
|
+
* A summary carries the digest of the image it described. A version rebuilt on
|
|
92
|
+
* a patched base is a different artifact, so a summary naming another digest is
|
|
93
|
+
* about something else. But a summary may also carry NO digest (an older row),
|
|
94
|
+
* and that is where the two callers legitimately part company:
|
|
95
|
+
*
|
|
96
|
+
* - {@link summaryDescribes} — "can this summary be SHOWN to describe this
|
|
97
|
+
* image?" Unknown counts as no. The publish gate asks this, because its
|
|
98
|
+
* failure is listing something unvetted; falling back to the raw columns
|
|
99
|
+
* merely leaves a plugin unlisted.
|
|
100
|
+
* - {@link summaryContradicts} — "is this summary KNOWN to be about another
|
|
101
|
+
* image?" Unknown counts as no. The resolver and the delete-safety grading
|
|
102
|
+
* ask this, because their failure is the opposite one: discarding a
|
|
103
|
+
* digest-less summary throws away the only findings they have and makes a
|
|
104
|
+
* warning quieter or a refusal less informative.
|
|
105
|
+
*
|
|
106
|
+
* They used to be two open-coded expressions that happened to differ, with
|
|
107
|
+
* nothing saying whether that was reasoning or accident. It was reasoning; this
|
|
108
|
+
* is that reasoning, named.
|
|
109
|
+
*/
|
|
110
|
+
export function summaryDescribes(summary, imageDigest) {
|
|
111
|
+
const stored = typeof summary?.imageDigest === 'string' ? summary.imageDigest : null;
|
|
112
|
+
return stored !== null && !!imageDigest && stored === imageDigest;
|
|
113
|
+
}
|
|
114
|
+
/** See {@link summaryDescribes} — the permissive twin, for readers that lose
|
|
115
|
+
* information by discarding a digest-less summary. */
|
|
116
|
+
export function summaryContradicts(summary, imageDigest) {
|
|
117
|
+
const stored = typeof summary?.imageDigest === 'string' ? summary.imageDigest : null;
|
|
118
|
+
return stored !== null && !!imageDigest && stored !== imageDigest;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The gated count a STORED scan summary implies, with waivers re-evaluated now.
|
|
122
|
+
*
|
|
123
|
+
* WHY THIS EXISTS. {@link gatedFixableCount} reads the scanner's fixable
|
|
124
|
+
* columns, and those columns — as the note on it says — know nothing about
|
|
125
|
+
* waivers or KEV. The build floor never trusted them: it derives its count from
|
|
126
|
+
* the findings. The PUBLISH gate did trust them, so the two halves of the system
|
|
127
|
+
* disagreed about whether a plugin was shippable. A waived Critical stopped
|
|
128
|
+
* blocking the build and went on blocking the listing, silently, and a KEV-listed
|
|
129
|
+
* UNFIXABLE Critical did the reverse — blocked the build and was invisible to the
|
|
130
|
+
* listing. One definition, called from both, is the only thing that keeps them
|
|
131
|
+
* from drifting again.
|
|
132
|
+
*
|
|
133
|
+
* WAIVERS ARE RE-EVALUATED, NOT REPLAYED. `summary.waived` records what a waiver
|
|
134
|
+
* exempted AT SCAN TIME, and replaying those keys would be the cheaper fix and
|
|
135
|
+
* the wrong one: `PLUGIN_VULN_WAIVERS` entries carry an inclusive expiry, so a
|
|
136
|
+
* frozen key list would honour an exemption forever and an expiry that stopped
|
|
137
|
+
* blocking builds would never start blocking listings again. Re-running the
|
|
138
|
+
* waivers against the stored findings is what makes the expiry mean something on
|
|
139
|
+
* both paths.
|
|
140
|
+
*
|
|
141
|
+
* Returns `null` when the summary cannot be trusted to answer the question, so
|
|
142
|
+
* the caller falls back to the raw columns — FAIL CLOSED, because the failure
|
|
143
|
+
* this guards is "list something unvetted", not "leave something unlisted":
|
|
144
|
+
*
|
|
145
|
+
* - no summary at all (a version scanned before the column existed);
|
|
146
|
+
* - `truncated`: findings were capped at {@link SCAN_SUMMARY_MAX_FINDINGS}, so
|
|
147
|
+
* what is missing cannot be counted and a derived figure would undercount by
|
|
148
|
+
* an unknown amount;
|
|
149
|
+
* - a digest mismatch: the summary describes a DIFFERENT artifact, and a
|
|
150
|
+
* version rebuilt on a patched base is a different artifact.
|
|
151
|
+
*/
|
|
152
|
+
export function gatedFindingCount(summary, subject, failOn = pluginVulnFailOn(), now = new Date()) {
|
|
153
|
+
if (!summary || summary.truncated)
|
|
154
|
+
return null;
|
|
155
|
+
if (!Array.isArray(summary.findings))
|
|
156
|
+
return null;
|
|
157
|
+
if (!summaryDescribes(summary, subject.imageDigest))
|
|
158
|
+
return null;
|
|
159
|
+
const { counted } = applyVulnWaivers(subject.pluginName, summary.findings, undefined, now, subject.orgId, subject.pluginVersion);
|
|
160
|
+
const kevGate = pluginVulnGateKev();
|
|
161
|
+
return counted.filter((f) => isGatedFinding(f, kevGate, failOn)).length;
|
|
162
|
+
}
|
|
87
163
|
/** `Critical` / `Critical or High` — the gated severities, for messages. */
|
|
88
164
|
export function failOnLabel(failOn = pluginVulnFailOn()) {
|
|
89
165
|
return failOn === 'critical' ? 'Critical' : 'Critical or High';
|
|
@@ -300,4 +376,4 @@ export function asScanFlag(value) {
|
|
|
300
376
|
findings: findings.map((f) => ({ ...f, fixedIn: Array.isArray(f.fixedIn) ? f.fixedIn : [] })),
|
|
301
377
|
};
|
|
302
378
|
}
|
|
303
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXNjYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGx1Z2luLXNjYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQXlIMUQsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLEdBQUcsQ0FBQztBQUU3Qyw2Q0FBNkM7QUFDN0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBRTdDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLENBQW1FO0lBQ2hHLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ3hELENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixNQUF5RixFQUN6RixLQUFtQztJQUVuQyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZGLE1BQU0sUUFBUSxHQUFHO1FBQ2YsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxjQUFjLElBQUksTUFBTSxDQUFDLFFBQVE7UUFDaEUsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVM7S0FDeEIsQ0FBQztJQUNGLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRixDQUFDO0FBRUQsOENBQThDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUV6Qyw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsY0FBYyxDQUFDO0FBRW5EOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQjtJQUNuQyxPQUFPLE1BQU0sQ0FBQywwQkFBMEIsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFVRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLHFCQUFxQixFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDN0csQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsZUFBZSxDQUFDLFFBQXVDLEVBQUUsTUFBTSxHQUFxQixnQkFBZ0IsRUFBRTtJQUNwSCxPQUFPLFFBQVEsS0FBSyxVQUFVLElBQUksTUFBTSxLQUFLLE1BQU0sQ0FBQztBQUN0RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixNQUE4RSxFQUM5RSxNQUFNLEdBQXFCLGdCQUFnQixFQUFFO0lBRTdDLE9BQU8sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkcsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQU0sR0FBcUIsZ0JBQWdCLEVBQUU7SUFDdkUsT0FBTyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDO0FBQ2pFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixPQUFPLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQzVCLENBQTBELEVBQzFELE9BQU8sR0FBWSxpQkFBaUIsRUFBRSxFQUN0QyxNQUFNLEdBQXFCLGdCQUFnQixFQUFFO0lBRTdDLE9BQU8sZUFBZSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3RHLENBQUM7QUF1RUQsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztBQUVyQzs7O0dBR0c7QUFDSCxNQUFNLFdBQVcsR0FBRyxrR0FBa0csQ0FBQztBQWN2SDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEdBQUcsR0FBdUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUI7SUFDL0YsTUFBTSxPQUFPLEdBQWlCLEVBQUUsQ0FBQztJQUNqQyxNQUFNLFFBQVEsR0FBd0IsRUFBRSxDQUFDO0lBQ3pDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFO1FBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUMvQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQWEsRUFBRSxNQUFjLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdEcsS0FBSyxNQUFNLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFBRSxTQUFTO1FBQzVCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDakYsbUVBQW1FO1FBQ25FLHlFQUF5RTtRQUN6RSxvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsbUVBQW1FLENBQUMsQ0FBQztZQUNuRixTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9ELE1BQU0sT0FBTyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFBQyxTQUFTO1FBQUMsQ0FBQztRQUMzRCxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxzREFBc0QsQ0FBQyxDQUFDO1lBQUMsU0FBUztRQUFDLENBQUM7UUFDL0csSUFBSSxNQUFNLEtBQUssaUJBQWlCLElBQUksT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxxREFBcUQsQ0FBQyxDQUFDO1lBQUMsU0FBUztRQUFDLENBQUM7UUFDekksSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLE9BQU8scUJBQXFCLENBQUMsQ0FBQztZQUFDLFNBQVM7UUFBQyxDQUFDO1FBQy9HLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLE9BQU8sc0JBQXNCLENBQUMsQ0FBQztZQUFDLFNBQVM7UUFBQyxDQUFDO1FBQ3hHLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkUsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1lBQUMsU0FBUztRQUFDLENBQUM7UUFDeEUsSUFBSSxNQUFNLEtBQUssaUJBQWlCLEVBQUUsQ0FBQztZQUNqQyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsdURBQXVELFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7Z0JBQ3ZJLFNBQVM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsR0FBRyxHQUF1QixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtJQUN4RixPQUFPLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUM5QyxDQUFDO0FBWUQsdUZBQXVGO0FBQ3ZGLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxDQUFzRDtJQUNyRixPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDdEcsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLFVBQWtCLEVBQ2xCLFFBQXNDLEVBQ3RDLE9BQU8sR0FBMEIsZ0JBQWdCLEVBQUUsRUFDbkQsR0FBRyxHQUFTLElBQUksSUFBSSxFQUFFLEVBQ3RCLEtBQWMsRUFDZCxhQUFzQjtJQUV0QiwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLDZFQUE2RTtJQUM3RSx5RUFBeUU7SUFDekUsK0VBQStFO0lBQy9FLDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDekUsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxhQUFhO1FBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDN0gsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLGlCQUFpQixDQUFDO1dBQzNGLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtRQUN2QywyRUFBMkU7UUFDM0Usd0RBQXdEO1dBQ3JELENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzFELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDcEYsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztJQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRyxNQUFNLE9BQU8sR0FBd0IsRUFBRSxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUF3QixFQUFFLENBQUM7SUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWMsQ0FBQztJQUN0QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4QyxNQUFNLEVBQUUsR0FBRyxjQUFjLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQztZQUNuQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsU0FBUztRQUFDLENBQUM7UUFDbkQsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRTtZQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDcEQsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBZ0MsRUFBRSxHQUFHLEdBQVcscUJBQXFCLEVBQUU7SUFDdEcsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUN4QyxDQUFDO0FBRUQsa0RBQWtEO0FBQ2xELE1BQU0sVUFBVSxXQUFXLENBQUMsQ0FBd0U7SUFDbEcsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUMvRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQztBQUNyRixDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxRQUFzQyxFQUFFLEtBQUssR0FBRyxDQUFDO0lBQ2hGLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVGLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNqRixPQUFPLEdBQUcsS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDO0FBQzNCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxXQUFXLENBQUMsSUFBc0Q7SUFDekUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ3RDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxDQUFDO0lBQ3JELE9BQU8sSUFBSSxDQUFDLEdBQUc7UUFDYixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssV0FBVyxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxnQ0FBZ0MsSUFBSSxDQUFDLEdBQUcsZUFBZTtRQUNuSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxZQUFZLEtBQUssV0FBVyxDQUFDLEVBQUUsQ0FBQztBQUNuRCxDQUFDO0FBRUQsMEdBQTBHO0FBQzFHLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsSUFBc0Q7SUFDcEcsT0FBTyxHQUFHLEdBQUcsUUFBUSxXQUFXLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO0FBQ2hFLENBQUM7QUFpQkQsNkRBQTZEO0FBQzdELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFjLEVBQUUsT0FBZSxFQUFFLElBQW9CO0lBQ3RGLE9BQU87UUFDTCxJQUFJLEVBQUUsb0JBQW9CO1FBQzFCLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU87UUFDekMsTUFBTTtRQUNOLE9BQU87UUFDUCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2YsT0FBTyxFQUFFLGtCQUFrQixDQUFDLEdBQUcsTUFBTSxJQUFJLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQztRQUN6RCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDO0tBQ3pELENBQUM7QUFDSixDQUFDO0FBRUQsaURBQWlEO0FBQ2pELE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBYztJQUN2QyxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzdFLE1BQU0sQ0FBQyxHQUFHLEtBQWdDLENBQUM7SUFDM0MsSUFBSSxPQUFPLENBQUMsQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0UsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQyxRQUFnQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ25JLE9BQU87UUFDTCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7UUFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7UUFDWixXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsV0FBVyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakUsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNELFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzlGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUGx1Z2luIGltYWdlIHNjYW4gZ2F0ZXMgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQgXCJTY2FuIGdhdGVzXCIpOiB0aGUgc2hhcmVkXG4gKiB2b2NhYnVsYXJ5IG9mIHRoZSBidWlsZC10aW1lIGdhdGUsIHRoZSBuaWdodGx5IHJlc2NhbidzIGZsYWcsIGFuZCB0aGVcbiAqIHJlc29sdXRpb24gd2FybmluZyAvIGJsb2NrIOKAlCB1c2VkIGJ5IHRoZSBwbHVnaW4gc2VydmljZSAod2hpY2ggc3RvcmVzIGFuZFxuICogZW5mb3JjZXMgdGhlbSksIHRoZSByZXNvbHZlciBpbiBwaXBlbGluZS1kYXRhICh3aGljaCBza2lwcyBvciB3YXJucyksIGFuZCB0aGVcbiAqIGRhc2hib2FyZCAod2hpY2ggc2hvd3MgdGhlbSkuXG4gKlxuICogQSBmaW5kaW5nIGlzIEZJWEFCTEUgd2hlbiBncnlwZSByZXBvcnRzIGEgZml4ZWQgdmVyc2lvbiBmb3IgaXRcbiAqIChgdnVsbmVyYWJpbGl0eS5maXguc3RhdGUgPT0gXCJmaXhlZFwiYCB3aXRoIGF0IGxlYXN0IG9uZSB2ZXJzaW9uKTogdGhlIGdhdGVzXG4gKiBjb3VudCBmaXhhYmxlIENyaXRpY2FsIGZpbmRpbmdzLCBiZWNhdXNlIGFuIHVuZml4YWJsZSBvbmUgY2FuJ3QgYmUgYWN0ZWQgb25cbiAqIGJ5IHJlYnVpbGRpbmcgb3IgdXBncmFkaW5nIOKAlCB3aXRoIE9ORSBleGNlcHRpb24uIEEgQ3JpdGljYWwgdGhhdCBDSVNBIGxpc3RzXG4gKiBhcyBLTk9XTiBFWFBMT0lURUQgKEtFVikgaXMgZ2F0ZWQgZXZlbiB3aXRoIG5vIGZpeCAoYFBMVUdJTl9WVUxOX0dBVEVfS0VWYCk6XG4gKiBcIm5vdGhpbmcgdG8gdXBncmFkZSB0b1wiIGlzIGEgcmVhc29uIHRvIG5vdCBzaGlwIHRoZSBpbWFnZSwgbm90IGEgcmVhc29uIHRvXG4gKiBzaGlwIGl0LCB3aGVuIHRoZSB2dWxuZXJhYmlsaXR5IGlzIGJlaW5nIGV4cGxvaXRlZCBpbiB0aGUgd2lsZC5cbiAqL1xuXG5pbXBvcnQgeyBTWVNURU1fT1JHX0lEIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9zeXN0ZW0tb3JnLmpzJztcbmltcG9ydCB7IGVudkJvb2wsIGVudkludCwgZW52U3RyIH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcblxuLyoqIE9uZSBDcml0aWNhbC9IaWdoIGZpbmRpbmcgYXMgdGhlIGZsYWcgYW5kIHRoZSBnYXRlIG1lc3NhZ2VzIGNhcnJ5IGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TY2FuRmluZGluZyB7XG4gIC8qKiBUaGUgdnVsbmVyYWJpbGl0eSBpZCAoQ1ZFLeKApiwgR0hTQS3igKYpLiAqL1xuICBpZDogc3RyaW5nO1xuICBzZXZlcml0eTogJ2NyaXRpY2FsJyB8ICdoaWdoJztcbiAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgcGFja2FnZVZlcnNpb246IHN0cmluZztcbiAgLyoqIFZlcnNpb25zIHRoYXQgZml4IGl0OyBlbXB0eSA9IG5vIGZpeCBhdmFpbGFibGUgKG5vdCBmaXhhYmxlKS4gKi9cbiAgZml4ZWRJbjogc3RyaW5nW107XG4gIC8qKlxuICAgKiBDSVNBIGxpc3RzIGl0IGFzIEtOT1dOIEVYUExPSVRFRCAoZ3J5cGUncyBga25vd25FeHBsb2l0ZWRgKS4gQWJzZW50ID1cbiAgICogbm90IGxpc3RlZC4gQSBLRVYgQ3JpdGljYWwgaXMgZ2F0ZWQgZXZlbiB3aGVuIHVuZml4YWJsZSwgYW5kIG9ubHkgYW5cbiAgICogQURWSVNPUlktSUQgd2FpdmVyIGNhbiBleGVtcHQgaXQg4oCUIHNlZSB7QGxpbmsgYXBwbHlWdWxuV2FpdmVyc30uXG4gICAqL1xuICBrZXY/OiBib29sZWFuO1xuICAvKipcbiAgICogRVBTUyBwcm9iYWJpbGl0eSAoMOKAkzEpIHRoYXQgaXQgaXMgZXhwbG9pdGVkIGluIHRoZSBuZXh0IDMwIGRheXMsIGFzIGdyeXBlXG4gICAqIHJlcG9ydHMgaXQ7IGFic2VudCB3aGVuIHRoZSBEQiBjYXJyaWVzIG5vIHNjb3JlLiBDb250ZXh0IGZvciBhIHJlYWRlclxuICAgKiByYW5raW5nIGZpbmRpbmdzLCBuZXZlciBhIGdhdGUgaW5wdXQg4oCUIGEgcHJvYmFiaWxpdHkgaXMgbm90IGEgdmVyZGljdC5cbiAgICovXG4gIGVwc3M/OiBudW1iZXI7XG59XG5cbi8qKlxuICogYHNjYW5fZmxhZ2Agb24gYSB2ZXJzaW9uIHRoZSBuaWdodGx5IHJlc2NhbiBmbGFnZ2VkOiBpdHMgR0FURUQgQ3JpdGljYWxcbiAqIGNvdW50IGFuZCBmaXhhYmxlIEhpZ2ggY291bnQgYXQgdGhhdCByZXNjYW4sIGFuZCB0aGUgdG9wIGdhdGVkIGZpbmRpbmdzLiBTZXRcbiAqIHdoaWxlIGdhdGVkIGZpbmRpbmdzIGV4Y2VlZCBgUExVR0lOX1ZVTE5fTUFYX0ZJTkRJTkdTYCwgY2xlYXJlZCB3aGVuIGFcbiAqIHJlc2NhbiBmaW5kcyB0aGVtIHJlc29sdmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNjYW5GbGFnIHtcbiAgLyoqXG4gICAqIEdhdGVkIGZpbmRpbmdzIOKAlCBhdCBvciBhYm92ZSBgZmFpbE9uYCAoZGVmYXVsdCBDcml0aWNhbCk6IGZpeGFibGUgb25lcyxcbiAgICogcGx1cyB1bmZpeGFibGUgS0VWLWxpc3RlZCBvbmVzIHVuZGVyIGBQTFVHSU5fVlVMTl9HQVRFX0tFVmAuXG4gICAqL1xuICBnYXRlZDogbnVtYmVyO1xuICAvKiogT2YgYGdhdGVkYCwgdGhlIEtFVi1saXN0ZWQgb25lcyAoQ0lTQSBrbm93biBleHBsb2l0ZWQpLiBBYnNlbnQgPSBub25lLiAqL1xuICBrZXY/OiBudW1iZXI7XG4gIC8qKiBGaXhhYmxlIEhpZ2ggZmluZGluZ3MuICovXG4gIGhpZ2g6IG51bWJlcjtcbiAgLyoqIFRoZSBmbG9vciBpdCB3YXMgY29tcGFyZWQgYWdhaW5zdCAoYFBMVUdJTl9WVUxOX01BWF9GSU5ESU5HU2ApLiAqL1xuICBtYXhGaW5kaW5nczogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGBQTFVHSU5fVlVMTl9GQUlMX09OYCBpdCB3YXMgZ2F0ZWQgYXQsIHdoZW4gdGhhdCB3YXMgYGhpZ2hgICh0aGVuXG4gICAqIGBnYXRlZGAgY291bnRzIENyaXRpY2FsIEFORCBIaWdoIGZpbmRpbmdzKS4gQWJzZW50ID0gYGNyaXRpY2FsYC5cbiAgICogQ2FycmllZCBvbiB0aGUgZmxhZyBiZWNhdXNlIHRoZSBzZXJ2aWNlcyB0aGF0IFJFTkRFUiBpdCAodGhlIHJlc29sdmVyLFxuICAgKiB0aGUgZGFzaGJvYXJkKSBkbyBub3Qgc2hhcmUgdGhlIHBsdWdpbiBzZXJ2aWNlJ3MgZW52aXJvbm1lbnQuXG4gICAqL1xuICBmYWlsT24/OiAnaGlnaCc7XG4gIC8qKiBBdCBtb3N0IHtAbGluayBTQ0FOX0ZMQUdfVE9QX0ZJTkRJTkdTfSBmaXhhYmxlIGZpbmRpbmdzLCBDcml0aWNhbHMgZmlyc3QuICovXG4gIGZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xufVxuXG4vKipcbiAqIGBzY2FuX3N1bW1hcnlgIG9uIGV2ZXJ5IHNjYW5uZWQgdmVyc2lvbjogdGhlIExBVEVTVCBzY2FuJ3MgZmluZGluZ3Mg4oCUIHdyaXR0ZW5cbiAqIGJ5IHRoZSBidWlsZCB0aGF0IGVzdGFibGlzaGVkIHRoZSB2ZXJzaW9uIGFuZCByZXdyaXR0ZW4gYnkgZXZlcnkgcmVzY2FuIOKAlFxuICogd2hldGhlciBvciBub3QgdGhlIGdhdGUgdHJpcHBlZC5cbiAqXG4gKiBEaXN0aW5jdCBmcm9tIHtAbGluayBQbHVnaW5TY2FuRmxhZ30sIHdoaWNoIGV4aXN0cyBvbmx5IHdoaWxlIGEgdmVyc2lvbiBpcyBvdmVyXG4gKiB0aGUgZmxvb3IuIEEgdmVyc2lvbiBjYXJyeWluZyBub3RoaW5nIGJ1dCBIaWdoIGZpbmRpbmdzIGlzIG5ldmVyIGZsYWdnZWQg4oCUIHNvIGFcbiAqIHJlcG9ydCB3aG9zZSBqb2IgaXMgdG8gc2hvdyBDcml0aWNhbCBBTkQgSGlnaCBleHBvc3VyZSBoYWQgbm8gc291cmNlIHRvIHJlYWQuXG4gKiBXaGF0IGEgcmVwb3J0IFNIT1dTIGFuZCB3aGF0IGEgYnVpbGQgUkVGVVNFUyBhcmUgZGlmZmVyZW50IHF1ZXN0aW9ucywgYW5kXG4gKiBjb25mbGF0aW5nIHRoZW0gbWVhbnQgdGhlIGFuc3dlciB0byB0aGUgZmlyc3Qgd2FzIFwibm90aGluZ1wiLlxuICpcbiAqIEl0IGlzIGFsc28gdGhlIHJlc2NhbidzIEJBU0VMSU5FLiBcIklzIGFueXRoaW5nIG5ldz9cIiBpcyBhbnN3ZXJlZCBieSBkaWZmaW5nXG4gKiBmaW5kaW5nIGlkZW50aXRpZXMgYWdhaW5zdCB0aGUgcHJldmlvdXMgc3VtbWFyeSAoe0BsaW5rIG5ld1NjYW5GaW5kaW5nc30pLFxuICogbm90IGJ5IGNvbXBhcmluZyBjb3VudHM6IG9uZSBDVkUgZml4ZWQgYW5kIGEgZGlmZmVyZW50IG9uZSBwdWJsaXNoZWQgbGVhdmVzXG4gKiB0aGUgY291bnQgdW5jaGFuZ2VkIGFuZCBoaWRlcyBhIGJyYW5kLW5ldyBDcml0aWNhbC5cbiAqXG4gKiBDT05UUkFDVCDigJQgcmVhZCBieSB0aGUgcmVwb3J0aW5nIC8gZXhwb3N1cmUgY29kZSBpbiBwaXBlbGluZS1kYXRhLiBGaWVsZHMgYXJlXG4gKiBvbmx5IGV2ZXIgYWRkZWQ7IGV2ZXJ5IGZpZWxkIGJlbG93IGlzIHByZXNlbnQgb24gZXZlcnkgc3VtbWFyeSB3cml0dGVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNjYW5TdW1tYXJ5IHtcbiAgLyoqIEZpeGFibGUgQ3JpdGljYWwgZmluZGluZ3MuICovXG4gIGNyaXRpY2FsRml4YWJsZTogbnVtYmVyO1xuICAvKiogRml4YWJsZSBIaWdoIGZpbmRpbmdzLiAqL1xuICBoaWdoRml4YWJsZTogbnVtYmVyO1xuICAvKiogVG90YWxzIGluY2x1ZGluZyB1bmZpeGFibGUgZmluZGluZ3MuICovXG4gIGNyaXRpY2FsOiBudW1iZXI7XG4gIGhpZ2g6IG51bWJlcjtcbiAgbWVkaXVtOiBudW1iZXI7XG4gIGxvdzogbnVtYmVyO1xuICAvKiogS0VWLWxpc3RlZCAoQ0lTQSBrbm93biBleHBsb2l0ZWQpIENyaXRpY2FsICsgSGlnaCBmaW5kaW5ncy4gKi9cbiAga2V2OiBudW1iZXI7XG4gIC8qKlxuICAgKiBFVkVSWSBDcml0aWNhbCBhbmQgSGlnaCBmaW5kaW5nIOKAlCBmaXhhYmxlIEFORCB1bmZpeGFibGUg4oCUIENyaXRpY2FscyBmaXJzdCxcbiAgICogY2FwcGVkIGF0IHtAbGluayBTQ0FOX1NVTU1BUllfTUFYX0ZJTkRJTkdTfS4gYHRydW5jYXRlZGAgc2F5cyB3aGV0aGVyIHRoZVxuICAgKiBjYXAgY3V0IGl0OyB0aGUgY291bnRzIGFib3ZlIGFyZSBuZXZlciBjYXBwZWQuXG4gICAqL1xuICBmaW5kaW5nczogUGx1Z2luU2NhbkZpbmRpbmdbXTtcbiAgdHJ1bmNhdGVkOiBib29sZWFuO1xuICAvKipcbiAgICogS2V5cyAoe0BsaW5rIHNjYW5GaW5kaW5nS2V5fSkgb2YgdGhlIGZpbmRpbmdzIGEgYFBMVUdJTl9WVUxOX1dBSVZFUlNgIGVudHJ5XG4gICAqIGV4ZW1wdGVkIGZyb20gdGhlIGZsb29yIGF0IHRoaXMgc2Nhbi4gVGhleSBhcmUgc3RpbGwgaW4gYGZpbmRpbmdzYCDigJQgYVxuICAgKiB3YWl2ZXIgY2hhbmdlcyB0aGUgdmVyZGljdCwgbm90IHdoYXQgdGhlIGltYWdlIGNvbnRhaW5zLlxuICAgKi9cbiAgd2FpdmVkOiBzdHJpbmdbXTtcbiAgLyoqIFdoZW4gdGhpcyBzY2FuIHJhbiAoSVNPKS4gKi9cbiAgc2Nhbm5lZEF0OiBzdHJpbmc7XG4gIC8qKiBXaGljaCBwYXRoIHdyb3RlIGl0LiAqL1xuICB0cmlnZ2VyOiAnYnVpbGQnIHwgJ3Jlc2NhbicgfCAncHJvbW90ZSc7XG4gIC8qKiBUaGUgaW1hZ2UgdGhpcyBkZXNjcmliZXMuIEEgdmVyc2lvbiByZWJ1aWx0IG9uIGEgcGF0Y2hlZCBiYXNlIGlzIGFcbiAgICogIGRpZmZlcmVudCBhcnRpZmFjdCwgc28gYSBzdW1tYXJ5IHdpdGhvdXQgaXRzIGRpZ2VzdCBjYW5ub3QgYmUgdHJ1c3RlZC4gKi9cbiAgaW1hZ2VEaWdlc3Q6IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZW4gdGhlIHZ1bG5lcmFiaWxpdHkgREIgdGhlIHNjYW4gbWF0Y2hlZCBhZ2FpbnN0IHdhcyBCVUlMVCAoSVNPKSwgb3IgbnVsbFxuICAgKiB3aGVuIGl0IGNvdWxkIG5vdCBiZSByZWFkLiBBIHNjYW4gaXMgb25seSBhcyBjdXJyZW50IGFzIGl0cyBEQjogYSBjbGVhblxuICAgKiByZXN1bHQgZnJvbSBhIHdlZWstb2xkIERCIHNheXMgbm90aGluZyBhYm91dCB0aGlzIHdlZWsncyBDVkVzLlxuICAgKi9cbiAgZGJCdWlsdEF0OiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogRXhlY3V0YWJsZXMgaW4gdGhlIGltYWdlIHRoYXQgTk8gU0JPTSBwYWNrYWdlIGFjY291bnRzIGZvciDigJQgVVBYLXBhY2tlZCBvclxuICAgKiBzdHJpcHBlZCBHbywgSGFza2VsbCwgR3JhYWxWTSBuYXRpdmUgaW1hZ2VzLCBOb2RlIFNFQSBidW5kbGVzLCB2ZW5kb3JlZFxuICAgKiBicm93c2Vycy4gVGhlIHNjYW5uZXIgY2Fubm90IHNlZSBpbnNpZGUgdGhlbSwgc28gdGhlaXIgQ1ZFcyBhcmUgaW52aXNpYmxlIHRvXG4gICAqIGV2ZXJ5IGNvdW50IGFib3ZlLiBQYXRocywgc29ydGVkLCBjYXBwZWQgYXQge0BsaW5rIFNDQU5fU1VNTUFSWV9NQVhfQklOQVJJRVN9LlxuICAgKiBJbmZvcm1hdGlvbmFsOiBuZXZlciBhIGdhdGUuXG4gICAqL1xuICB1bmNhdGFsb2d1ZWRCaW5hcmllczogc3RyaW5nW107XG59XG5cbi8qKiBGaW5kaW5ncyBhIHN1bW1hcnkgaXRlbWl6ZXMuIENvdW50cyBhcmUgbmV2ZXIgY2FwcGVkOyB0aGlzIGJvdW5kcyB0aGUganNvbmIuICovXG5leHBvcnQgY29uc3QgU0NBTl9TVU1NQVJZX01BWF9GSU5ESU5HUyA9IDUwMDtcblxuLyoqIFVuY2F0YWxvZ3VlZCBiaW5hcmllcyBhIHN1bW1hcnkgbGlzdHMuICovXG5leHBvcnQgY29uc3QgU0NBTl9TVU1NQVJZX01BWF9CSU5BUklFUyA9IDIwMDtcblxuLyoqXG4gKiBBIGZpbmRpbmcncyBpZGVudGl0eTogdGhlIGFkdmlzb3J5IGluIGEgc3BlY2lmaWMgcGFja2FnZSB2ZXJzaW9uLiBUaGUgc2FtZVxuICogQ1ZFIGluIHR3byBwYWNrYWdlcyBpcyB0d28gZmluZGluZ3M7IHRoZSBzYW1lIENWRSByZXBvcnRlZCBhZ2FpbiBhZnRlciBhXG4gKiByZXNjYW4gaXMgdGhlIHNhbWUgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NhbkZpbmRpbmdLZXkoZjogUGljazxQbHVnaW5TY2FuRmluZGluZywgJ2lkJyB8ICdwYWNrYWdlTmFtZScgfCAncGFja2FnZVZlcnNpb24nPik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtmLmlkfXwke2YucGFja2FnZU5hbWV9fCR7Zi5wYWNrYWdlVmVyc2lvbn1gO1xufVxuXG4vKipcbiAqIFRoZSBDcml0aWNhbC9IaWdoIGZpbmRpbmdzIGluIGBhZnRlcmAgdGhhdCB0aGUgcHJldmlvdXMgc3VtbWFyeSBkaWQgbm90XG4gKiBjYXJyeSDigJQgd2hhdCBOMzEgYW5kIGFuIGFkdmlzb3J5IGRyYWZ0IGFyZSBhYm91dC5cbiAqXG4gKiBObyBwcmV2aW91cyBzdW1tYXJ5IG1lYW5zIG5vIGJhc2VsaW5lOiBldmVyeSBmaW5kaW5nIGlzIG5ldy4gQSBUUlVOQ0FURURcbiAqIGJhc2VsaW5lIGtub3dzIG9ubHkgaXRzIGZpcnN0IHtAbGluayBTQ0FOX1NVTU1BUllfTUFYX0ZJTkRJTkdTfSBmaW5kaW5nc1xuICogKENyaXRpY2FscyBmaXJzdCksIHNvIGEgZmluZGluZyBtaXNzaW5nIGZyb20gaXQgaXMgbmV3IG9ubHkgaWYgdGhlIGJhc2VsaW5lXG4gKiBwcm92YWJseSBsaXN0ZWQgZXZlcnkgZmluZGluZyBvZiB0aGF0IHNldmVyaXR5IOKAlCBvdGhlcndpc2UgaXQgbWF5IHNpbXBseSBoYXZlXG4gKiBiZWVuIGN1dCwgYW5kIHJlcG9ydGluZyBpdCBhcyBuZXcgd291bGQgYmUgYSBmYWxzZSBhbGFybSBvbiBldmVyeSBwYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3U2NhbkZpbmRpbmdzKFxuICBiZWZvcmU6IFBpY2s8UGx1Z2luU2NhblN1bW1hcnksICdmaW5kaW5ncycgfCAndHJ1bmNhdGVkJyB8ICdjcml0aWNhbCc+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgYWZ0ZXI6IHJlYWRvbmx5IFBsdWdpblNjYW5GaW5kaW5nW10sXG4pOiBQbHVnaW5TY2FuRmluZGluZ1tdIHtcbiAgaWYgKCFiZWZvcmUpIHJldHVybiBbLi4uYWZ0ZXJdO1xuICBjb25zdCBrbm93biA9IG5ldyBTZXQoYmVmb3JlLmZpbmRpbmdzLm1hcChzY2FuRmluZGluZ0tleSkpO1xuICBjb25zdCBsaXN0ZWRDcml0aWNhbCA9IGJlZm9yZS5maW5kaW5ncy5maWx0ZXIoKGYpID0+IGYuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpLmxlbmd0aDtcbiAgY29uc3QgY29tcGxldGUgPSB7XG4gICAgY3JpdGljYWw6ICFiZWZvcmUudHJ1bmNhdGVkIHx8IGxpc3RlZENyaXRpY2FsID49IGJlZm9yZS5jcml0aWNhbCxcbiAgICBoaWdoOiAhYmVmb3JlLnRydW5jYXRlZCxcbiAgfTtcbiAgcmV0dXJuIGFmdGVyLmZpbHRlcigoZikgPT4gY29tcGxldGVbZi5zZXZlcml0eV0gJiYgIWtub3duLmhhcyhzY2FuRmluZGluZ0tleShmKSkpO1xufVxuXG4vKiogRmluZGluZ3MgYSBmbGFnIC8gZ2F0ZSBtZXNzYWdlIGNhcnJpZXMuICovXG5leHBvcnQgY29uc3QgU0NBTl9GTEFHX1RPUF9GSU5ESU5HUyA9IDEwO1xuXG4vKiogTG9va3VwIC8gcmVzb2x1dGlvbiB3YXJuaW5nIGNvZGUgZm9yIGEgZmxhZ2dlZCB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IFZVTE5fRkxBR0dFRF9XQVJOSU5HID0gJ1ZVTE5fRkxBR0dFRCc7XG5cbi8qKlxuICogYFBMVUdJTl9WVUxOX01BWF9GSU5ESU5HU2A6IHRoZSBwbGF0Zm9ybSBmbG9vciDigJQgYSB2ZXJzaW9uIHdpdGggTU9SRSBnYXRlZFxuICogZmluZGluZ3MgKGZpeGFibGUsIG9yIEtFVi1saXN0ZWQsIGF0IG9yIGFib3ZlIGBQTFVHSU5fVlVMTl9GQUlMX09OYCkgdGhhblxuICogdGhpcyBmYWlscyBpdHMgYnVpbGQgKGBQTFVHSU5fVlVMTl9HQVRFYCkgYW5kIGlzXG4gKiBmbGFnZ2VkIGJ5IHRoZSByZXNjYW4uIERlZmF1bHQgYDBgOyBgLTFgIGRpc2FibGVzIHRoZSBmbG9vciAoYW5kIHRoZSBmbGFnKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpblZ1bG5NYXhGaW5kaW5ncygpOiBudW1iZXIge1xuICByZXR1cm4gZW52SW50KCdQTFVHSU5fVlVMTl9NQVhfRklORElOR1MnLCAwLCB7IG1pbjogLTEgfSk7XG59XG5cbi8qKlxuICogVGhlIGxvd2VzdCBzZXZlcml0eSB0aGUgZmxvb3IgZ2F0ZXMgb24g4oCUIHRoZSBwbHVnaW4gc2VydmljZSdzIGAtLWZhaWwtb25gLlxuICogT25seSBgY3JpdGljYWxgIGFuZCBgaGlnaGAgYXJlIHBvc3NpYmxlOiB0aG9zZSBhcmUgdGhlIHNldmVyaXRpZXMgYSBzY2FuXG4gKiBpdGVtaXplcyAoTWVkaXVtL0xvdyBhcmUgY291bnRlZCwgbmV2ZXIgbGlzdGVkKSwgYW5kIGEgZmxvb3IgY2FuIG9ubHkgZ2F0ZSBvblxuICogZmluZGluZ3MgaXQgY2FuIG5hbWUsIHdhaXZlIGFuZCByZXBvcnQuXG4gKi9cbmV4cG9ydCB0eXBlIFBsdWdpblZ1bG5GYWlsT24gPSAnY3JpdGljYWwnIHwgJ2hpZ2gnO1xuXG4vKipcbiAqIGBQTFVHSU5fVlVMTl9GQUlMX09OYCAoZGVmYXVsdCBgY3JpdGljYWxgKTogdGhlIHNldmVyaXR5IGF0IGFuZCBhYm92ZSB3aGljaCBhXG4gKiBmaXhhYmxlIChvciBLRVYtbGlzdGVkKSBmaW5kaW5nIGNvdW50cyBhZ2FpbnN0IGBQTFVHSU5fVlVMTl9NQVhfRklORElOR1NgLlxuICogYGhpZ2hgIGdhdGVzIENyaXRpY2FsIEFORCBIaWdoLiBBbnkgb3RoZXIgdmFsdWUgcmVzb2x2ZXMgdG8gYGhpZ2hgLCB0aGVcbiAqIFNUUklDVEVSIHNldHRpbmc6IHRoZSBmYWlsdXJlIG1vZGUgb2YgYSB0eXBvIG11c3QgYmUgXCJ0aGUgZ2F0ZSBibG9ja3MgbW9yZVwiLFxuICogbmV2ZXIgXCJ0aGUgZ2F0ZSBibG9ja3MgbGVzc1wiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luVnVsbkZhaWxPbigpOiBQbHVnaW5WdWxuRmFpbE9uIHtcbiAgcmV0dXJuIGVudlN0cignUExVR0lOX1ZVTE5fRkFJTF9PTicsICdjcml0aWNhbCcpLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSAnY3JpdGljYWwnID8gJ2NyaXRpY2FsJyA6ICdoaWdoJztcbn1cblxuLyoqIFdoZXRoZXIgYSBzZXZlcml0eSBpcyBhdCBvciBhYm92ZSB0aGUgZ2F0aW5nIHRocmVzaG9sZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdE9yQWJvdmVGYWlsT24oc2V2ZXJpdHk6IFBsdWdpblNjYW5GaW5kaW5nWydzZXZlcml0eSddLCBmYWlsT246IFBsdWdpblZ1bG5GYWlsT24gPSBwbHVnaW5WdWxuRmFpbE9uKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNldmVyaXR5ID09PSAnY3JpdGljYWwnIHx8IGZhaWxPbiA9PT0gJ2hpZ2gnO1xufVxuXG4vKipcbiAqIFRoZSBzY2FubmVyJ3MgZml4YWJsZSBjb3VudCBhdCBvciBhYm92ZSB0aGUgdGhyZXNob2xkIOKAlCB3aGF0IHRoZSBmbG9vciByZWFkc1xuICogd2hlbiBhIHNjYW4gcmVjb3JkZWQgY291bnRzIGJ1dCBubyBmaW5kaW5ncyB0byBkZXJpdmUgaXQgZnJvbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGVkRml4YWJsZUNvdW50KFxuICBjb3VudHM6IHsgdnVsbkNyaXRpY2FsRml4YWJsZTogbnVtYmVyIHwgbnVsbDsgdnVsbkhpZ2hGaXhhYmxlOiBudW1iZXIgfCBudWxsIH0sXG4gIGZhaWxPbjogUGx1Z2luVnVsbkZhaWxPbiA9IHBsdWdpblZ1bG5GYWlsT24oKSxcbik6IG51bWJlciB7XG4gIHJldHVybiAoY291bnRzLnZ1bG5Dcml0aWNhbEZpeGFibGUgPz8gMCkgKyAoZmFpbE9uID09PSAnaGlnaCcgPyBjb3VudHMudnVsbkhpZ2hGaXhhYmxlID8/IDAgOiAwKTtcbn1cblxuLyoqIGBDcml0aWNhbGAgLyBgQ3JpdGljYWwgb3IgSGlnaGAg4oCUIHRoZSBnYXRlZCBzZXZlcml0aWVzLCBmb3IgbWVzc2FnZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZmFpbE9uTGFiZWwoZmFpbE9uOiBQbHVnaW5WdWxuRmFpbE9uID0gcGx1Z2luVnVsbkZhaWxPbigpKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZhaWxPbiA9PT0gJ2NyaXRpY2FsJyA/ICdDcml0aWNhbCcgOiAnQ3JpdGljYWwgb3IgSGlnaCc7XG59XG5cbi8qKlxuICogYFBMVUdJTl9WVUxOX0dBVEVfS0VWYCAoZGVmYXVsdCB0cnVlKTogYSBDcml0aWNhbCBDSVNBIGxpc3RzIGFzIGtub3duXG4gKiBleHBsb2l0ZWQgY291bnRzIGFnYWluc3QgdGhlIGZsb29yIGV2ZW4gd2hlbiBpdCBoYXMgTk8gZml4LiBPZmYsIEtFViBmaW5kaW5nc1xuICogYXJlIGdhdGVkIGV4YWN0bHkgbGlrZSBhbnkgb3RoZXIgQ3JpdGljYWwgKGZpeGFibGUgb25seSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVnaW5WdWxuR2F0ZUtldigpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVudkJvb2woJ1BMVUdJTl9WVUxOX0dBVEVfS0VWJywgdHJ1ZSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGZpbmRpbmcgY291bnRzIGFnYWluc3QgdGhlIGZsb29yOiBhIGZpeGFibGUgZmluZGluZyBhdCBvciBhYm92ZVxuICogYFBMVUdJTl9WVUxOX0ZBSUxfT05gIChkZWZhdWx0IENyaXRpY2FsKSwgb3Ig4oCUIHVuZGVyIGBQTFVHSU5fVlVMTl9HQVRFX0tFVmBcbiAqIOKAlCBhIEtFVi1saXN0ZWQgb25lIGF0IG9yIGFib3ZlIGl0IHdpdGggb3Igd2l0aG91dCBhIGZpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2F0ZWRGaW5kaW5nKFxuICBmOiBQaWNrPFBsdWdpblNjYW5GaW5kaW5nLCAnc2V2ZXJpdHknIHwgJ2ZpeGVkSW4nIHwgJ2tldic+LFxuICBrZXZHYXRlOiBib29sZWFuID0gcGx1Z2luVnVsbkdhdGVLZXYoKSxcbiAgZmFpbE9uOiBQbHVnaW5WdWxuRmFpbE9uID0gcGx1Z2luVnVsbkZhaWxPbigpLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBhdE9yQWJvdmVGYWlsT24oZi5zZXZlcml0eSwgZmFpbE9uKSAmJiAoZi5maXhlZEluLmxlbmd0aCA+IDAgfHwgKGtldkdhdGUgJiYgZi5rZXYgPT09IHRydWUpKTtcbn1cblxuLyoqXG4gKiBBIHNjb3BlZCwgRVhQSVJJTkcgZXhlbXB0aW9uIGZyb20gdGhlIHZ1bG5lcmFiaWxpdHkgZmxvb3IgZm9yIG9uZSBwbHVnaW4uXG4gKlxuICogYFBMVUdJTl9WVUxOX01BWF9GSU5ESU5HU2AgaXMgdGhlIG9ubHkgb3RoZXIgbGV2ZXIgYW5kIGl0IGlzIGZhciB0b28gYmx1bnQ6XG4gKiByYWlzaW5nIGl0IGFib3ZlIDAgZXhlbXB0cyBldmVyeSBwbHVnaW4gZnJvbSBldmVyeSBDcml0aWNhbC4gU29tZSBpbWFnZXNcbiAqIGdlbnVpbmVseSBjYW5ub3QgcmVhY2ggemVybyDigJQgYSBicm93c2VyLWJ1bmRsaW5nIHRlc3QgcnVubmVyIChhcnRpbGxlcnkgc2hpcHNcbiAqIENocm9taXVtIHRocm91Z2ggaXRzIG93biBAcGxheXdyaWdodC9icm93c2VyLWNocm9taXVtIGRlcGVuZGVuY3ksIHBsYXl3cmlnaHRcbiAqIGRvd25sb2FkcyBGaXJlZm94KSBpcyBhdCB1cHN0cmVhbSdzIGxhdGVzdCBhbmQgc3RpbGwgY2FycmllcyBmaXhhYmxlIGZpbmRpbmdzLFxuICogYmVjYXVzZSBicm93c2VycyBzaGlwIENWRSBmaXhlcyB3ZWVrbHkgd2hpbGUgcGlubmVkIGJ1aWxkcyBsYWcgYnkgZGVzaWduLlxuICogV2l0aG91dCBhIG5hcnJvdyBleGVtcHRpb24gdGhlIG9ubHkgb3B0aW9ucyBhcmUgXCJibG9jayB0aGUgcGx1Z2luIGZvcmV2ZXJcIiBvclxuICogXCJkaXNhYmxlIHRoZSBmbG9vciBmb3IgZXZlcnl0aGluZ1wiLlxuICpcbiAqIFRocmVlIHByb3BlcnRpZXMgbWFrZSB0aGlzIGFuIGV4ZW1wdGlvbiByYXRoZXIgdGhhbiBhIGhvbGUsIGFuZCBhbGwgdGhyZWUgYXJlXG4gKiBlbmZvcmNlZCBiZWxvdyByYXRoZXIgdGhhbiBkb2N1bWVudGVkIGFuZCBob3BlZCBmb3I6XG4gKlxuICogICBTQ09QRUQgICAgdG8gb25lIHBsdWdpbiAob3IsIGZsZWV0LXdpZGUsIHRvIG5hbWVkIGFkdmlzb3JpZXMgb25seSksIHRvXG4gKiAgICAgICAgICAgICBuYW1lZCBwYWNrYWdlcy9hZHZpc29yaWVzLCBBTkQgdG8gdGhlIHN5c3RlbSBvcmcuIEEgbmV3IENyaXRpY2FsXG4gKiAgICAgICAgICAgICBpbiBhbnl0aGluZyBub3QgbmFtZWQgc3RpbGwgZmFpbHMgdGhlIGdhdGUsIHNvIGEgd2FpdmVyIGNhbm5vdFxuICogICAgICAgICAgICAgZ3JvdyBzaWxlbnRseSBpbnRvIFwidGhpcyBwbHVnaW4gaXMgZXhlbXB0XCIuIFRoZSBvcmcgYm91bmRcbiAqICAgICAgICAgICAgIG1hdHRlcnMgYmVjYXVzZSBwbHVnaW4gbmFtZXMgYXJlIHVuaXF1ZSBwZXIgKG5hbWUsIHZlcnNpb24sXG4gKiAgICAgICAgICAgICBvcmdJZCkgYW5kIE5PVCBnbG9iYWxseTogd2l0aG91dCBpdCwgYW55IHRlbmFudCBjb3VsZCBpbmhlcml0IGFuXG4gKiAgICAgICAgICAgICBleGVtcHRpb24gYnkgbmFtaW5nIHRoZWlyIHBsdWdpbiBgYXJ0aWxsZXJ5YC5cbiAqICAgRVhQSVJJTkcgIGV2ZXJ5IGVudHJ5IGNhcnJpZXMgYSBkYXRlIGFuZCBzdG9wcyBhcHBseWluZyBhZnRlciBpdC4gQSB3YWl2ZXJcbiAqICAgICAgICAgICAgIG5vYm9keSByZXZpc2l0cyBiZWNvbWVzIHBlcm1hbmVudDsgdGhpcyBvbmUgbGFwc2VzIG9uIGl0cyBvd24gYW5kXG4gKiAgICAgICAgICAgICB0aGUgcGx1Z2luIHN0YXJ0cyBmYWlsaW5nIGFnYWluLCB3aGljaCBpcyB0aGUgaW50ZW5kZWQgcHJvbXB0LlxuICogICBWSVNJQkxFICAgd2hhdCB3YXMgd2FpdmVkIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIsIHNvIGl0IHJlYWNoZXMgdGhlXG4gKiAgICAgICAgICAgICBtZXRyaWMsIHRoZSBhdWRpdCByZWNvcmQgYW5kIHRoZSBidWlsZCBtZXNzYWdlIGluc3RlYWQgb2ZcbiAqICAgICAgICAgICAgIHZhbmlzaGluZyBmcm9tIHRoZSBjb3VudC5cbiAqXG4gKiBGb3JtYXQg4oCUIGVudHJpZXMgYDtgLXNlcGFyYXRlZCwgZmllbGRzIGA6YC1zZXBhcmF0ZWQsIHRhcmdldHMgYCxgLXNlcGFyYXRlZC5cbiAqIEEgdGFyZ2V0IGlzIGEgcGFja2FnZSBuYW1lIChgY2hyb21pdW1gKSBvciBhbiBhZHZpc29yeSBpZCAoYEdPLTIwMjYtNjYxMmApLFxuICogbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaW5kaW5nJ3MgcGFja2FnZSBvciBpZCByZXNwZWN0aXZlbHk6XG4gKlxuICogICBQTFVHSU5fVlVMTl9XQUlWRVJTPWFydGlsbGVyeToyMDI2LTEyLTMxOmNocm9taXVtLGNocm9tZTtwbGF5d3JpZ2h0OjIwMjYtMTItMzE6ZmlyZWZveFxuICpcbiAqIEZMRUVULVdJREUgKGAqYCBhcyB0aGUgcGx1Z2luKSBpcyBmb3Igb25lIGFkdmlzb3J5IHRoYXQgZXZlcnkgYnVuZGxlciBvZiBhXG4gKiB0b29sY2hhaW4gaW5oZXJpdHMg4oCUIGEgR28gc3RkbGliIENWRSByZWFjaGVzIGV2ZXJ5IHByZWJ1aWx0IEdvIGJpbmFyeSBhdCBvbmNlLFxuICogYW5kIGxpc3RpbmcgZWFjaCBwbHVnaW4gaGlkZXMgdGhhdCBpdCBpcyBvbmUgZGVjaXNpb24uIEl0IG1heSBuYW1lIEFEVklTT1JZXG4gKiBJRFMgT05MWTogYCo6MjAyNi0xMi0zMTpzdGRsaWJgIHdvdWxkIHdhaXZlIGV2ZXJ5IHByZXNlbnQgYW5kIGZ1dHVyZSBzdGRsaWJcbiAqIENyaXRpY2FsIGluIGV2ZXJ5IHBsdWdpbiwgaW5jbHVkaW5nIG9uZXMgYSByZWJ1aWxkIGNvdWxkIGNsZWFyLCBzbyBhIHBhY2thZ2VcbiAqIG5hbWUgdW5kZXIgYCpgIGlzIHJlamVjdGVkLiBgKmAgdGFrZXMgbm8gYEB2ZXJzaW9uYCAodmVyc2lvbnMgYXJlIHBlciBwbHVnaW4pXG4gKiBhbmQga2VlcHMgdGhlIHN5c3RlbS1vcmcgYm91bmQgYW5kIHRoZSBleHBpcnk6XG4gKlxuICogICBQTFVHSU5fVlVMTl9XQUlWRVJTPSo6MjAyNi0xMi0zMTpHTy0yMDI2LTY2MTIsR08tMjAyNi02NjA0XG4gKlxuICogQSBtYWxmb3JtZWQgZW50cnkgaXMgRFJPUFBFRCwgbmV2ZXIgdHJlYXRlZCBhcyBhIHdpbGRjYXJkOiB0aGUgZmFpbHVyZSBtb2RlXG4gKiBvZiBhIHR5cG8gbXVzdCBiZSBcInRoZSBnYXRlIHN0aWxsIGJsb2Nrc1wiLCBub3QgXCJldmVyeXRoaW5nIGlzIHdhaXZlZFwiLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZ1bG5XYWl2ZXIge1xuICAvKiogUGx1Z2luIG5hbWUgdGhlIHdhaXZlciBhcHBsaWVzIHRvIChleGFjdCBtYXRjaCksIG9yIHtAbGluayBXQUlWRV9BTExfUExVR0lOU30uICovXG4gIHBsdWdpbjogc3RyaW5nO1xuICAvKipcbiAgICogUGx1Z2luIHZlcnNpb24gdGhlIHdhaXZlciBpcyBsaW1pdGVkIHRvLCBvciBudWxsIGZvciBldmVyeSB2ZXJzaW9uLlxuICAgKlxuICAgKiBBIHdhaXZlciBpcyBhIGp1ZGdlbWVudCBhYm91dCBhIFNQRUNJRklDIGltYWdlIOKAlCBcInRoaXMgcmVsZWFzZSBvZiBhcnRpbGxlcnlcbiAgICogYnVuZGxlcyBhIENocm9taXVtIHdlIGNhbm5vdCBwYXRjaFwiLiBMZWZ0IHVucGlubmVkIGl0IHNpbGVudGx5IGNhcnJpZXMgdG9cbiAgICogZXZlcnkgZnV0dXJlIHZlcnNpb24sIGluY2x1ZGluZyBvbmVzIHdob3NlIGZpbmRpbmdzIG5vYm9keSBoYXMgbG9va2VkIGF0LFxuICAgKiB3aGljaCBpcyBob3cgYSBuYXJyb3cgZXhlbXB0aW9uIGJlY29tZXMgYSBzdGFuZGluZyBvbmUuXG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmcgfCBudWxsO1xuICAvKiogSW5jbHVzaXZlIGV4cGlyeSAoVVRDIGRhdGUpLiBBZnRlciBpdCB0aGUgZW50cnkgaGFzIG5vIGVmZmVjdC4gKi9cbiAgZXhwaXJlczogRGF0ZTtcbiAgLyoqXG4gICAqIFBhY2thZ2UgbmFtZXMgYW5kL29yIGFkdmlzb3J5IGlkcyB3aG9zZSBmaW5kaW5ncyBhcmUgZXhlbXB0LiBOZXZlciBlbXB0eSDigJRcbiAgICogc2VlIHBhcnNlVnVsbldhaXZlcnMuIEFkdmlzb3J5IGlkcyBvbmx5IHdoZW4gYHBsdWdpbmAgaXMgYCpgLlxuICAgKi9cbiAgcGFja2FnZXM6IHN0cmluZ1tdO1xufVxuXG4vKiogVGhlIGBwbHVnaW5gIG9mIGEgZmxlZXQtd2lkZSB3YWl2ZXIuIEFkdmlzb3J5IGlkcyBvbmx5IOKAlCBzZWUgVnVsbldhaXZlci4gKi9cbmV4cG9ydCBjb25zdCBXQUlWRV9BTExfUExVR0lOUyA9ICcqJztcblxuLyoqXG4gKiBBbiBhZHZpc29yeSBpZCBhcyBzY2FubmVycyByZXBvcnQgaXQgKENWRSwgR0hTQSwgR28gdnVsbmRiLCBQeVBBLCBSdXN0U2VjKS5cbiAqIEFueXRoaW5nIGVsc2UgaXMgYSBwYWNrYWdlIG5hbWUsIHdoaWNoIGEgZmxlZXQtd2lkZSB3YWl2ZXIgbWF5IG5vdCB1c2UuXG4gKi9cbmNvbnN0IEFEVklTT1JZX0lEID0gL14oQ1ZFLVxcZHs0fS1cXGR7NCx9fEdIU0EoLVswLTlhLXpdezR9KXszfXxHTy1cXGR7NH0tXFxkezQsfXxQWVNFQy1cXGR7NH0tXFxkK3xSVVNUU0VDLVxcZHs0fS1cXGR7NCx9KSQvaTtcblxuLyoqIEEgZHJvcHBlZCBlbnRyeSBhbmQgd2h5LCBzbyB0aGUgb3BlcmF0b3IgY2FuIGJlIHRvbGQgaW5zdGVhZCBvZiBndWVzc2luZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnVsbldhaXZlclByb2JsZW0ge1xuICBlbnRyeTogc3RyaW5nO1xuICByZWFzb246IHN0cmluZztcbn1cblxuLyoqIFBhcnNlZCB3YWl2ZXJzIHBsdXMgdGhlIGVudHJpZXMgdGhhdCB3ZXJlIHJlamVjdGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuV2FpdmVyUGFyc2Uge1xuICB3YWl2ZXJzOiBWdWxuV2FpdmVyW107XG4gIHByb2JsZW1zOiBWdWxuV2FpdmVyUHJvYmxlbVtdO1xufVxuXG4vKipcbiAqIFBhcnNlIGBQTFVHSU5fVlVMTl9XQUlWRVJTYCwgUkVQT1JUSU5HIHdoYXQgd2FzIGRyb3BwZWQuXG4gKlxuICogRHJvcHBpbmcgYSBtYWxmb3JtZWQgZW50cnkgaXMgdGhlIHNhZmUgZGlyZWN0aW9uIOKAlCBhIHR5cG8gbXVzdCBub3QgYmVjb21lIGFcbiAqIHdpbGRjYXJkIOKAlCBidXQgc2lsZW50bHkgZHJvcHBpbmcgaXQgaXMgYSB1c2FiaWxpdHkgdHJhcDogdGhlIG9wZXJhdG9yIHNldHMgYVxuICogd2FpdmVyLCB0aGUgZ2F0ZSBrZWVwcyBibG9ja2luZywgYW5kIG5vdGhpbmcgYW55d2hlcmUgc2F5cyB3aHkuIENhbGxlcnMgdGhhdFxuICogY2FuIHN1cmZhY2UgaXQgKHNlcnZpY2UgYm9vdCkgdXNlIHRoaXM7IGBwYXJzZVZ1bG5XYWl2ZXJzYCBpcyB0aGUgc2hvcnRoYW5kXG4gKiBmb3IgdGhlIG9uZXMgdGhhdCBjYW5ub3QuXG4gKlxuICogRW50cnkgZ3JhbW1hcjogYDxwbHVnaW4+W0A8dmVyc2lvbj5dOjxZWVlZLU1NLUREPjo8cGtnPlssPHBrZz7igKZdYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWdWxuV2FpdmVyc1ZlcmJvc2UocmF3OiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwcm9jZXNzLmVudi5QTFVHSU5fVlVMTl9XQUlWRVJTKTogVnVsbldhaXZlclBhcnNlIHtcbiAgY29uc3Qgd2FpdmVyczogVnVsbldhaXZlcltdID0gW107XG4gIGNvbnN0IHByb2JsZW1zOiBWdWxuV2FpdmVyUHJvYmxlbVtdID0gW107XG4gIGlmICghcmF3Py50cmltKCkpIHJldHVybiB7IHdhaXZlcnMsIHByb2JsZW1zIH07XG4gIGNvbnN0IHJlamVjdCA9IChlbnRyeTogc3RyaW5nLCByZWFzb246IHN0cmluZykgPT4geyBwcm9ibGVtcy5wdXNoKHsgZW50cnk6IGVudHJ5LnRyaW0oKSwgcmVhc29uIH0pOyB9O1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgcmF3LnNwbGl0KCc7JykpIHtcbiAgICBpZiAoIWVudHJ5LnRyaW0oKSkgY29udGludWU7XG4gICAgY29uc3QgW3RhcmdldCwgZXhwaXJlcywgcGFja2FnZXNdID0gZW50cnkuc3BsaXQoJzonKS5tYXAoKGYpID0+IGY/LnRyaW0oKSA/PyAnJyk7XG4gICAgLy8gRXZlcnkgZmllbGQgaXMgUkVRVUlSRUQuIEFuIGVudHJ5IG1pc3NpbmcgaXRzIHBhY2thZ2UgbGlzdCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSByZWFkIGFzIFwid2FpdmUgdGhpcyBwbHVnaW4gZW50aXJlbHlcIiwgd2hpY2ggaXMgdGhlIG9uZSB0aGluZ1xuICAgIC8vIHRoaXMgbXVzdCBub3QgYmUgYWJsZSB0byBleHByZXNzLlxuICAgIGlmICghdGFyZ2V0IHx8ICFleHBpcmVzIHx8ICFwYWNrYWdlcykge1xuICAgICAgcmVqZWN0KGVudHJ5LCAnZXhwZWN0ZWQgPHBsdWdpbj5bQDx2ZXJzaW9uPl06PFlZWVktTU0tREQ+OjxwYWNrYWdlPlssPHBhY2thZ2U+4oCmXScpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGF0ID0gdGFyZ2V0LmluZGV4T2YoJ0AnKTtcbiAgICBjb25zdCBwbHVnaW4gPSBhdCA9PT0gLTEgPyB0YXJnZXQgOiB0YXJnZXQuc2xpY2UoMCwgYXQpLnRyaW0oKTtcbiAgICBjb25zdCB2ZXJzaW9uID0gYXQgPT09IC0xID8gbnVsbCA6IHRhcmdldC5zbGljZShhdCArIDEpLnRyaW0oKTtcbiAgICBpZiAoIXBsdWdpbikgeyByZWplY3QoZW50cnksICdubyBwbHVnaW4gbmFtZScpOyBjb250aW51ZTsgfVxuICAgIGlmIChhdCAhPT0gLTEgJiYgIXZlcnNpb24pIHsgcmVqZWN0KGVudHJ5LCBcIidAJyB3aXRoIG5vIHZlcnNpb24g4oCUIG9taXQgaXQgdG8gY292ZXIgZXZlcnkgdmVyc2lvblwiKTsgY29udGludWU7IH1cbiAgICBpZiAocGx1Z2luID09PSBXQUlWRV9BTExfUExVR0lOUyAmJiB2ZXJzaW9uICE9PSBudWxsKSB7IHJlamVjdChlbnRyeSwgXCInKicgY292ZXJzIGV2ZXJ5IHBsdWdpbiwgc28gaXQgY2Fubm90IHBpbiBhIHZlcnNpb25cIik7IGNvbnRpbnVlOyB9XG4gICAgaWYgKCEvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8udGVzdChleHBpcmVzKSkgeyByZWplY3QoZW50cnksIGBleHBpcnkgJyR7ZXhwaXJlc30nIGlzIG5vdCBZWVlZLU1NLUREYCk7IGNvbnRpbnVlOyB9XG4gICAgY29uc3Qgd2hlbiA9IG5ldyBEYXRlKGAke2V4cGlyZXN9VDIzOjU5OjU5Ljk5OVpgKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHdoZW4uZ2V0VGltZSgpKSkgeyByZWplY3QoZW50cnksIGBleHBpcnkgJyR7ZXhwaXJlc30nIGlzIG5vdCBhIHJlYWwgZGF0ZWApOyBjb250aW51ZTsgfVxuICAgIGNvbnN0IG5hbWVzID0gcGFja2FnZXMuc3BsaXQoJywnKS5tYXAoKG4pID0+IG4udHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkgeyByZWplY3QoZW50cnksICdubyBwYWNrYWdlIG5hbWVzJyk7IGNvbnRpbnVlOyB9XG4gICAgaWYgKHBsdWdpbiA9PT0gV0FJVkVfQUxMX1BMVUdJTlMpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5hbWVzLmZpbHRlcigobikgPT4gIUFEVklTT1JZX0lELnRlc3QobikpO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlamVjdChlbnRyeSwgYCcqJyB0YWtlcyBhZHZpc29yeSBpZHMgb25seSAoQ1ZFLeKApiwgR0hTQS3igKYsIEdPLeKApik7ICcke3BhY2thZ2VOYW1lcy5qb2luKCcsICcpfScgd291bGQgd2FpdmUgYSBwYWNrYWdlIGluIGV2ZXJ5IHBsdWdpbmApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2FpdmVycy5wdXNoKHsgcGx1Z2luLCB2ZXJzaW9uLCBleHBpcmVzOiB3aGVuLCBwYWNrYWdlczogbmFtZXMgfSk7XG4gIH1cbiAgcmV0dXJuIHsgd2FpdmVycywgcHJvYmxlbXMgfTtcbn1cblxuLyoqIFBhcnNlIGBQTFVHSU5fVlVMTl9XQUlWRVJTYC4gTWFsZm9ybWVkIG9yIGluY29tcGxldGUgZW50cmllcyBhcmUgZHJvcHBlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZ1bG5XYWl2ZXJzKHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvY2Vzcy5lbnYuUExVR0lOX1ZVTE5fV0FJVkVSUyk6IFZ1bG5XYWl2ZXJbXSB7XG4gIHJldHVybiBwYXJzZVZ1bG5XYWl2ZXJzVmVyYm9zZShyYXcpLndhaXZlcnM7XG59XG5cbi8qKiBXaGF0IGEgd2FpdmVyIHJlbW92ZWQgZnJvbSB0aGUgY291bnQsIGFuZCB3aGF0IHN0aWxsIGNvdW50cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FpdmVyT3V0Y29tZSB7XG4gIC8qKiBGaW5kaW5ncyB0aGUgZmxvb3Igc3RpbGwgY291bnRzLiAqL1xuICBjb3VudGVkOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xuICAvKiogRmluZGluZ3MgYW4gdW5leHBpcmVkIHdhaXZlciBleGVtcHRlZCAoZW1wdHkgd2hlbiBub25lIGFwcGxpZWQpLiAqL1xuICB3YWl2ZWQ6IFBsdWdpblNjYW5GaW5kaW5nW107XG4gIC8qKiBUaGUgZW50cmllcyB0aGF0IGV4ZW1wdGVkIGF0IGxlYXN0IG9uZSBmaW5kaW5nIOKAlCB3aGF0IFwidGhpcyB3YWl2ZXIgaXMgc3RpbGwgZG9pbmcgc29tZXRoaW5nXCIgaXMgbWVhc3VyZWQgYnkuICovXG4gIG1hdGNoZWQ6IFZ1bG5XYWl2ZXJbXTtcbn1cblxuLyoqIE9uZSB3YWl2ZXIgZW50cnkncyBpZGVudGl0eTogdGhlIHBsdWdpbiBpdCBuYW1lcyAod2l0aCBpdHMgcGluKSBhbmQgaXRzIHRhcmdldHMuICovXG5leHBvcnQgZnVuY3Rpb24gdnVsbldhaXZlckxhYmVscyh3OiBQaWNrPFZ1bG5XYWl2ZXIsICdwbHVnaW4nIHwgJ3ZlcnNpb24nIHwgJ3BhY2thZ2VzJz4pOiB7IHBsdWdpbjogc3RyaW5nOyB0YXJnZXRzOiBzdHJpbmcgfSB7XG4gIHJldHVybiB7IHBsdWdpbjogdy52ZXJzaW9uID8gYCR7dy5wbHVnaW59QCR7dy52ZXJzaW9ufWAgOiB3LnBsdWdpbiwgdGFyZ2V0czogdy5wYWNrYWdlcy5qb2luKCcsJykgfTtcbn1cblxuLyoqXG4gKiBTcGxpdCBmaW5kaW5ncyBpbnRvIHdoYXQgc3RpbGwgY291bnRzIGFuZCB3aGF0IGFuIHVuZXhwaXJlZCB3YWl2ZXIgZXhlbXB0cy5cbiAqXG4gKiBNYXRjaGluZyBpcyBvbiB0aGUgcGFja2FnZSBuYW1lIG9yIGFkdmlzb3J5IGlkIGEgd2FpdmVyIG5hbWVzLFxuICogY2FzZS1pbnNlbnNpdGl2ZWx5LCBhbmQgb25seSBmb3IgZmluZGluZ3MgdGhhdCBhcmUgR0FURURcbiAqICh7QGxpbmsgaXNHYXRlZEZpbmRpbmd9KSDigJQgYW4gdW5nYXRlZCBmaW5kaW5nIG5ldmVyIGNvdW50ZWQgdG93YXJkIHRoZSBmbG9vcixcbiAqIHNvIFwid2FpdmluZ1wiIGl0IHdvdWxkIG92ZXJzdGF0ZSB3aGF0IHRoZSB3YWl2ZXIgZG9lcy5cbiAqXG4gKiBBIEtFVi1saXN0ZWQgZmluZGluZyBpcyBleGVtcHRlZCBieSBhbiBBRFZJU09SWS1JRCB0YXJnZXQgb25seSwgbmV2ZXIgYnkgYVxuICogcGFja2FnZSBuYW1lLiBgYXJ0aWxsZXJ5OuKApjpjaHJvbWl1bWAgaXMgYSBqdWRnZW1lbnQgYWJvdXQgQ2hyb21pdW0ncyBvcmRpbmFyeVxuICogY2h1cm47IGl0IHdhcyBub3Qgd3JpdHRlbiBhYm91dCwgYW5kIG11c3Qgbm90IHNpbGVudGx5IGNvdmVyLCB0aGUgb25lXG4gKiBDaHJvbWl1bSBDVkUgdGhhdCBpcyBiZWluZyBleHBsb2l0ZWQgdG9kYXkuIE5hbWluZyB0aGF0IENWRSBpcyB0aGUgZGVsaWJlcmF0ZVxuICogYWN0IGFuIGV4ZW1wdGlvbiBmb3IgaXQgcmVxdWlyZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVZ1bG5XYWl2ZXJzKFxuICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gIGZpbmRpbmdzOiByZWFkb25seSBQbHVnaW5TY2FuRmluZGluZ1tdLFxuICB3YWl2ZXJzOiByZWFkb25seSBWdWxuV2FpdmVyW10gPSBwYXJzZVZ1bG5XYWl2ZXJzKCksXG4gIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCksXG4gIG9yZ0lkPzogc3RyaW5nLFxuICBwbHVnaW5WZXJzaW9uPzogc3RyaW5nLFxuKTogV2FpdmVyT3V0Y29tZSB7XG4gIC8vIFNZU1RFTSBPUkcgT05MWS4gUGx1Z2luIG5hbWVzIGFyZSB1bmlxdWUgcGVyIChuYW1lLCB2ZXJzaW9uLCBvcmdJZCksIE5PVFxuICAvLyBnbG9iYWxseSDigJQgYW55IHRlbmFudCBjYW4gY3JlYXRlIGEgcGx1Z2luIGNhbGxlZCBgYXJ0aWxsZXJ5YC4gTWF0Y2hpbmcgb25cbiAgLy8gdGhlIG5hbWUgYWxvbmUgd291bGQgaGFuZCBldmVyeSBvbmUgb2YgdGhlbSB0aGUgb3BlcmF0b3IncyBleGVtcHRpb24sIHNvIGFcbiAgLy8gdGVuYW50IGNvdWxkIGluaGVyaXQgYSB3YWl2ZXIgc2ltcGx5IGJ5IGNob29zaW5nIHRoZSBuYW1lLCBhbmQgc2hpcCBhblxuICAvLyBpbWFnZSB3aG9zZSBDcml0aWNhbHMgdGhlIGdhdGUgdGhlbiB3YXZlZCB0aHJvdWdoLiBUaGUgd2FpdmVycyBleGlzdCBmb3IgdGhlXG4gIC8vIE9mZmljaWFsIGNhdGFsb2cgdGhlIG9wZXJhdG9yIGN1cmF0ZXMsIHdoaWNoIGxpdmVzIGluIHRoZSBzeXN0ZW0gb3JnOyBhXG4gIC8vIGNhbGxlciB0aGF0IGNhbm5vdCBzYXkgd2hpY2ggb3JnIHRoaXMgYnVpbGQgYmVsb25ncyB0byBnZXRzIG5vIHdhaXZlci5cbiAgaWYgKG9yZ0lkID09PSB1bmRlZmluZWQgfHwgb3JnSWQudG9Mb3dlckNhc2UoKSAhPT0gU1lTVEVNX09SR19JRCkgcmV0dXJuIHsgY291bnRlZDogWy4uLmZpbmRpbmdzXSwgd2FpdmVkOiBbXSwgbWF0Y2hlZDogW10gfTtcbiAgY29uc3QgYWN0aXZlID0gd2FpdmVycy5maWx0ZXIoKHcpID0+ICh3LnBsdWdpbiA9PT0gcGx1Z2luTmFtZSB8fCB3LnBsdWdpbiA9PT0gV0FJVkVfQUxMX1BMVUdJTlMpXG4gICAgJiYgdy5leHBpcmVzLmdldFRpbWUoKSA+PSBub3cuZ2V0VGltZSgpXG4gICAgLy8gQSB2ZXJzaW9uLXBpbm5lZCB3YWl2ZXIgY292ZXJzIHRoYXQgdmVyc2lvbiBvbmx5LiBBbiB1bnBpbm5lZCBvbmUgY292ZXJzXG4gICAgLy8gZXZlcnkgdmVyc2lvbiwgd2hpY2ggaXMgd2h5IHRoZSBwaW4gaXMgd29ydGggd3JpdGluZy5cbiAgICAmJiAody52ZXJzaW9uID09PSBudWxsIHx8IHcudmVyc2lvbiA9PT0gcGx1Z2luVmVyc2lvbikpO1xuICBpZiAoYWN0aXZlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgY291bnRlZDogWy4uLmZpbmRpbmdzXSwgd2FpdmVkOiBbXSwgbWF0Y2hlZDogW10gfTtcbiAgY29uc3Qga2V2R2F0ZSA9IHBsdWdpblZ1bG5HYXRlS2V2KCk7XG4gIGNvbnN0IHRhcmdldHMgPSBhY3RpdmUubWFwKCh3KSA9PiAoeyB3LCBuYW1lczogbmV3IFNldCh3LnBhY2thZ2VzLm1hcCgobikgPT4gbi50b0xvd2VyQ2FzZSgpKSkgfSkpO1xuICBjb25zdCBjb3VudGVkOiBQbHVnaW5TY2FuRmluZGluZ1tdID0gW107XG4gIGNvbnN0IHdhaXZlZDogUGx1Z2luU2NhbkZpbmRpbmdbXSA9IFtdO1xuICBjb25zdCBtYXRjaGVkID0gbmV3IFNldDxWdWxuV2FpdmVyPigpO1xuICBmb3IgKGNvbnN0IGYgb2YgZmluZGluZ3MpIHtcbiAgICBjb25zdCBpZCA9IGYuaWQudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBwa2cgPSBmLnBhY2thZ2VOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgYnkgPSBpc0dhdGVkRmluZGluZyhmLCBrZXZHYXRlKVxuICAgICAgPyB0YXJnZXRzLmZpbHRlcigodCkgPT4gdC5uYW1lcy5oYXMoaWQpIHx8IChmLmtldiAhPT0gdHJ1ZSAmJiB0Lm5hbWVzLmhhcyhwa2cpKSlcbiAgICAgIDogW107XG4gICAgaWYgKGJ5Lmxlbmd0aCA9PT0gMCkgeyBjb3VudGVkLnB1c2goZik7IGNvbnRpbnVlOyB9XG4gICAgd2FpdmVkLnB1c2goZik7XG4gICAgZm9yIChjb25zdCB0IG9mIGJ5KSBtYXRjaGVkLmFkZCh0LncpO1xuICB9XG4gIHJldHVybiB7IGNvdW50ZWQsIHdhaXZlZCwgbWF0Y2hlZDogWy4uLm1hdGNoZWRdIH07XG59XG5cbi8qKiBXaGV0aGVyIGBnYXRlZENyaXRpY2FsYCBicmVha3MgdGhlIHBsYXRmb3JtIGZsb29yIChuZXZlciwgd2hlbiBkaXNhYmxlZCkuICovXG5leHBvcnQgZnVuY3Rpb24gZXhjZWVkc1Z1bG5GbG9vcihnYXRlZDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgbWF4OiBudW1iZXIgPSBwbHVnaW5WdWxuTWF4RmluZGluZ3MoKSk6IGJvb2xlYW4ge1xuICByZXR1cm4gbWF4ID49IDAgJiYgKGdhdGVkID8/IDApID4gbWF4O1xufVxuXG4vKiogYHBrZ0AxLjIuMyDihpIgMS4yLjRgIC8gYHBrZ0AxLjIuMyAobm8gZml4KWAuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVGaXgoZjogUGljazxQbHVnaW5TY2FuRmluZGluZywgJ3BhY2thZ2VOYW1lJyB8ICdwYWNrYWdlVmVyc2lvbicgfCAnZml4ZWRJbic+KTogc3RyaW5nIHtcbiAgY29uc3QgYXQgPSBgJHtmLnBhY2thZ2VOYW1lfSR7Zi5wYWNrYWdlVmVyc2lvbiA/IGBAJHtmLnBhY2thZ2VWZXJzaW9ufWAgOiAnJ31gO1xuICByZXR1cm4gZi5maXhlZEluLmxlbmd0aCA+IDAgPyBgJHthdH0g4oaSICR7Zi5maXhlZEluLmpvaW4oJywgJyl9YCA6IGAke2F0fSAobm8gZml4KWA7XG59XG5cbi8qKiBgQ1ZFLTEgKG9wZW5zc2xAMy4wLjEg4oaSIDMuMC4yKTsgQ1ZFLTIgKOKApilgIGZvciB0aGUgZmlyc3QgYGxpbWl0YCBmaW5kaW5ncy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmliZUZpbmRpbmdzKGZpbmRpbmdzOiByZWFkb25seSBQbHVnaW5TY2FuRmluZGluZ1tdLCBsaW1pdCA9IDUpOiBzdHJpbmcge1xuICBjb25zdCBzaG93biA9IGZpbmRpbmdzLnNsaWNlKDAsIGxpbWl0KS5tYXAoKGYpID0+IGAke2YuaWR9ICgke2Rlc2NyaWJlRml4KGYpfSlgKS5qb2luKCc7ICcpO1xuICBjb25zdCBtb3JlID0gZmluZGluZ3MubGVuZ3RoID4gbGltaXQgPyBgOyArJHtmaW5kaW5ncy5sZW5ndGggLSBsaW1pdH0gbW9yZWAgOiAnJztcbiAgcmV0dXJuIGAke3Nob3dufSR7bW9yZX1gO1xufVxuXG4vKipcbiAqIGBOIGZpeGFibGUgQ3JpdGljYWwgZmluZGluZ3NgLCBvciDigJQgd2hlbiBhbnkgZ2F0ZWQgZmluZGluZyBpcyBLRVYtbGlzdGVkLCBzb1xuICogXCJmaXhhYmxlXCIgYWxvbmUgd291bGQgbWlzZGVzY3JpYmUgdGhlIGNvdW50IOKAlCBgTiBDcml0aWNhbCBmaW5kaW5ncyB0aGF0IGFyZVxuICogZml4YWJsZSBvciBrbm93biBleHBsb2l0ZWQgKE0gb24gQ0lTQSBLRVYpYC5cbiAqL1xuZnVuY3Rpb24gZ2F0ZWRQaHJhc2UoZmxhZzogUGljazxQbHVnaW5TY2FuRmxhZywgJ2dhdGVkJyB8ICdrZXYnIHwgJ2ZhaWxPbic+KTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IGZsYWcuZ2F0ZWQgPT09IDEgPyAnJyA6ICdzJztcbiAgY29uc3QgbGFiZWwgPSBmYWlsT25MYWJlbChmbGFnLmZhaWxPbiA/PyAnY3JpdGljYWwnKTtcbiAgcmV0dXJuIGZsYWcua2V2XG4gICAgPyBgJHtmbGFnLmdhdGVkfSAke2xhYmVsfSBmaW5kaW5nJHtzfSB0aGF0ICR7ZmxhZy5nYXRlZCA9PT0gMSA/ICdpcycgOiAnYXJlJ30gZml4YWJsZSBvciBrbm93biBleHBsb2l0ZWQgKCR7ZmxhZy5rZXZ9IG9uIENJU0EgS0VWKWBcbiAgICA6IGAke2ZsYWcuZ2F0ZWR9IGZpeGFibGUgJHtsYWJlbH0gZmluZGluZyR7c31gO1xufVxuXG4vKiogVGhlIHdhcm5pbmcgdGV4dCBmb3IgYSBmbGFnZ2VkIHZlcnNpb246IGB4QHYgaGFzIE4gZml4YWJsZSBDcml0aWNhbCBmaW5kaW5ncyDigJQgcmVidWlsZCBvciB1cGdyYWRlYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2dWxuRmxhZ2dlZE1lc3NhZ2UocmVmOiBzdHJpbmcsIGZsYWc6IFBpY2s8UGx1Z2luU2NhbkZsYWcsICdnYXRlZCcgfCAna2V2JyB8ICdmYWlsT24nPik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtyZWZ9IGhhcyAke2dhdGVkUGhyYXNlKGZsYWcpfSDigJQgcmVidWlsZCBvciB1cGdyYWRlYDtcbn1cblxuLyoqIEEgYFZVTE5fRkxBR0dFRGAgbG9va3VwIHdhcm5pbmcgKHRoZSBsb29rdXAgZW52ZWxvcGUncyBgd2FybmluZ3NbXWAgZW50cnkpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuRmxhZ2dlZFdhcm5pbmcge1xuICBjb2RlOiB0eXBlb2YgVlVMTl9GTEFHR0VEX1dBUk5JTkc7XG4gIC8qKiBgY3JpdGljYWxgIHdoZW4gYSBnYXRlZCBmaW5kaW5nIGlzIG9uIENJU0EgS0VWLCBlbHNlIGBlcnJvcmAgKGEgZmxhZyBuZXZlciByZWZ1c2VzIGFueXRoaW5nKS4gKi9cbiAgc2V2ZXJpdHk6ICdlcnJvcicgfCAnY3JpdGljYWwnO1xuICBwbHVnaW46IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICAvKiogVGhlIGZsYWcncyBnYXRlZCBjb3VudCAoc2VlIHtAbGluayBQbHVnaW5TY2FuRmxhZy5nYXRlZH0pLiAqL1xuICBnYXRlZDogbnVtYmVyO1xuICBoaWdoOiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIFRvcCBmaXhhYmxlIGZpbmRpbmdzIHdpdGggdGhlaXIgZml4ZWQgdmVyc2lvbnMuICovXG4gIGZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xufVxuXG4vKiogQnVpbGQgdGhlIGBWVUxOX0ZMQUdHRURgIHdhcm5pbmcgZm9yIGBwbHVnaW5AdmVyc2lvbmAuICovXG5leHBvcnQgZnVuY3Rpb24gdnVsbkZsYWdnZWRXYXJuaW5nKHBsdWdpbjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIGZsYWc6IFBsdWdpblNjYW5GbGFnKTogVnVsbkZsYWdnZWRXYXJuaW5nIHtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiBWVUxOX0ZMQUdHRURfV0FSTklORyxcbiAgICBzZXZlcml0eTogZmxhZy5rZXYgPyAnY3JpdGljYWwnIDogJ2Vycm9yJyxcbiAgICBwbHVnaW4sXG4gICAgdmVyc2lvbixcbiAgICBnYXRlZDogZmxhZy5nYXRlZCxcbiAgICBoaWdoOiBmbGFnLmhpZ2gsXG4gICAgbWVzc2FnZTogdnVsbkZsYWdnZWRNZXNzYWdlKGAke3BsdWdpbn1AJHt2ZXJzaW9ufWAsIGZsYWcpLFxuICAgIGZpbmRpbmdzOiBmbGFnLmZpbmRpbmdzLnNsaWNlKDAsIFNDQU5fRkxBR19UT1BfRklORElOR1MpLFxuICB9O1xufVxuXG4vKiogTmFycm93IGFuIHVua25vd24gYHNjYW5fZmxhZ2AganNvbmIgdmFsdWUuICovXG5leHBvcnQgZnVuY3Rpb24gYXNTY2FuRmxhZyh2YWx1ZTogdW5rbm93bik6IFBsdWdpblNjYW5GbGFnIHwgbnVsbCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHYgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKHR5cGVvZiB2LmdhdGVkICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5oaWdoICE9PSAnbnVtYmVyJykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGZpbmRpbmdzID0gQXJyYXkuaXNBcnJheSh2LmZpbmRpbmdzKSA/ICh2LmZpbmRpbmdzIGFzIFBsdWdpblNjYW5GaW5kaW5nW10pLmZpbHRlcigoZikgPT4gZiAmJiB0eXBlb2YgZi5pZCA9PT0gJ3N0cmluZycpIDogW107XG4gIHJldHVybiB7XG4gICAgZ2F0ZWQ6IHYuZ2F0ZWQsXG4gICAgaGlnaDogdi5oaWdoLFxuICAgIG1heEZpbmRpbmdzOiB0eXBlb2Ygdi5tYXhGaW5kaW5ncyA9PT0gJ251bWJlcicgPyB2Lm1heEZpbmRpbmdzIDogMCxcbiAgICAuLi4odHlwZW9mIHYua2V2ID09PSAnbnVtYmVyJyAmJiB2LmtldiA+IDAgPyB7IGtldjogdi5rZXYgfSA6IHt9KSxcbiAgICAuLi4odi5mYWlsT24gPT09ICdoaWdoJyA/IHsgZmFpbE9uOiAnaGlnaCcgYXMgY29uc3QgfSA6IHt9KSxcbiAgICBmaW5kaW5nczogZmluZGluZ3MubWFwKChmKSA9PiAoeyAuLi5mLCBmaXhlZEluOiBBcnJheS5pc0FycmF5KGYuZml4ZWRJbikgPyBmLmZpeGVkSW4gOiBbXSB9KSksXG4gIH07XG59XG4iXX0=
|
|
379
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXNjYW4uanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wbHVnaW4tc2Nhbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBeUgxRCxtRkFBbUY7QUFDbkYsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBRTdDLDZDQUE2QztBQUM3QyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7QUFFN0M7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsQ0FBbUU7SUFDaEcsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7QUFDeEQsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLE1BQXlGLEVBQ3pGLEtBQW1DO0lBRW5DLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDdkYsTUFBTSxRQUFRLEdBQUc7UUFDZixRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLGNBQWMs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QyxDQUFDLENBQUUsQ0FBQyxDQUFDLFFBQWdDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbkksT0FBTztRQUNMLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztRQUNkLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtRQUNaLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxXQUFXLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0QsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDOUYsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBQbHVnaW4gaW1hZ2Ugc2NhbiBnYXRlcyAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCBcIlNjYW4gZ2F0ZXNcIik6IHRoZSBzaGFyZWRcbiAqIHZvY2FidWxhcnkgb2YgdGhlIGJ1aWxkLXRpbWUgZ2F0ZSwgdGhlIG5pZ2h0bHkgcmVzY2FuJ3MgZmxhZywgYW5kIHRoZVxuICogcmVzb2x1dGlvbiB3YXJuaW5nIC8gYmxvY2sg4oCUIHVzZWQgYnkgdGhlIHBsdWdpbiBzZXJ2aWNlICh3aGljaCBzdG9yZXMgYW5kXG4gKiBlbmZvcmNlcyB0aGVtKSwgdGhlIHJlc29sdmVyIGluIHBpcGVsaW5lLWRhdGEgKHdoaWNoIHNraXBzIG9yIHdhcm5zKSwgYW5kIHRoZVxuICogZGFzaGJvYXJkICh3aGljaCBzaG93cyB0aGVtKS5cbiAqXG4gKiBBIGZpbmRpbmcgaXMgRklYQUJMRSB3aGVuIGdyeXBlIHJlcG9ydHMgYSBmaXhlZCB2ZXJzaW9uIGZvciBpdFxuICogKGB2dWxuZXJhYmlsaXR5LmZpeC5zdGF0ZSA9PSBcImZpeGVkXCJgIHdpdGggYXQgbGVhc3Qgb25lIHZlcnNpb24pOiB0aGUgZ2F0ZXNcbiAqIGNvdW50IGZpeGFibGUgQ3JpdGljYWwgZmluZGluZ3MsIGJlY2F1c2UgYW4gdW5maXhhYmxlIG9uZSBjYW4ndCBiZSBhY3RlZCBvblxuICogYnkgcmVidWlsZGluZyBvciB1cGdyYWRpbmcg4oCUIHdpdGggT05FIGV4Y2VwdGlvbi4gQSBDcml0aWNhbCB0aGF0IENJU0EgbGlzdHNcbiAqIGFzIEtOT1dOIEVYUExPSVRFRCAoS0VWKSBpcyBnYXRlZCBldmVuIHdpdGggbm8gZml4IChgUExVR0lOX1ZVTE5fR0FURV9LRVZgKTpcbiAqIFwibm90aGluZyB0byB1cGdyYWRlIHRvXCIgaXMgYSByZWFzb24gdG8gbm90IHNoaXAgdGhlIGltYWdlLCBub3QgYSByZWFzb24gdG9cbiAqIHNoaXAgaXQsIHdoZW4gdGhlIHZ1bG5lcmFiaWxpdHkgaXMgYmVpbmcgZXhwbG9pdGVkIGluIHRoZSB3aWxkLlxuICovXG5cbmltcG9ydCB7IFNZU1RFTV9PUkdfSUQgfSBmcm9tICcuLi9taWRkbGV3YXJlL3N5c3RlbS1vcmcuanMnO1xuaW1wb3J0IHsgZW52Qm9vbCwgZW52SW50LCBlbnZTdHIgfSBmcm9tICcuLi91dGlscy9lbnYuanMnO1xuXG4vKiogT25lIENyaXRpY2FsL0hpZ2ggZmluZGluZyBhcyB0aGUgZmxhZyBhbmQgdGhlIGdhdGUgbWVzc2FnZXMgY2FycnkgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNjYW5GaW5kaW5nIHtcbiAgLyoqIFRoZSB2dWxuZXJhYmlsaXR5IGlkIChDVkUt4oCmLCBHSFNBLeKApikuICovXG4gIGlkOiBzdHJpbmc7XG4gIHNldmVyaXR5OiAnY3JpdGljYWwnIHwgJ2hpZ2gnO1xuICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICBwYWNrYWdlVmVyc2lvbjogc3RyaW5nO1xuICAvKiogVmVyc2lvbnMgdGhhdCBmaXggaXQ7IGVtcHR5ID0gbm8gZml4IGF2YWlsYWJsZSAobm90IGZpeGFibGUpLiAqL1xuICBmaXhlZEluOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIENJU0EgbGlzdHMgaXQgYXMgS05PV04gRVhQTE9JVEVEIChncnlwZSdzIGBrbm93bkV4cGxvaXRlZGApLiBBYnNlbnQgPVxuICAgKiBub3QgbGlzdGVkLiBBIEtFViBDcml0aWNhbCBpcyBnYXRlZCBldmVuIHdoZW4gdW5maXhhYmxlLCBhbmQgb25seSBhblxuICAgKiBBRFZJU09SWS1JRCB3YWl2ZXIgY2FuIGV4ZW1wdCBpdCDigJQgc2VlIHtAbGluayBhcHBseVZ1bG5XYWl2ZXJzfS5cbiAgICovXG4gIGtldj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFUFNTIHByb2JhYmlsaXR5ICgw4oCTMSkgdGhhdCBpdCBpcyBleHBsb2l0ZWQgaW4gdGhlIG5leHQgMzAgZGF5cywgYXMgZ3J5cGVcbiAgICogcmVwb3J0cyBpdDsgYWJzZW50IHdoZW4gdGhlIERCIGNhcnJpZXMgbm8gc2NvcmUuIENvbnRleHQgZm9yIGEgcmVhZGVyXG4gICAqIHJhbmtpbmcgZmluZGluZ3MsIG5ldmVyIGEgZ2F0ZSBpbnB1dCDigJQgYSBwcm9iYWJpbGl0eSBpcyBub3QgYSB2ZXJkaWN0LlxuICAgKi9cbiAgZXBzcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBgc2Nhbl9mbGFnYCBvbiBhIHZlcnNpb24gdGhlIG5pZ2h0bHkgcmVzY2FuIGZsYWdnZWQ6IGl0cyBHQVRFRCBDcml0aWNhbFxuICogY291bnQgYW5kIGZpeGFibGUgSGlnaCBjb3VudCBhdCB0aGF0IHJlc2NhbiwgYW5kIHRoZSB0b3AgZ2F0ZWQgZmluZGluZ3MuIFNldFxuICogd2hpbGUgZ2F0ZWQgZmluZGluZ3MgZXhjZWVkIGBQTFVHSU5fVlVMTl9NQVhfRklORElOR1NgLCBjbGVhcmVkIHdoZW4gYVxuICogcmVzY2FuIGZpbmRzIHRoZW0gcmVzb2x2ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2NhbkZsYWcge1xuICAvKipcbiAgICogR2F0ZWQgZmluZGluZ3Mg4oCUIGF0IG9yIGFib3ZlIGBmYWlsT25gIChkZWZhdWx0IENyaXRpY2FsKTogZml4YWJsZSBvbmVzLFxuICAgKiBwbHVzIHVuZml4YWJsZSBLRVYtbGlzdGVkIG9uZXMgdW5kZXIgYFBMVUdJTl9WVUxOX0dBVEVfS0VWYC5cbiAgICovXG4gIGdhdGVkOiBudW1iZXI7XG4gIC8qKiBPZiBgZ2F0ZWRgLCB0aGUgS0VWLWxpc3RlZCBvbmVzIChDSVNBIGtub3duIGV4cGxvaXRlZCkuIEFic2VudCA9IG5vbmUuICovXG4gIGtldj86IG51bWJlcjtcbiAgLyoqIEZpeGFibGUgSGlnaCBmaW5kaW5ncy4gKi9cbiAgaGlnaDogbnVtYmVyO1xuICAvKiogVGhlIGZsb29yIGl0IHdhcyBjb21wYXJlZCBhZ2FpbnN0IChgUExVR0lOX1ZVTE5fTUFYX0ZJTkRJTkdTYCkuICovXG4gIG1heEZpbmRpbmdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYFBMVUdJTl9WVUxOX0ZBSUxfT05gIGl0IHdhcyBnYXRlZCBhdCwgd2hlbiB0aGF0IHdhcyBgaGlnaGAgKHRoZW5cbiAgICogYGdhdGVkYCBjb3VudHMgQ3JpdGljYWwgQU5EIEhpZ2ggZmluZGluZ3MpLiBBYnNlbnQgPSBgY3JpdGljYWxgLlxuICAgKiBDYXJyaWVkIG9uIHRoZSBmbGFnIGJlY2F1c2UgdGhlIHNlcnZpY2VzIHRoYXQgUkVOREVSIGl0ICh0aGUgcmVzb2x2ZXIsXG4gICAqIHRoZSBkYXNoYm9hcmQpIGRvIG5vdCBzaGFyZSB0aGUgcGx1Z2luIHNlcnZpY2UncyBlbnZpcm9ubWVudC5cbiAgICovXG4gIGZhaWxPbj86ICdoaWdoJztcbiAgLyoqIEF0IG1vc3Qge0BsaW5rIFNDQU5fRkxBR19UT1BfRklORElOR1N9IGZpeGFibGUgZmluZGluZ3MsIENyaXRpY2FscyBmaXJzdC4gKi9cbiAgZmluZGluZ3M6IFBsdWdpblNjYW5GaW5kaW5nW107XG59XG5cbi8qKlxuICogYHNjYW5fc3VtbWFyeWAgb24gZXZlcnkgc2Nhbm5lZCB2ZXJzaW9uOiB0aGUgTEFURVNUIHNjYW4ncyBmaW5kaW5ncyDigJQgd3JpdHRlblxuICogYnkgdGhlIGJ1aWxkIHRoYXQgZXN0YWJsaXNoZWQgdGhlIHZlcnNpb24gYW5kIHJld3JpdHRlbiBieSBldmVyeSByZXNjYW4g4oCUXG4gKiB3aGV0aGVyIG9yIG5vdCB0aGUgZ2F0ZSB0cmlwcGVkLlxuICpcbiAqIERpc3RpbmN0IGZyb20ge0BsaW5rIFBsdWdpblNjYW5GbGFnfSwgd2hpY2ggZXhpc3RzIG9ubHkgd2hpbGUgYSB2ZXJzaW9uIGlzIG92ZXJcbiAqIHRoZSBmbG9vci4gQSB2ZXJzaW9uIGNhcnJ5aW5nIG5vdGhpbmcgYnV0IEhpZ2ggZmluZGluZ3MgaXMgbmV2ZXIgZmxhZ2dlZCDigJQgc28gYVxuICogcmVwb3J0IHdob3NlIGpvYiBpcyB0byBzaG93IENyaXRpY2FsIEFORCBIaWdoIGV4cG9zdXJlIGhhZCBubyBzb3VyY2UgdG8gcmVhZC5cbiAqIFdoYXQgYSByZXBvcnQgU0hPV1MgYW5kIHdoYXQgYSBidWlsZCBSRUZVU0VTIGFyZSBkaWZmZXJlbnQgcXVlc3Rpb25zLCBhbmRcbiAqIGNvbmZsYXRpbmcgdGhlbSBtZWFudCB0aGUgYW5zd2VyIHRvIHRoZSBmaXJzdCB3YXMgXCJub3RoaW5nXCIuXG4gKlxuICogSXQgaXMgYWxzbyB0aGUgcmVzY2FuJ3MgQkFTRUxJTkUuIFwiSXMgYW55dGhpbmcgbmV3P1wiIGlzIGFuc3dlcmVkIGJ5IGRpZmZpbmdcbiAqIGZpbmRpbmcgaWRlbnRpdGllcyBhZ2FpbnN0IHRoZSBwcmV2aW91cyBzdW1tYXJ5ICh7QGxpbmsgbmV3U2NhbkZpbmRpbmdzfSksXG4gKiBub3QgYnkgY29tcGFyaW5nIGNvdW50czogb25lIENWRSBmaXhlZCBhbmQgYSBkaWZmZXJlbnQgb25lIHB1Ymxpc2hlZCBsZWF2ZXNcbiAqIHRoZSBjb3VudCB1bmNoYW5nZWQgYW5kIGhpZGVzIGEgYnJhbmQtbmV3IENyaXRpY2FsLlxuICpcbiAqIENPTlRSQUNUIOKAlCByZWFkIGJ5IHRoZSByZXBvcnRpbmcgLyBleHBvc3VyZSBjb2RlIGluIHBpcGVsaW5lLWRhdGEuIEZpZWxkcyBhcmVcbiAqIG9ubHkgZXZlciBhZGRlZDsgZXZlcnkgZmllbGQgYmVsb3cgaXMgcHJlc2VudCBvbiBldmVyeSBzdW1tYXJ5IHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2NhblN1bW1hcnkge1xuICAvKiogRml4YWJsZSBDcml0aWNhbCBmaW5kaW5ncy4gKi9cbiAgY3JpdGljYWxGaXhhYmxlOiBudW1iZXI7XG4gIC8qKiBGaXhhYmxlIEhpZ2ggZmluZGluZ3MuICovXG4gIGhpZ2hGaXhhYmxlOiBudW1iZXI7XG4gIC8qKiBUb3RhbHMgaW5jbHVkaW5nIHVuZml4YWJsZSBmaW5kaW5ncy4gKi9cbiAgY3JpdGljYWw6IG51bWJlcjtcbiAgaGlnaDogbnVtYmVyO1xuICBtZWRpdW06IG51bWJlcjtcbiAgbG93OiBudW1iZXI7XG4gIC8qKiBLRVYtbGlzdGVkIChDSVNBIGtub3duIGV4cGxvaXRlZCkgQ3JpdGljYWwgKyBIaWdoIGZpbmRpbmdzLiAqL1xuICBrZXY6IG51bWJlcjtcbiAgLyoqXG4gICAqIEVWRVJZIENyaXRpY2FsIGFuZCBIaWdoIGZpbmRpbmcg4oCUIGZpeGFibGUgQU5EIHVuZml4YWJsZSDigJQgQ3JpdGljYWxzIGZpcnN0LFxuICAgKiBjYXBwZWQgYXQge0BsaW5rIFNDQU5fU1VNTUFSWV9NQVhfRklORElOR1N9LiBgdHJ1bmNhdGVkYCBzYXlzIHdoZXRoZXIgdGhlXG4gICAqIGNhcCBjdXQgaXQ7IHRoZSBjb3VudHMgYWJvdmUgYXJlIG5ldmVyIGNhcHBlZC5cbiAgICovXG4gIGZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xuICB0cnVuY2F0ZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBLZXlzICh7QGxpbmsgc2NhbkZpbmRpbmdLZXl9KSBvZiB0aGUgZmluZGluZ3MgYSBgUExVR0lOX1ZVTE5fV0FJVkVSU2AgZW50cnlcbiAgICogZXhlbXB0ZWQgZnJvbSB0aGUgZmxvb3IgYXQgdGhpcyBzY2FuLiBUaGV5IGFyZSBzdGlsbCBpbiBgZmluZGluZ3NgIOKAlCBhXG4gICAqIHdhaXZlciBjaGFuZ2VzIHRoZSB2ZXJkaWN0LCBub3Qgd2hhdCB0aGUgaW1hZ2UgY29udGFpbnMuXG4gICAqL1xuICB3YWl2ZWQ6IHN0cmluZ1tdO1xuICAvKiogV2hlbiB0aGlzIHNjYW4gcmFuIChJU08pLiAqL1xuICBzY2FubmVkQXQ6IHN0cmluZztcbiAgLyoqIFdoaWNoIHBhdGggd3JvdGUgaXQuICovXG4gIHRyaWdnZXI6ICdidWlsZCcgfCAncmVzY2FuJyB8ICdwcm9tb3RlJztcbiAgLyoqIFRoZSBpbWFnZSB0aGlzIGRlc2NyaWJlcy4gQSB2ZXJzaW9uIHJlYnVpbHQgb24gYSBwYXRjaGVkIGJhc2UgaXMgYVxuICAgKiAgZGlmZmVyZW50IGFydGlmYWN0LCBzbyBhIHN1bW1hcnkgd2l0aG91dCBpdHMgZGlnZXN0IGNhbm5vdCBiZSB0cnVzdGVkLiAqL1xuICBpbWFnZURpZ2VzdDogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGUgdnVsbmVyYWJpbGl0eSBEQiB0aGUgc2NhbiBtYXRjaGVkIGFnYWluc3Qgd2FzIEJVSUxUIChJU08pLCBvciBudWxsXG4gICAqIHdoZW4gaXQgY291bGQgbm90IGJlIHJlYWQuIEEgc2NhbiBpcyBvbmx5IGFzIGN1cnJlbnQgYXMgaXRzIERCOiBhIGNsZWFuXG4gICAqIHJlc3VsdCBmcm9tIGEgd2Vlay1vbGQgREIgc2F5cyBub3RoaW5nIGFib3V0IHRoaXMgd2VlaydzIENWRXMuXG4gICAqL1xuICBkYkJ1aWx0QXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKlxuICAgKiBFeGVjdXRhYmxlcyBpbiB0aGUgaW1hZ2UgdGhhdCBOTyBTQk9NIHBhY2thZ2UgYWNjb3VudHMgZm9yIOKAlCBVUFgtcGFja2VkIG9yXG4gICAqIHN0cmlwcGVkIEdvLCBIYXNrZWxsLCBHcmFhbFZNIG5hdGl2ZSBpbWFnZXMsIE5vZGUgU0VBIGJ1bmRsZXMsIHZlbmRvcmVkXG4gICAqIGJyb3dzZXJzLiBUaGUgc2Nhbm5lciBjYW5ub3Qgc2VlIGluc2lkZSB0aGVtLCBzbyB0aGVpciBDVkVzIGFyZSBpbnZpc2libGUgdG9cbiAgICogZXZlcnkgY291bnQgYWJvdmUuIFBhdGhzLCBzb3J0ZWQsIGNhcHBlZCBhdCB7QGxpbmsgU0NBTl9TVU1NQVJZX01BWF9CSU5BUklFU30uXG4gICAqIEluZm9ybWF0aW9uYWw6IG5ldmVyIGEgZ2F0ZS5cbiAgICovXG4gIHVuY2F0YWxvZ3VlZEJpbmFyaWVzOiBzdHJpbmdbXTtcbn1cblxuLyoqIEZpbmRpbmdzIGEgc3VtbWFyeSBpdGVtaXplcy4gQ291bnRzIGFyZSBuZXZlciBjYXBwZWQ7IHRoaXMgYm91bmRzIHRoZSBqc29uYi4gKi9cbmV4cG9ydCBjb25zdCBTQ0FOX1NVTU1BUllfTUFYX0ZJTkRJTkdTID0gNTAwO1xuXG4vKiogVW5jYXRhbG9ndWVkIGJpbmFyaWVzIGEgc3VtbWFyeSBsaXN0cy4gKi9cbmV4cG9ydCBjb25zdCBTQ0FOX1NVTU1BUllfTUFYX0JJTkFSSUVTID0gMjAwO1xuXG4vKipcbiAqIEEgZmluZGluZydzIGlkZW50aXR5OiB0aGUgYWR2aXNvcnkgaW4gYSBzcGVjaWZpYyBwYWNrYWdlIHZlcnNpb24uIFRoZSBzYW1lXG4gKiBDVkUgaW4gdHdvIHBhY2thZ2VzIGlzIHR3byBmaW5kaW5nczsgdGhlIHNhbWUgQ1ZFIHJlcG9ydGVkIGFnYWluIGFmdGVyIGFcbiAqIHJlc2NhbiBpcyB0aGUgc2FtZSBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2FuRmluZGluZ0tleShmOiBQaWNrPFBsdWdpblNjYW5GaW5kaW5nLCAnaWQnIHwgJ3BhY2thZ2VOYW1lJyB8ICdwYWNrYWdlVmVyc2lvbic+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2YuaWR9fCR7Zi5wYWNrYWdlTmFtZX18JHtmLnBhY2thZ2VWZXJzaW9ufWA7XG59XG5cbi8qKlxuICogVGhlIENyaXRpY2FsL0hpZ2ggZmluZGluZ3MgaW4gYGFmdGVyYCB0aGF0IHRoZSBwcmV2aW91cyBzdW1tYXJ5IGRpZCBub3RcbiAqIGNhcnJ5IOKAlCB3aGF0IE4zMSBhbmQgYW4gYWR2aXNvcnkgZHJhZnQgYXJlIGFib3V0LlxuICpcbiAqIE5vIHByZXZpb3VzIHN1bW1hcnkgbWVhbnMgbm8gYmFzZWxpbmU6IGV2ZXJ5IGZpbmRpbmcgaXMgbmV3LiBBIFRSVU5DQVRFRFxuICogYmFzZWxpbmUga25vd3Mgb25seSBpdHMgZmlyc3Qge0BsaW5rIFNDQU5fU1VNTUFSWV9NQVhfRklORElOR1N9IGZpbmRpbmdzXG4gKiAoQ3JpdGljYWxzIGZpcnN0KSwgc28gYSBmaW5kaW5nIG1pc3NpbmcgZnJvbSBpdCBpcyBuZXcgb25seSBpZiB0aGUgYmFzZWxpbmVcbiAqIHByb3ZhYmx5IGxpc3RlZCBldmVyeSBmaW5kaW5nIG9mIHRoYXQgc2V2ZXJpdHkg4oCUIG90aGVyd2lzZSBpdCBtYXkgc2ltcGx5IGhhdmVcbiAqIGJlZW4gY3V0LCBhbmQgcmVwb3J0aW5nIGl0IGFzIG5ldyB3b3VsZCBiZSBhIGZhbHNlIGFsYXJtIG9uIGV2ZXJ5IHBhc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXdTY2FuRmluZGluZ3MoXG4gIGJlZm9yZTogUGljazxQbHVnaW5TY2FuU3VtbWFyeSwgJ2ZpbmRpbmdzJyB8ICd0cnVuY2F0ZWQnIHwgJ2NyaXRpY2FsJz4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBhZnRlcjogcmVhZG9ubHkgUGx1Z2luU2NhbkZpbmRpbmdbXSxcbik6IFBsdWdpblNjYW5GaW5kaW5nW10ge1xuICBpZiAoIWJlZm9yZSkgcmV0dXJuIFsuLi5hZnRlcl07XG4gIGNvbnN0IGtub3duID0gbmV3IFNldChiZWZvcmUuZmluZGluZ3MubWFwKHNjYW5GaW5kaW5nS2V5KSk7XG4gIGNvbnN0IGxpc3RlZENyaXRpY2FsID0gYmVmb3JlLmZpbmRpbmdzLmZpbHRlcigoZikgPT4gZi5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykubGVuZ3RoO1xuICBjb25zdCBjb21wbGV0ZSA9IHtcbiAgICBjcml0aWNhbDogIWJlZm9yZS50cnVuY2F0ZWQgfHwgbGlzdGVkQ3JpdGljYWwgPj0gYmVmb3JlLmNyaXRpY2FsLFxuICAgIGhpZ2g6ICFiZWZvcmUudHJ1bmNhdGVkLFxuICB9O1xuICByZXR1cm4gYWZ0ZXIuZmlsdGVyKChmKSA9PiBjb21wbGV0ZVtmLnNldmVyaXR5XSAmJiAha25vd24uaGFzKHNjYW5GaW5kaW5nS2V5KGYpKSk7XG59XG5cbi8qKiBGaW5kaW5ncyBhIGZsYWcgLyBnYXRlIG1lc3NhZ2UgY2Fycmllcy4gKi9cbmV4cG9ydCBjb25zdCBTQ0FOX0ZMQUdfVE9QX0ZJTkRJTkdTID0gMTA7XG5cbi8qKiBMb29rdXAgLyByZXNvbHV0aW9uIHdhcm5pbmcgY29kZSBmb3IgYSBmbGFnZ2VkIHZlcnNpb24uICovXG5leHBvcnQgY29uc3QgVlVMTl9GTEFHR0VEX1dBUk5JTkcgPSAnVlVMTl9GTEFHR0VEJztcblxuLyoqXG4gKiBgUExVR0lOX1ZVTE5fTUFYX0ZJTkRJTkdTYDogdGhlIHBsYXRmb3JtIGZsb29yIOKAlCBhIHZlcnNpb24gd2l0aCBNT1JFIGdhdGVkXG4gKiBmaW5kaW5ncyAoZml4YWJsZSwgb3IgS0VWLWxpc3RlZCwgYXQgb3IgYWJvdmUgYFBMVUdJTl9WVUxOX0ZBSUxfT05gKSB0aGFuXG4gKiB0aGlzIGZhaWxzIGl0cyBidWlsZCAoYFBMVUdJTl9WVUxOX0dBVEVgKSBhbmQgaXNcbiAqIGZsYWdnZWQgYnkgdGhlIHJlc2Nhbi4gRGVmYXVsdCBgMGA7IGAtMWAgZGlzYWJsZXMgdGhlIGZsb29yIChhbmQgdGhlIGZsYWcpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luVnVsbk1heEZpbmRpbmdzKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZJbnQoJ1BMVUdJTl9WVUxOX01BWF9GSU5ESU5HUycsIDAsIHsgbWluOiAtMSB9KTtcbn1cblxuLyoqXG4gKiBUaGUgbG93ZXN0IHNldmVyaXR5IHRoZSBmbG9vciBnYXRlcyBvbiDigJQgdGhlIHBsdWdpbiBzZXJ2aWNlJ3MgYC0tZmFpbC1vbmAuXG4gKiBPbmx5IGBjcml0aWNhbGAgYW5kIGBoaWdoYCBhcmUgcG9zc2libGU6IHRob3NlIGFyZSB0aGUgc2V2ZXJpdGllcyBhIHNjYW5cbiAqIGl0ZW1pemVzIChNZWRpdW0vTG93IGFyZSBjb3VudGVkLCBuZXZlciBsaXN0ZWQpLCBhbmQgYSBmbG9vciBjYW4gb25seSBnYXRlIG9uXG4gKiBmaW5kaW5ncyBpdCBjYW4gbmFtZSwgd2FpdmUgYW5kIHJlcG9ydC5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luVnVsbkZhaWxPbiA9ICdjcml0aWNhbCcgfCAnaGlnaCc7XG5cbi8qKlxuICogYFBMVUdJTl9WVUxOX0ZBSUxfT05gIChkZWZhdWx0IGBjcml0aWNhbGApOiB0aGUgc2V2ZXJpdHkgYXQgYW5kIGFib3ZlIHdoaWNoIGFcbiAqIGZpeGFibGUgKG9yIEtFVi1saXN0ZWQpIGZpbmRpbmcgY291bnRzIGFnYWluc3QgYFBMVUdJTl9WVUxOX01BWF9GSU5ESU5HU2AuXG4gKiBgaGlnaGAgZ2F0ZXMgQ3JpdGljYWwgQU5EIEhpZ2guIEFueSBvdGhlciB2YWx1ZSByZXNvbHZlcyB0byBgaGlnaGAsIHRoZVxuICogU1RSSUNURVIgc2V0dGluZzogdGhlIGZhaWx1cmUgbW9kZSBvZiBhIHR5cG8gbXVzdCBiZSBcInRoZSBnYXRlIGJsb2NrcyBtb3JlXCIsXG4gKiBuZXZlciBcInRoZSBnYXRlIGJsb2NrcyBsZXNzXCIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVnaW5WdWxuRmFpbE9uKCk6IFBsdWdpblZ1bG5GYWlsT24ge1xuICByZXR1cm4gZW52U3RyKCdQTFVHSU5fVlVMTl9GQUlMX09OJywgJ2NyaXRpY2FsJykudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICdjcml0aWNhbCcgPyAnY3JpdGljYWwnIDogJ2hpZ2gnO1xufVxuXG4vKiogV2hldGhlciBhIHNldmVyaXR5IGlzIGF0IG9yIGFib3ZlIHRoZSBnYXRpbmcgdGhyZXNob2xkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0T3JBYm92ZUZhaWxPbihzZXZlcml0eTogUGx1Z2luU2NhbkZpbmRpbmdbJ3NldmVyaXR5J10sIGZhaWxPbjogUGx1Z2luVnVsbkZhaWxPbiA9IHBsdWdpblZ1bG5GYWlsT24oKSk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcgfHwgZmFpbE9uID09PSAnaGlnaCc7XG59XG5cbi8qKlxuICogVGhlIHNjYW5uZXIncyBmaXhhYmxlIGNvdW50IGF0IG9yIGFib3ZlIHRoZSB0aHJlc2hvbGQg4oCUIHdoYXQgdGhlIGZsb29yIHJlYWRzXG4gKiB3aGVuIGEgc2NhbiByZWNvcmRlZCBjb3VudHMgYnV0IG5vIGZpbmRpbmdzIHRvIGRlcml2ZSBpdCBmcm9tLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F0ZWRGaXhhYmxlQ291bnQoXG4gIGNvdW50czogeyB2dWxuQ3JpdGljYWxGaXhhYmxlOiBudW1iZXIgfCBudWxsOyB2dWxuSGlnaEZpeGFibGU6IG51bWJlciB8IG51bGwgfSxcbiAgZmFpbE9uOiBQbHVnaW5WdWxuRmFpbE9uID0gcGx1Z2luVnVsbkZhaWxPbigpLFxuKTogbnVtYmVyIHtcbiAgcmV0dXJuIChjb3VudHMudnVsbkNyaXRpY2FsRml4YWJsZSA/PyAwKSArIChmYWlsT24gPT09ICdoaWdoJyA/IGNvdW50cy52dWxuSGlnaEZpeGFibGUgPz8gMCA6IDApO1xufVxuXG4vKipcbiAqIFRoZSB0d28gcXVlc3Rpb25zIGEgY2FsbGVyIGNhbiBhc2sgYWJvdXQgYSBzdG9yZWQgc3VtbWFyeSdzIGltYWdlIOKAlCBhbmQgdGhleVxuICogYXJlIERJRkZFUkVOVCBxdWVzdGlvbnMsIHdoaWNoIGlzIHRoZSB0aGluZyB3b3J0aCB3cml0aW5nIGRvd24uXG4gKlxuICogQSBzdW1tYXJ5IGNhcnJpZXMgdGhlIGRpZ2VzdCBvZiB0aGUgaW1hZ2UgaXQgZGVzY3JpYmVkLiBBIHZlcnNpb24gcmVidWlsdCBvblxuICogYSBwYXRjaGVkIGJhc2UgaXMgYSBkaWZmZXJlbnQgYXJ0aWZhY3QsIHNvIGEgc3VtbWFyeSBuYW1pbmcgYW5vdGhlciBkaWdlc3QgaXNcbiAqIGFib3V0IHNvbWV0aGluZyBlbHNlLiBCdXQgYSBzdW1tYXJ5IG1heSBhbHNvIGNhcnJ5IE5PIGRpZ2VzdCAoYW4gb2xkZXIgcm93KSxcbiAqIGFuZCB0aGF0IGlzIHdoZXJlIHRoZSB0d28gY2FsbGVycyBsZWdpdGltYXRlbHkgcGFydCBjb21wYW55OlxuICpcbiAqICAtIHtAbGluayBzdW1tYXJ5RGVzY3JpYmVzfSDigJQgXCJjYW4gdGhpcyBzdW1tYXJ5IGJlIFNIT1dOIHRvIGRlc2NyaWJlIHRoaXNcbiAqICAgIGltYWdlP1wiIFVua25vd24gY291bnRzIGFzIG5vLiBUaGUgcHVibGlzaCBnYXRlIGFza3MgdGhpcywgYmVjYXVzZSBpdHNcbiAqICAgIGZhaWx1cmUgaXMgbGlzdGluZyBzb21ldGhpbmcgdW52ZXR0ZWQ7IGZhbGxpbmcgYmFjayB0byB0aGUgcmF3IGNvbHVtbnNcbiAqICAgIG1lcmVseSBsZWF2ZXMgYSBwbHVnaW4gdW5saXN0ZWQuXG4gKiAgLSB7QGxpbmsgc3VtbWFyeUNvbnRyYWRpY3RzfSDigJQgXCJpcyB0aGlzIHN1bW1hcnkgS05PV04gdG8gYmUgYWJvdXQgYW5vdGhlclxuICogICAgaW1hZ2U/XCIgVW5rbm93biBjb3VudHMgYXMgbm8uIFRoZSByZXNvbHZlciBhbmQgdGhlIGRlbGV0ZS1zYWZldHkgZ3JhZGluZ1xuICogICAgYXNrIHRoaXMsIGJlY2F1c2UgdGhlaXIgZmFpbHVyZSBpcyB0aGUgb3Bwb3NpdGUgb25lOiBkaXNjYXJkaW5nIGFcbiAqICAgIGRpZ2VzdC1sZXNzIHN1bW1hcnkgdGhyb3dzIGF3YXkgdGhlIG9ubHkgZmluZGluZ3MgdGhleSBoYXZlIGFuZCBtYWtlcyBhXG4gKiAgICB3YXJuaW5nIHF1aWV0ZXIgb3IgYSByZWZ1c2FsIGxlc3MgaW5mb3JtYXRpdmUuXG4gKlxuICogVGhleSB1c2VkIHRvIGJlIHR3byBvcGVuLWNvZGVkIGV4cHJlc3Npb25zIHRoYXQgaGFwcGVuZWQgdG8gZGlmZmVyLCB3aXRoXG4gKiBub3RoaW5nIHNheWluZyB3aGV0aGVyIHRoYXQgd2FzIHJlYXNvbmluZyBvciBhY2NpZGVudC4gSXQgd2FzIHJlYXNvbmluZzsgdGhpc1xuICogaXMgdGhhdCByZWFzb25pbmcsIG5hbWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VtbWFyeURlc2NyaWJlcyhcbiAgc3VtbWFyeTogeyBpbWFnZURpZ2VzdD86IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGltYWdlRGlnZXN0OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHN0b3JlZCA9IHR5cGVvZiBzdW1tYXJ5Py5pbWFnZURpZ2VzdCA9PT0gJ3N0cmluZycgPyBzdW1tYXJ5LmltYWdlRGlnZXN0IDogbnVsbDtcbiAgcmV0dXJuIHN0b3JlZCAhPT0gbnVsbCAmJiAhIWltYWdlRGlnZXN0ICYmIHN0b3JlZCA9PT0gaW1hZ2VEaWdlc3Q7XG59XG5cbi8qKiBTZWUge0BsaW5rIHN1bW1hcnlEZXNjcmliZXN9IOKAlCB0aGUgcGVybWlzc2l2ZSB0d2luLCBmb3IgcmVhZGVycyB0aGF0IGxvc2VcbiAqICBpbmZvcm1hdGlvbiBieSBkaXNjYXJkaW5nIGEgZGlnZXN0LWxlc3Mgc3VtbWFyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdW1tYXJ5Q29udHJhZGljdHMoXG4gIHN1bW1hcnk6IHsgaW1hZ2VEaWdlc3Q/OiB1bmtub3duIH0gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBpbWFnZURpZ2VzdDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBzdG9yZWQgPSB0eXBlb2Ygc3VtbWFyeT8uaW1hZ2VEaWdlc3QgPT09ICdzdHJpbmcnID8gc3VtbWFyeS5pbWFnZURpZ2VzdCA6IG51bGw7XG4gIHJldHVybiBzdG9yZWQgIT09IG51bGwgJiYgISFpbWFnZURpZ2VzdCAmJiBzdG9yZWQgIT09IGltYWdlRGlnZXN0O1xufVxuXG4vKipcbiAqIFRoZSBnYXRlZCBjb3VudCBhIFNUT1JFRCBzY2FuIHN1bW1hcnkgaW1wbGllcywgd2l0aCB3YWl2ZXJzIHJlLWV2YWx1YXRlZCBub3cuXG4gKlxuICogV0hZIFRISVMgRVhJU1RTLiB7QGxpbmsgZ2F0ZWRGaXhhYmxlQ291bnR9IHJlYWRzIHRoZSBzY2FubmVyJ3MgZml4YWJsZVxuICogY29sdW1ucywgYW5kIHRob3NlIGNvbHVtbnMg4oCUIGFzIHRoZSBub3RlIG9uIGl0IHNheXMg4oCUIGtub3cgbm90aGluZyBhYm91dFxuICogd2FpdmVycyBvciBLRVYuIFRoZSBidWlsZCBmbG9vciBuZXZlciB0cnVzdGVkIHRoZW06IGl0IGRlcml2ZXMgaXRzIGNvdW50IGZyb21cbiAqIHRoZSBmaW5kaW5ncy4gVGhlIFBVQkxJU0ggZ2F0ZSBkaWQgdHJ1c3QgdGhlbSwgc28gdGhlIHR3byBoYWx2ZXMgb2YgdGhlIHN5c3RlbVxuICogZGlzYWdyZWVkIGFib3V0IHdoZXRoZXIgYSBwbHVnaW4gd2FzIHNoaXBwYWJsZS4gQSB3YWl2ZWQgQ3JpdGljYWwgc3RvcHBlZFxuICogYmxvY2tpbmcgdGhlIGJ1aWxkIGFuZCB3ZW50IG9uIGJsb2NraW5nIHRoZSBsaXN0aW5nLCBzaWxlbnRseSwgYW5kIGEgS0VWLWxpc3RlZFxuICogVU5GSVhBQkxFIENyaXRpY2FsIGRpZCB0aGUgcmV2ZXJzZSDigJQgYmxvY2tlZCB0aGUgYnVpbGQgYW5kIHdhcyBpbnZpc2libGUgdG8gdGhlXG4gKiBsaXN0aW5nLiBPbmUgZGVmaW5pdGlvbiwgY2FsbGVkIGZyb20gYm90aCwgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBrZWVwcyB0aGVtXG4gKiBmcm9tIGRyaWZ0aW5nIGFnYWluLlxuICpcbiAqIFdBSVZFUlMgQVJFIFJFLUVWQUxVQVRFRCwgTk9UIFJFUExBWUVELiBgc3VtbWFyeS53YWl2ZWRgIHJlY29yZHMgd2hhdCBhIHdhaXZlclxuICogZXhlbXB0ZWQgQVQgU0NBTiBUSU1FLCBhbmQgcmVwbGF5aW5nIHRob3NlIGtleXMgd291bGQgYmUgdGhlIGNoZWFwZXIgZml4IGFuZFxuICogdGhlIHdyb25nIG9uZTogYFBMVUdJTl9WVUxOX1dBSVZFUlNgIGVudHJpZXMgY2FycnkgYW4gaW5jbHVzaXZlIGV4cGlyeSwgc28gYVxuICogZnJvemVuIGtleSBsaXN0IHdvdWxkIGhvbm91ciBhbiBleGVtcHRpb24gZm9yZXZlciBhbmQgYW4gZXhwaXJ5IHRoYXQgc3RvcHBlZFxuICogYmxvY2tpbmcgYnVpbGRzIHdvdWxkIG5ldmVyIHN0YXJ0IGJsb2NraW5nIGxpc3RpbmdzIGFnYWluLiBSZS1ydW5uaW5nIHRoZVxuICogd2FpdmVycyBhZ2FpbnN0IHRoZSBzdG9yZWQgZmluZGluZ3MgaXMgd2hhdCBtYWtlcyB0aGUgZXhwaXJ5IG1lYW4gc29tZXRoaW5nIG9uXG4gKiBib3RoIHBhdGhzLlxuICpcbiAqIFJldHVybnMgYG51bGxgIHdoZW4gdGhlIHN1bW1hcnkgY2Fubm90IGJlIHRydXN0ZWQgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbiwgc29cbiAqIHRoZSBjYWxsZXIgZmFsbHMgYmFjayB0byB0aGUgcmF3IGNvbHVtbnMg4oCUIEZBSUwgQ0xPU0VELCBiZWNhdXNlIHRoZSBmYWlsdXJlXG4gKiB0aGlzIGd1YXJkcyBpcyBcImxpc3Qgc29tZXRoaW5nIHVudmV0dGVkXCIsIG5vdCBcImxlYXZlIHNvbWV0aGluZyB1bmxpc3RlZFwiOlxuICpcbiAqICAtIG5vIHN1bW1hcnkgYXQgYWxsIChhIHZlcnNpb24gc2Nhbm5lZCBiZWZvcmUgdGhlIGNvbHVtbiBleGlzdGVkKTtcbiAqICAtIGB0cnVuY2F0ZWRgOiBmaW5kaW5ncyB3ZXJlIGNhcHBlZCBhdCB7QGxpbmsgU0NBTl9TVU1NQVJZX01BWF9GSU5ESU5HU30sIHNvXG4gKiAgICB3aGF0IGlzIG1pc3NpbmcgY2Fubm90IGJlIGNvdW50ZWQgYW5kIGEgZGVyaXZlZCBmaWd1cmUgd291bGQgdW5kZXJjb3VudCBieVxuICogICAgYW4gdW5rbm93biBhbW91bnQ7XG4gKiAgLSBhIGRpZ2VzdCBtaXNtYXRjaDogdGhlIHN1bW1hcnkgZGVzY3JpYmVzIGEgRElGRkVSRU5UIGFydGlmYWN0LCBhbmQgYVxuICogICAgdmVyc2lvbiByZWJ1aWx0IG9uIGEgcGF0Y2hlZCBiYXNlIGlzIGEgZGlmZmVyZW50IGFydGlmYWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F0ZWRGaW5kaW5nQ291bnQoXG4gIHN1bW1hcnk6IFBsdWdpblNjYW5TdW1tYXJ5IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgc3ViamVjdDogeyBwbHVnaW5OYW1lOiBzdHJpbmc7IG9yZ0lkPzogc3RyaW5nOyBwbHVnaW5WZXJzaW9uPzogc3RyaW5nOyBpbWFnZURpZ2VzdD86IHN0cmluZyB8IG51bGwgfSxcbiAgZmFpbE9uOiBQbHVnaW5WdWxuRmFpbE9uID0gcGx1Z2luVnVsbkZhaWxPbigpLFxuICBub3c6IERhdGUgPSBuZXcgRGF0ZSgpLFxuKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICghc3VtbWFyeSB8fCBzdW1tYXJ5LnRydW5jYXRlZCkgcmV0dXJuIG51bGw7XG4gIGlmICghQXJyYXkuaXNBcnJheShzdW1tYXJ5LmZpbmRpbmdzKSkgcmV0dXJuIG51bGw7XG4gIGlmICghc3VtbWFyeURlc2NyaWJlcyhzdW1tYXJ5LCBzdWJqZWN0LmltYWdlRGlnZXN0KSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHsgY291bnRlZCB9ID0gYXBwbHlWdWxuV2FpdmVycyhcbiAgICBzdWJqZWN0LnBsdWdpbk5hbWUsXG4gICAgc3VtbWFyeS5maW5kaW5ncyxcbiAgICB1bmRlZmluZWQsXG4gICAgbm93LFxuICAgIHN1YmplY3Qub3JnSWQsXG4gICAgc3ViamVjdC5wbHVnaW5WZXJzaW9uLFxuICApO1xuICBjb25zdCBrZXZHYXRlID0gcGx1Z2luVnVsbkdhdGVLZXYoKTtcbiAgcmV0dXJuIGNvdW50ZWQuZmlsdGVyKChmKSA9PiBpc0dhdGVkRmluZGluZyhmLCBrZXZHYXRlLCBmYWlsT24pKS5sZW5ndGg7XG59XG5cbi8qKiBgQ3JpdGljYWxgIC8gYENyaXRpY2FsIG9yIEhpZ2hgIOKAlCB0aGUgZ2F0ZWQgc2V2ZXJpdGllcywgZm9yIG1lc3NhZ2VzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhaWxPbkxhYmVsKGZhaWxPbjogUGx1Z2luVnVsbkZhaWxPbiA9IHBsdWdpblZ1bG5GYWlsT24oKSk6IHN0cmluZyB7XG4gIHJldHVybiBmYWlsT24gPT09ICdjcml0aWNhbCcgPyAnQ3JpdGljYWwnIDogJ0NyaXRpY2FsIG9yIEhpZ2gnO1xufVxuXG4vKipcbiAqIGBQTFVHSU5fVlVMTl9HQVRFX0tFVmAgKGRlZmF1bHQgdHJ1ZSk6IGEgQ3JpdGljYWwgQ0lTQSBsaXN0cyBhcyBrbm93blxuICogZXhwbG9pdGVkIGNvdW50cyBhZ2FpbnN0IHRoZSBmbG9vciBldmVuIHdoZW4gaXQgaGFzIE5PIGZpeC4gT2ZmLCBLRVYgZmluZGluZ3NcbiAqIGFyZSBnYXRlZCBleGFjdGx5IGxpa2UgYW55IG90aGVyIENyaXRpY2FsIChmaXhhYmxlIG9ubHkpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luVnVsbkdhdGVLZXYoKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbnZCb29sKCdQTFVHSU5fVlVMTl9HQVRFX0tFVicsIHRydWUpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBmaW5kaW5nIGNvdW50cyBhZ2FpbnN0IHRoZSBmbG9vcjogYSBmaXhhYmxlIGZpbmRpbmcgYXQgb3IgYWJvdmVcbiAqIGBQTFVHSU5fVlVMTl9GQUlMX09OYCAoZGVmYXVsdCBDcml0aWNhbCksIG9yIOKAlCB1bmRlciBgUExVR0lOX1ZVTE5fR0FURV9LRVZgXG4gKiDigJQgYSBLRVYtbGlzdGVkIG9uZSBhdCBvciBhYm92ZSBpdCB3aXRoIG9yIHdpdGhvdXQgYSBmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dhdGVkRmluZGluZyhcbiAgZjogUGljazxQbHVnaW5TY2FuRmluZGluZywgJ3NldmVyaXR5JyB8ICdmaXhlZEluJyB8ICdrZXYnPixcbiAga2V2R2F0ZTogYm9vbGVhbiA9IHBsdWdpblZ1bG5HYXRlS2V2KCksXG4gIGZhaWxPbjogUGx1Z2luVnVsbkZhaWxPbiA9IHBsdWdpblZ1bG5GYWlsT24oKSxcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gYXRPckFib3ZlRmFpbE9uKGYuc2V2ZXJpdHksIGZhaWxPbikgJiYgKGYuZml4ZWRJbi5sZW5ndGggPiAwIHx8IChrZXZHYXRlICYmIGYua2V2ID09PSB0cnVlKSk7XG59XG5cbi8qKlxuICogQSBzY29wZWQsIEVYUElSSU5HIGV4ZW1wdGlvbiBmcm9tIHRoZSB2dWxuZXJhYmlsaXR5IGZsb29yIGZvciBvbmUgcGx1Z2luLlxuICpcbiAqIGBQTFVHSU5fVlVMTl9NQVhfRklORElOR1NgIGlzIHRoZSBvbmx5IG90aGVyIGxldmVyIGFuZCBpdCBpcyBmYXIgdG9vIGJsdW50OlxuICogcmFpc2luZyBpdCBhYm92ZSAwIGV4ZW1wdHMgZXZlcnkgcGx1Z2luIGZyb20gZXZlcnkgQ3JpdGljYWwuIFNvbWUgaW1hZ2VzXG4gKiBnZW51aW5lbHkgY2Fubm90IHJlYWNoIHplcm8g4oCUIGEgYnJvd3Nlci1idW5kbGluZyB0ZXN0IHJ1bm5lciAoYXJ0aWxsZXJ5IHNoaXBzXG4gKiBDaHJvbWl1bSB0aHJvdWdoIGl0cyBvd24gQHBsYXl3cmlnaHQvYnJvd3Nlci1jaHJvbWl1bSBkZXBlbmRlbmN5LCBwbGF5d3JpZ2h0XG4gKiBkb3dubG9hZHMgRmlyZWZveCkgaXMgYXQgdXBzdHJlYW0ncyBsYXRlc3QgYW5kIHN0aWxsIGNhcnJpZXMgZml4YWJsZSBmaW5kaW5ncyxcbiAqIGJlY2F1c2UgYnJvd3NlcnMgc2hpcCBDVkUgZml4ZXMgd2Vla2x5IHdoaWxlIHBpbm5lZCBidWlsZHMgbGFnIGJ5IGRlc2lnbi5cbiAqIFdpdGhvdXQgYSBuYXJyb3cgZXhlbXB0aW9uIHRoZSBvbmx5IG9wdGlvbnMgYXJlIFwiYmxvY2sgdGhlIHBsdWdpbiBmb3JldmVyXCIgb3JcbiAqIFwiZGlzYWJsZSB0aGUgZmxvb3IgZm9yIGV2ZXJ5dGhpbmdcIi5cbiAqXG4gKiBUaHJlZSBwcm9wZXJ0aWVzIG1ha2UgdGhpcyBhbiBleGVtcHRpb24gcmF0aGVyIHRoYW4gYSBob2xlLCBhbmQgYWxsIHRocmVlIGFyZVxuICogZW5mb3JjZWQgYmVsb3cgcmF0aGVyIHRoYW4gZG9jdW1lbnRlZCBhbmQgaG9wZWQgZm9yOlxuICpcbiAqICAgU0NPUEVEICAgIHRvIG9uZSBwbHVnaW4gKG9yLCBmbGVldC13aWRlLCB0byBuYW1lZCBhZHZpc29yaWVzIG9ubHkpLCB0b1xuICogICAgICAgICAgICAgbmFtZWQgcGFja2FnZXMvYWR2aXNvcmllcywgQU5EIHRvIHRoZSBzeXN0ZW0gb3JnLiBBIG5ldyBDcml0aWNhbFxuICogICAgICAgICAgICAgaW4gYW55dGhpbmcgbm90IG5hbWVkIHN0aWxsIGZhaWxzIHRoZSBnYXRlLCBzbyBhIHdhaXZlciBjYW5ub3RcbiAqICAgICAgICAgICAgIGdyb3cgc2lsZW50bHkgaW50byBcInRoaXMgcGx1Z2luIGlzIGV4ZW1wdFwiLiBUaGUgb3JnIGJvdW5kXG4gKiAgICAgICAgICAgICBtYXR0ZXJzIGJlY2F1c2UgcGx1Z2luIG5hbWVzIGFyZSB1bmlxdWUgcGVyIChuYW1lLCB2ZXJzaW9uLFxuICogICAgICAgICAgICAgb3JnSWQpIGFuZCBOT1QgZ2xvYmFsbHk6IHdpdGhvdXQgaXQsIGFueSB0ZW5hbnQgY291bGQgaW5oZXJpdCBhblxuICogICAgICAgICAgICAgZXhlbXB0aW9uIGJ5IG5hbWluZyB0aGVpciBwbHVnaW4gYGFydGlsbGVyeWAuXG4gKiAgIEVYUElSSU5HICBldmVyeSBlbnRyeSBjYXJyaWVzIGEgZGF0ZSBhbmQgc3RvcHMgYXBwbHlpbmcgYWZ0ZXIgaXQuIEEgd2FpdmVyXG4gKiAgICAgICAgICAgICBub2JvZHkgcmV2aXNpdHMgYmVjb21lcyBwZXJtYW5lbnQ7IHRoaXMgb25lIGxhcHNlcyBvbiBpdHMgb3duIGFuZFxuICogICAgICAgICAgICAgdGhlIHBsdWdpbiBzdGFydHMgZmFpbGluZyBhZ2Fpbiwgd2hpY2ggaXMgdGhlIGludGVuZGVkIHByb21wdC5cbiAqICAgVklTSUJMRSAgIHdoYXQgd2FzIHdhaXZlZCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLCBzbyBpdCByZWFjaGVzIHRoZVxuICogICAgICAgICAgICAgbWV0cmljLCB0aGUgYXVkaXQgcmVjb3JkIGFuZCB0aGUgYnVpbGQgbWVzc2FnZSBpbnN0ZWFkIG9mXG4gKiAgICAgICAgICAgICB2YW5pc2hpbmcgZnJvbSB0aGUgY291bnQuXG4gKlxuICogRm9ybWF0IOKAlCBlbnRyaWVzIGA7YC1zZXBhcmF0ZWQsIGZpZWxkcyBgOmAtc2VwYXJhdGVkLCB0YXJnZXRzIGAsYC1zZXBhcmF0ZWQuXG4gKiBBIHRhcmdldCBpcyBhIHBhY2thZ2UgbmFtZSAoYGNocm9taXVtYCkgb3IgYW4gYWR2aXNvcnkgaWQgKGBHTy0yMDI2LTY2MTJgKSxcbiAqIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmluZGluZydzIHBhY2thZ2Ugb3IgaWQgcmVzcGVjdGl2ZWx5OlxuICpcbiAqICAgUExVR0lOX1ZVTE5fV0FJVkVSUz1hcnRpbGxlcnk6MjAyNi0xMi0zMTpjaHJvbWl1bSxjaHJvbWU7cGxheXdyaWdodDoyMDI2LTEyLTMxOmZpcmVmb3hcbiAqXG4gKiBGTEVFVC1XSURFIChgKmAgYXMgdGhlIHBsdWdpbikgaXMgZm9yIG9uZSBhZHZpc29yeSB0aGF0IGV2ZXJ5IGJ1bmRsZXIgb2YgYVxuICogdG9vbGNoYWluIGluaGVyaXRzIOKAlCBhIEdvIHN0ZGxpYiBDVkUgcmVhY2hlcyBldmVyeSBwcmVidWlsdCBHbyBiaW5hcnkgYXQgb25jZSxcbiAqIGFuZCBsaXN0aW5nIGVhY2ggcGx1Z2luIGhpZGVzIHRoYXQgaXQgaXMgb25lIGRlY2lzaW9uLiBJdCBtYXkgbmFtZSBBRFZJU09SWVxuICogSURTIE9OTFk6IGAqOjIwMjYtMTItMzE6c3RkbGliYCB3b3VsZCB3YWl2ZSBldmVyeSBwcmVzZW50IGFuZCBmdXR1cmUgc3RkbGliXG4gKiBDcml0aWNhbCBpbiBldmVyeSBwbHVnaW4sIGluY2x1ZGluZyBvbmVzIGEgcmVidWlsZCBjb3VsZCBjbGVhciwgc28gYSBwYWNrYWdlXG4gKiBuYW1lIHVuZGVyIGAqYCBpcyByZWplY3RlZC4gYCpgIHRha2VzIG5vIGBAdmVyc2lvbmAgKHZlcnNpb25zIGFyZSBwZXIgcGx1Z2luKVxuICogYW5kIGtlZXBzIHRoZSBzeXN0ZW0tb3JnIGJvdW5kIGFuZCB0aGUgZXhwaXJ5OlxuICpcbiAqICAgUExVR0lOX1ZVTE5fV0FJVkVSUz0qOjIwMjYtMTItMzE6R08tMjAyNi02NjEyLEdPLTIwMjYtNjYwNFxuICpcbiAqIEEgbWFsZm9ybWVkIGVudHJ5IGlzIERST1BQRUQsIG5ldmVyIHRyZWF0ZWQgYXMgYSB3aWxkY2FyZDogdGhlIGZhaWx1cmUgbW9kZVxuICogb2YgYSB0eXBvIG11c3QgYmUgXCJ0aGUgZ2F0ZSBzdGlsbCBibG9ja3NcIiwgbm90IFwiZXZlcnl0aGluZyBpcyB3YWl2ZWRcIi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuV2FpdmVyIHtcbiAgLyoqIFBsdWdpbiBuYW1lIHRoZSB3YWl2ZXIgYXBwbGllcyB0byAoZXhhY3QgbWF0Y2gpLCBvciB7QGxpbmsgV0FJVkVfQUxMX1BMVUdJTlN9LiAqL1xuICBwbHVnaW46IHN0cmluZztcbiAgLyoqXG4gICAqIFBsdWdpbiB2ZXJzaW9uIHRoZSB3YWl2ZXIgaXMgbGltaXRlZCB0bywgb3IgbnVsbCBmb3IgZXZlcnkgdmVyc2lvbi5cbiAgICpcbiAgICogQSB3YWl2ZXIgaXMgYSBqdWRnZW1lbnQgYWJvdXQgYSBTUEVDSUZJQyBpbWFnZSDigJQgXCJ0aGlzIHJlbGVhc2Ugb2YgYXJ0aWxsZXJ5XG4gICAqIGJ1bmRsZXMgYSBDaHJvbWl1bSB3ZSBjYW5ub3QgcGF0Y2hcIi4gTGVmdCB1bnBpbm5lZCBpdCBzaWxlbnRseSBjYXJyaWVzIHRvXG4gICAqIGV2ZXJ5IGZ1dHVyZSB2ZXJzaW9uLCBpbmNsdWRpbmcgb25lcyB3aG9zZSBmaW5kaW5ncyBub2JvZHkgaGFzIGxvb2tlZCBhdCxcbiAgICogd2hpY2ggaXMgaG93IGEgbmFycm93IGV4ZW1wdGlvbiBiZWNvbWVzIGEgc3RhbmRpbmcgb25lLlxuICAgKi9cbiAgdmVyc2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEluY2x1c2l2ZSBleHBpcnkgKFVUQyBkYXRlKS4gQWZ0ZXIgaXQgdGhlIGVudHJ5IGhhcyBubyBlZmZlY3QuICovXG4gIGV4cGlyZXM6IERhdGU7XG4gIC8qKlxuICAgKiBQYWNrYWdlIG5hbWVzIGFuZC9vciBhZHZpc29yeSBpZHMgd2hvc2UgZmluZGluZ3MgYXJlIGV4ZW1wdC4gTmV2ZXIgZW1wdHkg4oCUXG4gICAqIHNlZSBwYXJzZVZ1bG5XYWl2ZXJzLiBBZHZpc29yeSBpZHMgb25seSB3aGVuIGBwbHVnaW5gIGlzIGAqYC5cbiAgICovXG4gIHBhY2thZ2VzOiBzdHJpbmdbXTtcbn1cblxuLyoqIFRoZSBgcGx1Z2luYCBvZiBhIGZsZWV0LXdpZGUgd2FpdmVyLiBBZHZpc29yeSBpZHMgb25seSDigJQgc2VlIFZ1bG5XYWl2ZXIuICovXG5leHBvcnQgY29uc3QgV0FJVkVfQUxMX1BMVUdJTlMgPSAnKic7XG5cbi8qKlxuICogQW4gYWR2aXNvcnkgaWQgYXMgc2Nhbm5lcnMgcmVwb3J0IGl0IChDVkUsIEdIU0EsIEdvIHZ1bG5kYiwgUHlQQSwgUnVzdFNlYykuXG4gKiBBbnl0aGluZyBlbHNlIGlzIGEgcGFja2FnZSBuYW1lLCB3aGljaCBhIGZsZWV0LXdpZGUgd2FpdmVyIG1heSBub3QgdXNlLlxuICovXG5jb25zdCBBRFZJU09SWV9JRCA9IC9eKENWRS1cXGR7NH0tXFxkezQsfXxHSFNBKC1bMC05YS16XXs0fSl7M318R08tXFxkezR9LVxcZHs0LH18UFlTRUMtXFxkezR9LVxcZCt8UlVTVFNFQy1cXGR7NH0tXFxkezQsfSkkL2k7XG5cbi8qKiBBIGRyb3BwZWQgZW50cnkgYW5kIHdoeSwgc28gdGhlIG9wZXJhdG9yIGNhbiBiZSB0b2xkIGluc3RlYWQgb2YgZ3Vlc3NpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIFZ1bG5XYWl2ZXJQcm9ibGVtIHtcbiAgZW50cnk6IHN0cmluZztcbiAgcmVhc29uOiBzdHJpbmc7XG59XG5cbi8qKiBQYXJzZWQgd2FpdmVycyBwbHVzIHRoZSBlbnRyaWVzIHRoYXQgd2VyZSByZWplY3RlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnVsbldhaXZlclBhcnNlIHtcbiAgd2FpdmVyczogVnVsbldhaXZlcltdO1xuICBwcm9ibGVtczogVnVsbldhaXZlclByb2JsZW1bXTtcbn1cblxuLyoqXG4gKiBQYXJzZSBgUExVR0lOX1ZVTE5fV0FJVkVSU2AsIFJFUE9SVElORyB3aGF0IHdhcyBkcm9wcGVkLlxuICpcbiAqIERyb3BwaW5nIGEgbWFsZm9ybWVkIGVudHJ5IGlzIHRoZSBzYWZlIGRpcmVjdGlvbiDigJQgYSB0eXBvIG11c3Qgbm90IGJlY29tZSBhXG4gKiB3aWxkY2FyZCDigJQgYnV0IHNpbGVudGx5IGRyb3BwaW5nIGl0IGlzIGEgdXNhYmlsaXR5IHRyYXA6IHRoZSBvcGVyYXRvciBzZXRzIGFcbiAqIHdhaXZlciwgdGhlIGdhdGUga2VlcHMgYmxvY2tpbmcsIGFuZCBub3RoaW5nIGFueXdoZXJlIHNheXMgd2h5LiBDYWxsZXJzIHRoYXRcbiAqIGNhbiBzdXJmYWNlIGl0IChzZXJ2aWNlIGJvb3QpIHVzZSB0aGlzOyBgcGFyc2VWdWxuV2FpdmVyc2AgaXMgdGhlIHNob3J0aGFuZFxuICogZm9yIHRoZSBvbmVzIHRoYXQgY2Fubm90LlxuICpcbiAqIEVudHJ5IGdyYW1tYXI6IGA8cGx1Z2luPltAPHZlcnNpb24+XTo8WVlZWS1NTS1ERD46PHBrZz5bLDxwa2c+4oCmXWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVnVsbldhaXZlcnNWZXJib3NlKHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvY2Vzcy5lbnYuUExVR0lOX1ZVTE5fV0FJVkVSUyk6IFZ1bG5XYWl2ZXJQYXJzZSB7XG4gIGNvbnN0IHdhaXZlcnM6IFZ1bG5XYWl2ZXJbXSA9IFtdO1xuICBjb25zdCBwcm9ibGVtczogVnVsbldhaXZlclByb2JsZW1bXSA9IFtdO1xuICBpZiAoIXJhdz8udHJpbSgpKSByZXR1cm4geyB3YWl2ZXJzLCBwcm9ibGVtcyB9O1xuICBjb25zdCByZWplY3QgPSAoZW50cnk6IHN0cmluZywgcmVhc29uOiBzdHJpbmcpID0+IHsgcHJvYmxlbXMucHVzaCh7IGVudHJ5OiBlbnRyeS50cmltKCksIHJlYXNvbiB9KTsgfTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJhdy5zcGxpdCgnOycpKSB7XG4gICAgaWYgKCFlbnRyeS50cmltKCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IFt0YXJnZXQsIGV4cGlyZXMsIHBhY2thZ2VzXSA9IGVudHJ5LnNwbGl0KCc6JykubWFwKChmKSA9PiBmPy50cmltKCkgPz8gJycpO1xuICAgIC8vIEV2ZXJ5IGZpZWxkIGlzIFJFUVVJUkVELiBBbiBlbnRyeSBtaXNzaW5nIGl0cyBwYWNrYWdlIGxpc3Qgd291bGRcbiAgICAvLyBvdGhlcndpc2UgcmVhZCBhcyBcIndhaXZlIHRoaXMgcGx1Z2luIGVudGlyZWx5XCIsIHdoaWNoIGlzIHRoZSBvbmUgdGhpbmdcbiAgICAvLyB0aGlzIG11c3Qgbm90IGJlIGFibGUgdG8gZXhwcmVzcy5cbiAgICBpZiAoIXRhcmdldCB8fCAhZXhwaXJlcyB8fCAhcGFja2FnZXMpIHtcbiAgICAgIHJlamVjdChlbnRyeSwgJ2V4cGVjdGVkIDxwbHVnaW4+W0A8dmVyc2lvbj5dOjxZWVlZLU1NLUREPjo8cGFja2FnZT5bLDxwYWNrYWdlPuKApl0nKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhdCA9IHRhcmdldC5pbmRleE9mKCdAJyk7XG4gICAgY29uc3QgcGx1Z2luID0gYXQgPT09IC0xID8gdGFyZ2V0IDogdGFyZ2V0LnNsaWNlKDAsIGF0KS50cmltKCk7XG4gICAgY29uc3QgdmVyc2lvbiA9IGF0ID09PSAtMSA/IG51bGwgOiB0YXJnZXQuc2xpY2UoYXQgKyAxKS50cmltKCk7XG4gICAgaWYgKCFwbHVnaW4pIHsgcmVqZWN0KGVudHJ5LCAnbm8gcGx1Z2luIG5hbWUnKTsgY29udGludWU7IH1cbiAgICBpZiAoYXQgIT09IC0xICYmICF2ZXJzaW9uKSB7IHJlamVjdChlbnRyeSwgXCInQCcgd2l0aCBubyB2ZXJzaW9uIOKAlCBvbWl0IGl0IHRvIGNvdmVyIGV2ZXJ5IHZlcnNpb25cIik7IGNvbnRpbnVlOyB9XG4gICAgaWYgKHBsdWdpbiA9PT0gV0FJVkVfQUxMX1BMVUdJTlMgJiYgdmVyc2lvbiAhPT0gbnVsbCkgeyByZWplY3QoZW50cnksIFwiJyonIGNvdmVycyBldmVyeSBwbHVnaW4sIHNvIGl0IGNhbm5vdCBwaW4gYSB2ZXJzaW9uXCIpOyBjb250aW51ZTsgfVxuICAgIGlmICghL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QoZXhwaXJlcykpIHsgcmVqZWN0KGVudHJ5LCBgZXhwaXJ5ICcke2V4cGlyZXN9JyBpcyBub3QgWVlZWS1NTS1ERGApOyBjb250aW51ZTsgfVxuICAgIGNvbnN0IHdoZW4gPSBuZXcgRGF0ZShgJHtleHBpcmVzfVQyMzo1OTo1OS45OTlaYCk7XG4gICAgaWYgKE51bWJlci5pc05hTih3aGVuLmdldFRpbWUoKSkpIHsgcmVqZWN0KGVudHJ5LCBgZXhwaXJ5ICcke2V4cGlyZXN9JyBpcyBub3QgYSByZWFsIGRhdGVgKTsgY29udGludWU7IH1cbiAgICBjb25zdCBuYW1lcyA9IHBhY2thZ2VzLnNwbGl0KCcsJykubWFwKChuKSA9PiBuLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDApIHsgcmVqZWN0KGVudHJ5LCAnbm8gcGFja2FnZSBuYW1lcycpOyBjb250aW51ZTsgfVxuICAgIGlmIChwbHVnaW4gPT09IFdBSVZFX0FMTF9QTFVHSU5TKSB7XG4gICAgICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuYW1lcy5maWx0ZXIoKG4pID0+ICFBRFZJU09SWV9JRC50ZXN0KG4pKTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZWplY3QoZW50cnksIGAnKicgdGFrZXMgYWR2aXNvcnkgaWRzIG9ubHkgKENWRS3igKYsIEdIU0Et4oCmLCBHTy3igKYpOyAnJHtwYWNrYWdlTmFtZXMuam9pbignLCAnKX0nIHdvdWxkIHdhaXZlIGEgcGFja2FnZSBpbiBldmVyeSBwbHVnaW5gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIHdhaXZlcnMucHVzaCh7IHBsdWdpbiwgdmVyc2lvbiwgZXhwaXJlczogd2hlbiwgcGFja2FnZXM6IG5hbWVzIH0pO1xuICB9XG4gIHJldHVybiB7IHdhaXZlcnMsIHByb2JsZW1zIH07XG59XG5cbi8qKiBQYXJzZSBgUExVR0lOX1ZVTE5fV0FJVkVSU2AuIE1hbGZvcm1lZCBvciBpbmNvbXBsZXRlIGVudHJpZXMgYXJlIGRyb3BwZWQuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWdWxuV2FpdmVycyhyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb2Nlc3MuZW52LlBMVUdJTl9WVUxOX1dBSVZFUlMpOiBWdWxuV2FpdmVyW10ge1xuICByZXR1cm4gcGFyc2VWdWxuV2FpdmVyc1ZlcmJvc2UocmF3KS53YWl2ZXJzO1xufVxuXG4vKiogV2hhdCBhIHdhaXZlciByZW1vdmVkIGZyb20gdGhlIGNvdW50LCBhbmQgd2hhdCBzdGlsbCBjb3VudHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhaXZlck91dGNvbWUge1xuICAvKiogRmluZGluZ3MgdGhlIGZsb29yIHN0aWxsIGNvdW50cy4gKi9cbiAgY291bnRlZDogUGx1Z2luU2NhbkZpbmRpbmdbXTtcbiAgLyoqIEZpbmRpbmdzIGFuIHVuZXhwaXJlZCB3YWl2ZXIgZXhlbXB0ZWQgKGVtcHR5IHdoZW4gbm9uZSBhcHBsaWVkKS4gKi9cbiAgd2FpdmVkOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xuICAvKiogVGhlIGVudHJpZXMgdGhhdCBleGVtcHRlZCBhdCBsZWFzdCBvbmUgZmluZGluZyDigJQgd2hhdCBcInRoaXMgd2FpdmVyIGlzIHN0aWxsIGRvaW5nIHNvbWV0aGluZ1wiIGlzIG1lYXN1cmVkIGJ5LiAqL1xuICBtYXRjaGVkOiBWdWxuV2FpdmVyW107XG59XG5cbi8qKiBPbmUgd2FpdmVyIGVudHJ5J3MgaWRlbnRpdHk6IHRoZSBwbHVnaW4gaXQgbmFtZXMgKHdpdGggaXRzIHBpbikgYW5kIGl0cyB0YXJnZXRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZ1bG5XYWl2ZXJMYWJlbHModzogUGljazxWdWxuV2FpdmVyLCAncGx1Z2luJyB8ICd2ZXJzaW9uJyB8ICdwYWNrYWdlcyc+KTogeyBwbHVnaW46IHN0cmluZzsgdGFyZ2V0czogc3RyaW5nIH0ge1xuICByZXR1cm4geyBwbHVnaW46IHcudmVyc2lvbiA/IGAke3cucGx1Z2lufUAke3cudmVyc2lvbn1gIDogdy5wbHVnaW4sIHRhcmdldHM6IHcucGFja2FnZXMuam9pbignLCcpIH07XG59XG5cbi8qKlxuICogU3BsaXQgZmluZGluZ3MgaW50byB3aGF0IHN0aWxsIGNvdW50cyBhbmQgd2hhdCBhbiB1bmV4cGlyZWQgd2FpdmVyIGV4ZW1wdHMuXG4gKlxuICogTWF0Y2hpbmcgaXMgb24gdGhlIHBhY2thZ2UgbmFtZSBvciBhZHZpc29yeSBpZCBhIHdhaXZlciBuYW1lcyxcbiAqIGNhc2UtaW5zZW5zaXRpdmVseSwgYW5kIG9ubHkgZm9yIGZpbmRpbmdzIHRoYXQgYXJlIEdBVEVEXG4gKiAoe0BsaW5rIGlzR2F0ZWRGaW5kaW5nfSkg4oCUIGFuIHVuZ2F0ZWQgZmluZGluZyBuZXZlciBjb3VudGVkIHRvd2FyZCB0aGUgZmxvb3IsXG4gKiBzbyBcIndhaXZpbmdcIiBpdCB3b3VsZCBvdmVyc3RhdGUgd2hhdCB0aGUgd2FpdmVyIGRvZXMuXG4gKlxuICogQSBLRVYtbGlzdGVkIGZpbmRpbmcgaXMgZXhlbXB0ZWQgYnkgYW4gQURWSVNPUlktSUQgdGFyZ2V0IG9ubHksIG5ldmVyIGJ5IGFcbiAqIHBhY2thZ2UgbmFtZS4gYGFydGlsbGVyeTrigKY6Y2hyb21pdW1gIGlzIGEganVkZ2VtZW50IGFib3V0IENocm9taXVtJ3Mgb3JkaW5hcnlcbiAqIGNodXJuOyBpdCB3YXMgbm90IHdyaXR0ZW4gYWJvdXQsIGFuZCBtdXN0IG5vdCBzaWxlbnRseSBjb3ZlciwgdGhlIG9uZVxuICogQ2hyb21pdW0gQ1ZFIHRoYXQgaXMgYmVpbmcgZXhwbG9pdGVkIHRvZGF5LiBOYW1pbmcgdGhhdCBDVkUgaXMgdGhlIGRlbGliZXJhdGVcbiAqIGFjdCBhbiBleGVtcHRpb24gZm9yIGl0IHJlcXVpcmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlWdWxuV2FpdmVycyhcbiAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICBmaW5kaW5nczogcmVhZG9ubHkgUGx1Z2luU2NhbkZpbmRpbmdbXSxcbiAgd2FpdmVyczogcmVhZG9ubHkgVnVsbldhaXZlcltdID0gcGFyc2VWdWxuV2FpdmVycygpLFxuICBub3c6IERhdGUgPSBuZXcgRGF0ZSgpLFxuICBvcmdJZD86IHN0cmluZyxcbiAgcGx1Z2luVmVyc2lvbj86IHN0cmluZyxcbik6IFdhaXZlck91dGNvbWUge1xuICAvLyBTWVNURU0gT1JHIE9OTFkuIFBsdWdpbiBuYW1lcyBhcmUgdW5pcXVlIHBlciAobmFtZSwgdmVyc2lvbiwgb3JnSWQpLCBOT1RcbiAgLy8gZ2xvYmFsbHkg4oCUIGFueSB0ZW5hbnQgY2FuIGNyZWF0ZSBhIHBsdWdpbiBjYWxsZWQgYGFydGlsbGVyeWAuIE1hdGNoaW5nIG9uXG4gIC8vIHRoZSBuYW1lIGFsb25lIHdvdWxkIGhhbmQgZXZlcnkgb25lIG9mIHRoZW0gdGhlIG9wZXJhdG9yJ3MgZXhlbXB0aW9uLCBzbyBhXG4gIC8vIHRlbmFudCBjb3VsZCBpbmhlcml0IGEgd2FpdmVyIHNpbXBseSBieSBjaG9vc2luZyB0aGUgbmFtZSwgYW5kIHNoaXAgYW5cbiAgLy8gaW1hZ2Ugd2hvc2UgQ3JpdGljYWxzIHRoZSBnYXRlIHRoZW4gd2F2ZWQgdGhyb3VnaC4gVGhlIHdhaXZlcnMgZXhpc3QgZm9yIHRoZVxuICAvLyBPZmZpY2lhbCBjYXRhbG9nIHRoZSBvcGVyYXRvciBjdXJhdGVzLCB3aGljaCBsaXZlcyBpbiB0aGUgc3lzdGVtIG9yZzsgYVxuICAvLyBjYWxsZXIgdGhhdCBjYW5ub3Qgc2F5IHdoaWNoIG9yZyB0aGlzIGJ1aWxkIGJlbG9uZ3MgdG8gZ2V0cyBubyB3YWl2ZXIuXG4gIGlmIChvcmdJZCA9PT0gdW5kZWZpbmVkIHx8IG9yZ0lkLnRvTG93ZXJDYXNlKCkgIT09IFNZU1RFTV9PUkdfSUQpIHJldHVybiB7IGNvdW50ZWQ6IFsuLi5maW5kaW5nc10sIHdhaXZlZDogW10sIG1hdGNoZWQ6IFtdIH07XG4gIGNvbnN0IGFjdGl2ZSA9IHdhaXZlcnMuZmlsdGVyKCh3KSA9PiAody5wbHVnaW4gPT09IHBsdWdpbk5hbWUgfHwgdy5wbHVnaW4gPT09IFdBSVZFX0FMTF9QTFVHSU5TKVxuICAgICYmIHcuZXhwaXJlcy5nZXRUaW1lKCkgPj0gbm93LmdldFRpbWUoKVxuICAgIC8vIEEgdmVyc2lvbi1waW5uZWQgd2FpdmVyIGNvdmVycyB0aGF0IHZlcnNpb24gb25seS4gQW4gdW5waW5uZWQgb25lIGNvdmVyc1xuICAgIC8vIGV2ZXJ5IHZlcnNpb24sIHdoaWNoIGlzIHdoeSB0aGUgcGluIGlzIHdvcnRoIHdyaXRpbmcuXG4gICAgJiYgKHcudmVyc2lvbiA9PT0gbnVsbCB8fCB3LnZlcnNpb24gPT09IHBsdWdpblZlcnNpb24pKTtcbiAgaWYgKGFjdGl2ZS5sZW5ndGggPT09IDApIHJldHVybiB7IGNvdW50ZWQ6IFsuLi5maW5kaW5nc10sIHdhaXZlZDogW10sIG1hdGNoZWQ6IFtdIH07XG4gIGNvbnN0IGtldkdhdGUgPSBwbHVnaW5WdWxuR2F0ZUtldigpO1xuICBjb25zdCB0YXJnZXRzID0gYWN0aXZlLm1hcCgodykgPT4gKHsgdywgbmFtZXM6IG5ldyBTZXQody5wYWNrYWdlcy5tYXAoKG4pID0+IG4udG9Mb3dlckNhc2UoKSkpIH0pKTtcbiAgY29uc3QgY291bnRlZDogUGx1Z2luU2NhbkZpbmRpbmdbXSA9IFtdO1xuICBjb25zdCB3YWl2ZWQ6IFBsdWdpblNjYW5GaW5kaW5nW10gPSBbXTtcbiAgY29uc3QgbWF0Y2hlZCA9IG5ldyBTZXQ8VnVsbldhaXZlcj4oKTtcbiAgZm9yIChjb25zdCBmIG9mIGZpbmRpbmdzKSB7XG4gICAgY29uc3QgaWQgPSBmLmlkLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgcGtnID0gZi5wYWNrYWdlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGJ5ID0gaXNHYXRlZEZpbmRpbmcoZiwga2V2R2F0ZSlcbiAgICAgID8gdGFyZ2V0cy5maWx0ZXIoKHQpID0+IHQubmFtZXMuaGFzKGlkKSB8fCAoZi5rZXYgIT09IHRydWUgJiYgdC5uYW1lcy5oYXMocGtnKSkpXG4gICAgICA6IFtdO1xuICAgIGlmIChieS5sZW5ndGggPT09IDApIHsgY291bnRlZC5wdXNoKGYpOyBjb250aW51ZTsgfVxuICAgIHdhaXZlZC5wdXNoKGYpO1xuICAgIGZvciAoY29uc3QgdCBvZiBieSkgbWF0Y2hlZC5hZGQodC53KTtcbiAgfVxuICByZXR1cm4geyBjb3VudGVkLCB3YWl2ZWQsIG1hdGNoZWQ6IFsuLi5tYXRjaGVkXSB9O1xufVxuXG4vKiogV2hldGhlciBgZ2F0ZWRDcml0aWNhbGAgYnJlYWtzIHRoZSBwbGF0Zm9ybSBmbG9vciAobmV2ZXIsIHdoZW4gZGlzYWJsZWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4Y2VlZHNWdWxuRmxvb3IoZ2F0ZWQ6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIG1heDogbnVtYmVyID0gcGx1Z2luVnVsbk1heEZpbmRpbmdzKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIG1heCA+PSAwICYmIChnYXRlZCA/PyAwKSA+IG1heDtcbn1cblxuLyoqIGBwa2dAMS4yLjMg4oaSIDEuMi40YCAvIGBwa2dAMS4yLjMgKG5vIGZpeClgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlRml4KGY6IFBpY2s8UGx1Z2luU2NhbkZpbmRpbmcsICdwYWNrYWdlTmFtZScgfCAncGFja2FnZVZlcnNpb24nIHwgJ2ZpeGVkSW4nPik6IHN0cmluZyB7XG4gIGNvbnN0IGF0ID0gYCR7Zi5wYWNrYWdlTmFtZX0ke2YucGFja2FnZVZlcnNpb24gPyBgQCR7Zi5wYWNrYWdlVmVyc2lvbn1gIDogJyd9YDtcbiAgcmV0dXJuIGYuZml4ZWRJbi5sZW5ndGggPiAwID8gYCR7YXR9IOKGkiAke2YuZml4ZWRJbi5qb2luKCcsICcpfWAgOiBgJHthdH0gKG5vIGZpeClgO1xufVxuXG4vKiogYENWRS0xIChvcGVuc3NsQDMuMC4xIOKGkiAzLjAuMik7IENWRS0yICjigKYpYCBmb3IgdGhlIGZpcnN0IGBsaW1pdGAgZmluZGluZ3MuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVGaW5kaW5ncyhmaW5kaW5nczogcmVhZG9ubHkgUGx1Z2luU2NhbkZpbmRpbmdbXSwgbGltaXQgPSA1KTogc3RyaW5nIHtcbiAgY29uc3Qgc2hvd24gPSBmaW5kaW5ncy5zbGljZSgwLCBsaW1pdCkubWFwKChmKSA9PiBgJHtmLmlkfSAoJHtkZXNjcmliZUZpeChmKX0pYCkuam9pbignOyAnKTtcbiAgY29uc3QgbW9yZSA9IGZpbmRpbmdzLmxlbmd0aCA+IGxpbWl0ID8gYDsgKyR7ZmluZGluZ3MubGVuZ3RoIC0gbGltaXR9IG1vcmVgIDogJyc7XG4gIHJldHVybiBgJHtzaG93bn0ke21vcmV9YDtcbn1cblxuLyoqXG4gKiBgTiBmaXhhYmxlIENyaXRpY2FsIGZpbmRpbmdzYCwgb3Ig4oCUIHdoZW4gYW55IGdhdGVkIGZpbmRpbmcgaXMgS0VWLWxpc3RlZCwgc29cbiAqIFwiZml4YWJsZVwiIGFsb25lIHdvdWxkIG1pc2Rlc2NyaWJlIHRoZSBjb3VudCDigJQgYE4gQ3JpdGljYWwgZmluZGluZ3MgdGhhdCBhcmVcbiAqIGZpeGFibGUgb3Iga25vd24gZXhwbG9pdGVkIChNIG9uIENJU0EgS0VWKWAuXG4gKi9cbmZ1bmN0aW9uIGdhdGVkUGhyYXNlKGZsYWc6IFBpY2s8UGx1Z2luU2NhbkZsYWcsICdnYXRlZCcgfCAna2V2JyB8ICdmYWlsT24nPik6IHN0cmluZyB7XG4gIGNvbnN0IHMgPSBmbGFnLmdhdGVkID09PSAxID8gJycgOiAncyc7XG4gIGNvbnN0IGxhYmVsID0gZmFpbE9uTGFiZWwoZmxhZy5mYWlsT24gPz8gJ2NyaXRpY2FsJyk7XG4gIHJldHVybiBmbGFnLmtldlxuICAgID8gYCR7ZmxhZy5nYXRlZH0gJHtsYWJlbH0gZmluZGluZyR7c30gdGhhdCAke2ZsYWcuZ2F0ZWQgPT09IDEgPyAnaXMnIDogJ2FyZSd9IGZpeGFibGUgb3Iga25vd24gZXhwbG9pdGVkICgke2ZsYWcua2V2fSBvbiBDSVNBIEtFVilgXG4gICAgOiBgJHtmbGFnLmdhdGVkfSBmaXhhYmxlICR7bGFiZWx9IGZpbmRpbmcke3N9YDtcbn1cblxuLyoqIFRoZSB3YXJuaW5nIHRleHQgZm9yIGEgZmxhZ2dlZCB2ZXJzaW9uOiBgeEB2IGhhcyBOIGZpeGFibGUgQ3JpdGljYWwgZmluZGluZ3Mg4oCUIHJlYnVpbGQgb3IgdXBncmFkZWAuICovXG5leHBvcnQgZnVuY3Rpb24gdnVsbkZsYWdnZWRNZXNzYWdlKHJlZjogc3RyaW5nLCBmbGFnOiBQaWNrPFBsdWdpblNjYW5GbGFnLCAnZ2F0ZWQnIHwgJ2tldicgfCAnZmFpbE9uJz4pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cmVmfSBoYXMgJHtnYXRlZFBocmFzZShmbGFnKX0g4oCUIHJlYnVpbGQgb3IgdXBncmFkZWA7XG59XG5cbi8qKiBBIGBWVUxOX0ZMQUdHRURgIGxvb2t1cCB3YXJuaW5nICh0aGUgbG9va3VwIGVudmVsb3BlJ3MgYHdhcm5pbmdzW11gIGVudHJ5KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnVsbkZsYWdnZWRXYXJuaW5nIHtcbiAgY29kZTogdHlwZW9mIFZVTE5fRkxBR0dFRF9XQVJOSU5HO1xuICAvKiogYGNyaXRpY2FsYCB3aGVuIGEgZ2F0ZWQgZmluZGluZyBpcyBvbiBDSVNBIEtFViwgZWxzZSBgZXJyb3JgIChhIGZsYWcgbmV2ZXIgcmVmdXNlcyBhbnl0aGluZykuICovXG4gIHNldmVyaXR5OiAnZXJyb3InIHwgJ2NyaXRpY2FsJztcbiAgcGx1Z2luOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgLyoqIFRoZSBmbGFnJ3MgZ2F0ZWQgY291bnQgKHNlZSB7QGxpbmsgUGx1Z2luU2NhbkZsYWcuZ2F0ZWR9KS4gKi9cbiAgZ2F0ZWQ6IG51bWJlcjtcbiAgaGlnaDogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBUb3AgZml4YWJsZSBmaW5kaW5ncyB3aXRoIHRoZWlyIGZpeGVkIHZlcnNpb25zLiAqL1xuICBmaW5kaW5nczogUGx1Z2luU2NhbkZpbmRpbmdbXTtcbn1cblxuLyoqIEJ1aWxkIHRoZSBgVlVMTl9GTEFHR0VEYCB3YXJuaW5nIGZvciBgcGx1Z2luQHZlcnNpb25gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZ1bG5GbGFnZ2VkV2FybmluZyhwbHVnaW46IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCBmbGFnOiBQbHVnaW5TY2FuRmxhZyk6IFZ1bG5GbGFnZ2VkV2FybmluZyB7XG4gIHJldHVybiB7XG4gICAgY29kZTogVlVMTl9GTEFHR0VEX1dBUk5JTkcsXG4gICAgc2V2ZXJpdHk6IGZsYWcua2V2ID8gJ2NyaXRpY2FsJyA6ICdlcnJvcicsXG4gICAgcGx1Z2luLFxuICAgIHZlcnNpb24sXG4gICAgZ2F0ZWQ6IGZsYWcuZ2F0ZWQsXG4gICAgaGlnaDogZmxhZy5oaWdoLFxuICAgIG1lc3NhZ2U6IHZ1bG5GbGFnZ2VkTWVzc2FnZShgJHtwbHVnaW59QCR7dmVyc2lvbn1gLCBmbGFnKSxcbiAgICBmaW5kaW5nczogZmxhZy5maW5kaW5ncy5zbGljZSgwLCBTQ0FOX0ZMQUdfVE9QX0ZJTkRJTkdTKSxcbiAgfTtcbn1cblxuLyoqIE5hcnJvdyBhbiB1bmtub3duIGBzY2FuX2ZsYWdgIGpzb25iIHZhbHVlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzU2NhbkZsYWcodmFsdWU6IHVua25vd24pOiBQbHVnaW5TY2FuRmxhZyB8IG51bGwge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBudWxsO1xuICBjb25zdCB2ID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmICh0eXBlb2Ygdi5nYXRlZCAhPT0gJ251bWJlcicgfHwgdHlwZW9mIHYuaGlnaCAhPT0gJ251bWJlcicpIHJldHVybiBudWxsO1xuICBjb25zdCBmaW5kaW5ncyA9IEFycmF5LmlzQXJyYXkodi5maW5kaW5ncykgPyAodi5maW5kaW5ncyBhcyBQbHVnaW5TY2FuRmluZGluZ1tdKS5maWx0ZXIoKGYpID0+IGYgJiYgdHlwZW9mIGYuaWQgPT09ICdzdHJpbmcnKSA6IFtdO1xuICByZXR1cm4ge1xuICAgIGdhdGVkOiB2LmdhdGVkLFxuICAgIGhpZ2g6IHYuaGlnaCxcbiAgICBtYXhGaW5kaW5nczogdHlwZW9mIHYubWF4RmluZGluZ3MgPT09ICdudW1iZXInID8gdi5tYXhGaW5kaW5ncyA6IDAsXG4gICAgLi4uKHR5cGVvZiB2LmtldiA9PT0gJ251bWJlcicgJiYgdi5rZXYgPiAwID8geyBrZXY6IHYua2V2IH0gOiB7fSksXG4gICAgLi4uKHYuZmFpbE9uID09PSAnaGlnaCcgPyB7IGZhaWxPbjogJ2hpZ2gnIGFzIGNvbnN0IH0gOiB7fSksXG4gICAgZmluZGluZ3M6IGZpbmRpbmdzLm1hcCgoZikgPT4gKHsgLi4uZiwgZml4ZWRJbjogQXJyYXkuaXNBcnJheShmLmZpeGVkSW4pID8gZi5maXhlZEluIDogW10gfSkpLFxuICB9O1xufVxuIl19
|