@pipeline-builder/api-core 5.2.6 → 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 +1 -1
- 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
|
@@ -35,7 +35,20 @@ export const QUOTA_CATALOG = {
|
|
|
35
35
|
alertRules: { label: 'Alert rule', labelPlural: 'Alert rules', render: 'count', accrual: 'stock', observed: 'metered', description: 'Alert rules currently defined' },
|
|
36
36
|
alertDestinations: { label: 'Alert destination', labelPlural: 'Alert destinations', render: 'count', accrual: 'stock', observed: 'metered', description: 'Alert destinations currently defined' },
|
|
37
37
|
idpConfigs: { label: 'IdP configuration', labelPlural: 'IdP configurations', render: 'count', accrual: 'stock', observed: 'metered', description: 'Identity-provider configurations currently defined' },
|
|
38
|
-
|
|
38
|
+
// MEASURED, not metered — the label was wrong, not the behaviour. Nothing has
|
|
39
|
+
// ever incremented a `listings` counter: enforcement reads the live count from
|
|
40
|
+
// the plugin service's own rows (`listings.countActive`), which IS the system
|
|
41
|
+
// of record for what a publisher has listed. Declaring it `metered` meant the
|
|
42
|
+
// dashboard showed "0 of N" forever and the 80%/100% threshold notices could
|
|
43
|
+
// never fire, because `threshold-notifier` drops any notice whose source does
|
|
44
|
+
// not match `observed` and no increment was ever coming.
|
|
45
|
+
//
|
|
46
|
+
// Wiring an increment instead would have been the wrong repair: it creates a
|
|
47
|
+
// SECOND number for a fact the plugin service already owns exactly, and the
|
|
48
|
+
// two then drift on every yank, transfer, suspension and purge that does not
|
|
49
|
+
// remember to decrement. Same shape as `storageBytes`, which is measured for
|
|
50
|
+
// the same reason.
|
|
51
|
+
listings: { label: 'Plugin listing', labelPlural: 'Plugin listings', render: 'count', accrual: 'stock', observed: 'measured', description: 'Active plugin listings you publish' },
|
|
39
52
|
};
|
|
40
53
|
/**
|
|
41
54
|
* Consumables that are NOT quota types but render beside them — same label,
|
|
@@ -119,4 +132,4 @@ export function quotaDescription(type) {
|
|
|
119
132
|
export function quotaPackUnit(type) {
|
|
120
133
|
return byKey[type]?.packUnit ?? null;
|
|
121
134
|
}
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtY2F0YWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9xdW90YS1jYXRhbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUE4SnRDLE1BQU0sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFFckI7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBK0M7SUFDdkUsNEVBQTRFO0lBQzVFLDhFQUE4RTtJQUM5RSwrREFBK0Q7SUFDL0QsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxzQ0FBc0MsRUFBRTtJQUN0SyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsK0JBQStCLEVBQUU7SUFDeEssNkRBQTZEO0lBQzdELCtFQUErRTtJQUMvRSwyRUFBMkU7SUFDM0Usa0VBQWtFO0lBQ2xFLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUseURBQXlELEVBQUU7SUFDeEwsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsd0VBQXdF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QyxJQUFJLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pHLENBQUM7QUFTRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBWTtJQUMzQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLElBQUksU0FBUyxDQUFDO0FBQzVDLENBQUM7QUFRRCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQVk7SUFDdkMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLE1BQU0sQ0FBQztBQUN4QyxDQUFDO0FBS0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQVk7SUFDM0MsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBS0QsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFZO0lBQ3hDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBxdW90YS10eXBlIGRpc3BsYXkgY2F0YWxvZywgYXMgREFUQSBPTkxZIOKAlCB3aGF0IGEgcXVvdGEgaXMgQ0FMTEVEIGFuZCBob3dcbiAqIGl0cyBudW1iZXIgaXMgUkVOREVSRUQsIGZvciBldmVyeSBgUXVvdGFUeXBlYC5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgYW5kIGVudi1mcmVlIHNvIHRoZSBicm93c2VyIGltcG9ydHMgaXQgZGlyZWN0bHlcbiAqIChgQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUvcXVvdGEtY2F0YWxvZ2ApLiBJdHMgb25seSBpbXBvcnQgaXMgYSB0eXBlLCB3aGljaFxuICogaXMgZXJhc2VkIGF0IGNvbXBpbGUgdGltZSwgc28gbm90aGluZyBvZiB0aGUgc2VydmVyIGdyYXBoIHJlYWNoZXMgdGhlIGJ1bmRsZS5cbiAqXG4gKiBXSFkgSVQgRVhJU1RTLiBUaGUgc2FtZSBmYWN0cyB3ZXJlIHNwZWxsZWQgaW4gc2l4IHBsYWNlczogdGhpcyBwYWNrYWdlJ3NcbiAqIGBRVU9UQV9UWVBFX0xBQkVMU2AsIGFuZCBmaXZlIGluZGVwZW5kZW50IG1hcHMgaW4gdGhlIGZyb250ZW5kIOKAlCB0aGUgcHJlc3N1cmVcbiAqIGJhbm5lcidzIGxhYmVscywgdGhlIHF1b3RhcyBwYWdlJ3MgYFFVT1RBX01FVEFgLCB0aGUgb3JnIGhvbWUncyBgUVVPVEFfTEFCRUxTYCxcbiAqIHRoZSBiaWxsaW5nIHVzYWdlIGNhcmQncyBgUVVPVEFfTEFCRUxTYCAod2l0aCBpdHMgb3duIGJ5dGUgZmxhZyksIGFuZCB0aGVcbiAqIGFkZC1vbiBncmlkJ3MgYFBBQ0tfVU5JVFNgLiBFYWNoIGtuZXcgYSBzdWJzZXQsIGVhY2ggY291bGQgZHJpZnQsIGFuZCBhZGRpbmcgYVxuICogcXVvdGEgdHlwZSBtZWFudCBmaW5kaW5nIGFsbCBzaXguIGBQQUNLX1VOSVRTYCBoYWQgZXhhY3RseSBvbmUgbWVtYmVyLCBzbyB0aGVcbiAqIGFkZC1vbiBncmlkIHJlbmRlcmVkIGEgR0Igc3RlcCBmb3Igc3RvcmFnZSBhbmQgYSBiYXJlIHBhY2sgY291bnQgZm9yXG4gKiBldmVyeXRoaW5nIGVsc2Ug4oCUIG5vdCBhIGRlY2lzaW9uIGFueW9uZSByZXZpc2l0ZWQsIGp1c3QgdGhlIG9uZSBlbnRyeSBzb21lYm9keVxuICogbmVlZGVkIGF0IHRoZSB0aW1lLlxuICpcbiAqIEFkZCBhIHF1b3RhIHR5cGUgaGVyZSBhbmQgZXZlcnkgc3VyZmFjZSByZW5kZXJzIGl0OiBgUmVjb3JkPFF1b3RhVHlwZSwg4oCmPmBcbiAqIG1ha2VzIHRoZSBjb21waWxlciBkZW1hbmQgdGhlIGVudHJ5LCBzbyBub25lIG9mIHRoZSBzaXggY2FuIGJlIGZvcmdvdHRlblxuICogYWdhaW4uXG4gKlxuICogRVZFUlkgZGlzcGxheSBmYWN0IGxpdmVzIGhlcmUsIGluY2x1ZGluZyB0aGUgcGx1cmFsIGxhYmVsLiBBIGZpcnN0IGRyYWZ0IGtlcHRcbiAqIHBsdXJhbHMgaW4gYSBmcm9udGVuZCBoZWxwZXIgd2l0aCBhIGBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+YCBhbmQgYSBmYWxsYmFjayB0b1xuICogdGhlIHNpbmd1bGFyIOKAlCB3aGljaCB3b3VsZCBoYXZlIHJlbmRlcmVkIGEgbmV3IHF1b3RhIHR5cGUncyBwbHVyYWwgd3JvbmdseSBhbmRcbiAqIHNpbGVudGx5LCByZXByb2R1Y2luZyB0aGUgZXhhY3QgcGFydGlhbC1tYXAgdHJhcCB0aGlzIGZpbGUgcmVtb3Zlcy4gQSBmYWN0XG4gKiBzcGxpdCBhY3Jvc3MgdHdvIHBhY2thZ2VzIGlzIGEgZmFjdCB0aGF0IGRyaWZ0cy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFF1b3RhVHlwZSB9IGZyb20gJy4vY29tbW9uLmpzJztcblxuLyoqIEhvdyBhIHF1b3RhJ3MgdXNhZ2UgaXMgbGVhcm5lZDogaW5jcmVtZW50ZWQgYXMgaXQgaGFwcGVucywgb3IgcmVhZCBvbiBkZW1hbmQuICovXG5leHBvcnQgdHlwZSBRdW90YU9ic2VydmF0aW9uID1cbiAgLyoqIFRoZSBwbGF0Zm9ybSBpbmNyZW1lbnRzIGEgY291bnRlciBhcyB0aGUgd29yayBoYXBwZW5zLiAqL1xuICB8ICdtZXRlcmVkJ1xuICAvKiogTm90aGluZyBpbmNyZW1lbnRzOiB0aGUgZmlndXJlIGlzIHJlYWQgZnJvbSB0aGUgc3lzdGVtIG9mIHJlY29yZC4gKi9cbiAgfCAnbWVhc3VyZWQnO1xuXG4vKiogV2hldGhlciBhIHF1b3RhIHJlZmlsbHMgb24gdGhlIHBlcmlvZCBvciBwZXJzaXN0cyB1bnRpbCBzb21ldGhpbmcgY2hhbmdlcy4gKi9cbmV4cG9ydCB0eXBlIFF1b3RhQWNjcnVhbCA9XG4gIC8qKiBBIHBlci1wZXJpb2QgcmF0ZTogcmVzZXJ2ZWQgb24gdXNlLCB6ZXJvZWQgYXQgdGhlIHBlcmlvZCBib3VuZGFyeS4gKi9cbiAgfCAnZmxvdydcbiAgLyoqIEEgbGV2ZWwgdGhhdCBzdGF5cyB1bnRpbCB0aGUgdGVuYW50IGZyZWVzIGl0LiBObyByZXNldCwgbm8gZm9yZWNhc3QuICovXG4gIHwgJ3N0b2NrJztcblxuLyoqIEhvdyBhIHJhdyBxdW90YSBudW1iZXIgc2hvdWxkIGJlIHJlbmRlcmVkLiAqL1xuZXhwb3J0IHR5cGUgUXVvdGFSZW5kZXIgPVxuICAvKiogQSBwbGFpbiBpbnRlZ2VyIOKAlCBcIjQgLyAxMFwiLiAqL1xuICB8ICdjb3VudCdcbiAgLyoqIEEgYnl0ZSBjb3VudCDigJQgcmVuZGVyIHdpdGggYGZvcm1hdEJ5dGVzYCAoXCIxOC40IEdCXCIpLCBuZXZlciByYXcuICovXG4gIHwgJ2J5dGVzJztcblxuLyoqIFdoYXQgYSBzdXJmYWNlIG5lZWRzIHRvIGtub3cgdG8gc2hvdyBvbmUgcXVvdGEgdHlwZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUeXBlTWV0YSB7XG4gIC8qKlxuICAgKiBTSU5HVUxBUiBodW1hbiBsYWJlbCDigJQgdGhlIG9uZSBzcGVsbGluZyBldmVyeSA0MjkgYm9keSwgbm90aWZpY2F0aW9uIGFuZFxuICAgKiBkYXNoYm9hcmQgdXNlcyAoXCJBUEkgY2FsbCBxdW90YSByZWFjaGVkIOKAplwiKS5cbiAgICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQTFVSQUwgbGFiZWwsIGZvciBzdXJmYWNlcyB0aGF0IGxpc3QgZGltZW5zaW9ucyByYXRoZXIgdGhhbiBhZGRyZXNzIG9uZVxuICAgKiAoXCJBUEkgY2FsbHNcIiBvbiBhIHVzYWdlIGNhcmQsIGFnYWluc3QgXCJBUEkgY2FsbCBxdW90YSByZWFjaGVkXCIgaW4gYSA0MjkpLlxuICAgKlxuICAgKiBSRVFVSVJFRCwgYW5kIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIGZyb250ZW5kLCBiZWNhdXNlIHRoZSBmaXJzdCBkcmFmdCBwdXRcbiAgICogaXQgaW4gYSBgUmVjb3JkPHN0cmluZywgc3RyaW5nPmAgaGVscGVyIHRoYXQgZmVsbCBiYWNrIHRvIHRoZSBzaW5ndWxhciB3aGVuXG4gICAqIGEgdHlwZSB3YXMgbWlzc2luZyDigJQgc28gYSBuZXcgcXVvdGEgdHlwZSB3b3VsZCBoYXZlIHJlbmRlcmVkIFwiQnVpbGQgbWludXRlXCJcbiAgICogaW4gcGx1cmFsIGNvbnRleHRzLCB3cm9uZ2x5IGFuZCBzaWxlbnRseS4gVGhhdCBpcyB0aGUgc2FtZSBwYXJ0aWFsLW1hcCB0cmFwXG4gICAqIHRoaXMgY2F0YWxvZyBleGlzdHMgdG8gcmVtb3ZlLCBhbmQgYFJlY29yZDxRdW90YVR5cGUsIOKApj5gIGNsb3NlcyBpdCBvbmx5IGlmXG4gICAqIGV2ZXJ5IGRpc3BsYXkgZmFjdCBsaXZlcyBoZXJlLlxuICAgKi9cbiAgbGFiZWxQbHVyYWw6IHN0cmluZztcbiAgLyoqIEhvdyB0byByZW5kZXIgYSByYXcgdmFsdWUgZm9yIHRoaXMgdHlwZS4gKi9cbiAgcmVuZGVyOiBRdW90YVJlbmRlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBxdW90YSBSRUZJTExTIG9uIHRoZSBwZXJpb2QsIG9yIHBlcnNpc3RzIHVudGlsIHRoZSB0ZW5hbnRcbiAgICogY2hhbmdlcyBzb21ldGhpbmcuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIHNpbmdsZSBtb3N0IGxvYWQtYmVhcmluZyBzZW1hbnRpYyBkaWZmZXJlbmNlIGJldHdlZW4gcXVvdGFcbiAgICogdHlwZXMgYW5kIG5vdGhpbmcgY291bGQgcmVhZCBpdCBiZWZvcmU6IGEgc3VyZmFjZSBoYWQgdG8ga25vdywgYnkgaGFuZCxcbiAgICogdGhhdCBcInJlc2V0cyBpbiAyIGRheXNcIiBpcyB0cnVlIG9mIGBhcGlDYWxsc2AgYW5kIGZhbHNlIG9mIGBzdG9yYWdlQnl0ZXNgLlxuICAgKiBHZXR0aW5nIGl0IHdyb25nIGlzIG5vdCBjb3NtZXRpYyDigJQgdGhlIHF1b3RhcyBwYWdlIHRvbGQgYW4gb3JnYW5pemF0aW9uIGl0c1xuICAgKiByZWdpc3RyeSBzdG9yYWdlIHdvdWxkIHJlc2V0LCB3aGljaCBpcyB0aGUgb3Bwb3NpdGUgb2YgdGhlIG9uZSB0aGluZyBpdFxuICAgKiBuZWVkcyB0byB1bmRlcnN0YW5kIGFib3V0IHN0b3JhZ2UuXG4gICAqXG4gICAqIC0gYGZsb3dgIOKAlCBhIHBlci1wZXJpb2QgcmF0ZSwgcmVzZXJ2ZWQgb24gY3JlYXRlL2J1aWxkIGFuZCB6ZXJvZWQgYXQgdGhlXG4gICAqICAgYm91bmRhcnkuIEhpdHRpbmcgaXQgaXMgdGVtcG9yYXJ5IGFuZCB0aGUgYWNjb3VudCBzZWxmLWhlYWxzLiBUaGUgcGVyaW9kIGlzXG4gICAqICAgUEVSIFRZUEUgcmF0aGVyIHRoYW4gZ2xvYmFsOiBgUVVPVEFfUkVTRVRfREFZU2AgKDMgZGF5cykgZm9yIGV2ZXJ5IGZsb3cgYnV0XG4gICAqICAgYGNwdUNyZWRpdHNgLCB3aGljaCBpcyBtb250aGx5LiBSZWFkIGl0IHRocm91Z2ggYHF1b3RhUGVyaW9kRGF5c2AgYW5kIG5ldmVyXG4gICAqICAgYXNzdW1lIHRoZSBnbG9iYWwg4oCUIGEgZm9yZWNhc3Qgb3IgYSBcInJlc2V0cyBpbiBOIGRheXNcIiBsaW5lIGNvbXB1dGVkXG4gICAqICAgYWdhaW5zdCB0aGUgd3Jvbmcgd2luZG93IGlzIHdyb25nIGJ5IGEgZmFjdG9yIG9mIHRlbiBmb3IgY3JlZGl0cy5cbiAgICogLSBgc3RvY2tgIOKAlCBhIGxldmVsLCBub3QgYSByYXRlLiBJdCBzdGF5cyB3aGVyZSBpdCBpcyB1bnRpbCBieXRlcyBhcmUgZnJlZWRcbiAgICogICBvciByb3dzIGFyZSBkZWxldGVkLCBzbyBhIHJlc2V0IGRhdGUsIGEgXCJyZXNldHMgaW4gTiBkYXlzXCIgbGluZSBhbmQgYVxuICAgKiAgIGJ1cm4tcmF0ZSBmb3JlY2FzdCBhcmUgYWxsIG1lYW5pbmdsZXNzIGZvciBpdC4gYHN0b3JhZ2VCeXRlc2AgaXMgbWVhc3VyZWQ7XG4gICAqICAgdGhlIHJlc291cmNlLWNvdW50IGNhcHMgYXJlIGNvdW50ZWQgYXQgY3JlYXRlIHRpbWUgYW5kIGRlY3JlbWVudGVkIG9uXG4gICAqICAgZGVsZXRlOyBgbGlzdGluZ3NgIGNvdW50cyBhY3RpdmUgcHVibGljYXRpb25zLlxuICAgKlxuICAgKiBUaGUge0BsaW5rIFF1b3RhVHlwZU1ldGEuZGVzY3JpcHRpb259IHdvcmRpbmcgZm9sbG93cyBmcm9tIHRoaXMgKFwidGhpc1xuICAgKiBwZXJpb2RcIiBhZ2FpbnN0IFwiY3VycmVudGx5XCIpLCBhbmQgYSB0ZXN0IGhvbGRzIHRoZSB0d28gaW4gYWdyZWVtZW50LlxuICAgKi9cbiAgYWNjcnVhbDogUXVvdGFBY2NydWFsO1xuICAvKipcbiAgICogSG93IHVzYWdlIGlzIE9CU0VSVkVEIOKAlCB3aGljaCBpcyBhIGRpZmZlcmVudCBxdWVzdGlvbiBmcm9tIHdoZXRoZXIgdGhlXG4gICAqIHF1b3RhIHJlZmlsbHMsIGFuZCB0aGUgdHdvIGRvIG5vdCBsaW5lIHVwLlxuICAgKlxuICAgKiAtIGBtZXRlcmVkYCDigJQgdGhlIHBsYXRmb3JtIElOQ1JFTUVOVFMgYSBjb3VudGVyIGFzIHRoZSB3b3JrIGhhcHBlbnMuIEV2ZXJ5XG4gICAqICAgcXVvdGEgYnV0IG9uZSwgaW5jbHVkaW5nIHRoZSBjcmVhdGUtdGltZSBjb3VudHMgdGhhdCBhcmUgc3RvY2tzXG4gICAqICAgKGBkYXNoYm9hcmRzYCwgYGxpc3RpbmdzYCwg4oCmKS5cbiAgICogLSBgbWVhc3VyZWRgIOKAlCBub3RoaW5nIGluY3JlbWVudHMgYW55dGhpbmc7IHRoZSBmaWd1cmUgaXMgUkVBRCBmcm9tIHRoZVxuICAgKiAgIHN5c3RlbSBvZiByZWNvcmQgb24gZGVtYW5kLiBgc3RvcmFnZUJ5dGVzYCBvbmx5OiB0aGUgcmVnaXN0cnkgd2Fsa3MgaXRzXG4gICAqICAgb3duIGNhdGFsb2csIHdoaWNoIGlzIHdoeSBpdCBpcyBcInRoZSBvbmUgcXVvdGEgbm90aGluZyBpbmNyZW1lbnRzXCIuXG4gICAqXG4gICAqIEl0IGRlY2lkZXMgd2hpY2ggY29kZSBwYXRoIG1heSBsZWdpdGltYXRlbHkgbm90aWZ5IGFib3V0IGEgcXVvdGEuIEEgc3RvcmFnZVxuICAgKiBub3RpY2UgYXJyaXZpbmcgZnJvbSB0aGUgaW5jcmVtZW50IHBhdGggY291bGQgb25seSBiZSBhIGJ1ZywgYW5kIGFcbiAgICogYGxpc3RpbmdzYCBub3RpY2UgYXJyaXZpbmcgZnJvbSBhIHN3ZWVwIGxpa2V3aXNlIOKAlCBjb25mbGF0aW5nIHRoaXMgd2l0aFxuICAgKiB7QGxpbmsgYWNjcnVhbH0gd291bGQgaGF2ZSBzaWxlbmNlZCBldmVyeSBjcmVhdGUtdGltZSBjb3VudCBxdW90YSwgYmVjYXVzZVxuICAgKiB0aG9zZSBhcmUgc3RvY2tzIHRoYXQgYXJlIG5vbmV0aGVsZXNzIG1ldGVyZWQuXG4gICAqL1xuICBvYnNlcnZlZDogUXVvdGFPYnNlcnZhdGlvbjtcbiAgLyoqXG4gICAqIFdoYXQgdGhpcyBjb3VudGVyIGFjdHVhbGx5IGNvdW50cywgaW4gb25lIHNob3J0IHBocmFzZSDigJQgdGhlIGFuc3dlciB0byBcImFtIElcbiAgICogc3BlbmRpbmcgdGhpcyBvbmU/XCIuXG4gICAqXG4gICAqIFJFUVVJUkVELCBhbmQgYSBkaXNwbGF5IEZBQ1QgcmF0aGVyIHRoYW4gcGFnZSBjb3B5LCB3aGljaCBpcyB0aGUgY2FsbCBhXG4gICAqIGZpcnN0IHBhc3MgZ290IHdyb25nIGJ5IGp1ZGdpbmcgdGhlIGZpZWxkJ3MgbmFtZSBpbnN0ZWFkIG9mIGl0cyBjb250ZW50LiBJdFxuICAgKiBoYWQgYmVlbiBsZWZ0IGluIGEgZnJvbnRlbmQgYFJlY29yZDxEaXNwbGF5ZWRRdW90YVR5cGUsIHN0cmluZz5gIG9uIHRoZVxuICAgKiByZWFzb25pbmcgdGhhdCBkZXNjcmlwdGlvbnMgYXJlIGEgcGFnZSdzIG93biB2b2ljZS4gVGhleSBhcmUgbm90OiBlYWNoIG9mXG4gICAqIHRoZXNlIGFuc3dlcnMgYSBxdWVzdGlvbiB3aG9zZSBhbnN3ZXIgaXMgdGhlIHNhbWUgb24gZXZlcnkgc3VyZmFjZSwgYW5kIHR3b1xuICAgKiBzdXJmYWNlcyBkaXNhZ3JlZWluZyBpcyBhIGJ1Zywgbm90IGEgZGlmZmVyZW5jZSBpbiB0b25lLiBUd28gb2YgdGhlIGZpdmVcbiAgICogbG9jYWwgY29waWVzIGhhZCBhbHJlYWR5IGRyaWZ0ZWQg4oCUIGBhdXRvbWF0aW9uQ2FsbHNgIG9taXR0ZWQgcGVyc29uYWxcbiAgICogYWNjZXNzIGtleXMgKHNvIGEgUEFUIGhvbGRlciByZWFkIHRoZSBwYWdlIGFuZCBjb25jbHVkZWQgdGhleSB3ZXJlIHNwZW5kaW5nXG4gICAqIGBhcGlDYWxsc2ApLCBhbmQgYHBsdWdpbnNgL2BwaXBlbGluZXNgIHdlcmUgcGhyYXNlZCBhcyBzdG9ja3MuXG4gICAqXG4gICAqIFRoZSB0ZXN0IGlzIHdoZXRoZXIgYGRvY3MvcXVvdGFzLm1kYCBhbmQgdGhpcyBzdHJpbmcgY2FuIGxlZ2l0aW1hdGVseVxuICAgKiBkaWZmZXIuIEZvciB0aGVzZSwgbm8uIEZvciBhIHRpZXIncyBwb3NpdGlvbmluZyBsaW5lIChcIlN0YXJ0ZXIgdGllclwiKSBvciB0aGVcbiAgICogcXVvdGFzIHBhZ2UncyBwb29saW5nIGV4cGxhbmF0aW9uLCB5ZXMg4oCUIHRob3NlIHN0YXkgaW4gdGhlIHBhZ2UsIGV4YWN0bHkgYXNcbiAgICogYFRJRVJfTUVUQWAgYWxyZWFkeSBzcGxpdHMgYSB0aWVyJ3MgbGFiZWwgZnJvbSBpdHMgc2FsZXMgY29weS5cbiAgICpcbiAgICogUGhyYXNpbmcgZm9sbG93cyB0aGUgU0VNQU5USUNTIGluIHtAbGluayBRdW90YVR5cGV9J3Mgb3duIGRvY3VtZW50YXRpb24sIG5vdFxuICAgKiBhIGhvdXNlIHN0eWxlOiBcInRoaXMgcGVyaW9kXCIgZm9yIHRoZSBwZXItcGVyaW9kIGZsb3dzLCBcImN1cnJlbnRseVwiIGZvciB0aGVcbiAgICogY3JlYXRlLXRpbWUgY291bnRzIHRoYXQgZGVjcmVtZW50IG9uIGRlbGV0ZSwgYW5kIG5laXRoZXIgZm9yIHRoZSBtZWFzdXJlZFxuICAgKiBzdG9yYWdlIHRvdGFsLlxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1bml0IGFuIEFERC1PTiBQQUNLIG9mIHRoaXMgcXVvdGEgaXMgdHlwZWQgaW4sIGFuZCB0aGUgZGl2aXNvciBmcm9tIHRoZVxuICAgKiByYXcgZ3JhbnQgdG8gdGhhdCB1bml0IOKAlCBzbyBhICsxMCBHQiBzdG9yYWdlIHBhY2sgb2ZmZXJzIGEgR0Igc3RlcCByYXRoZXJcbiAgICogdGhhbiBhIHBhY2sgY291bnQuXG4gICAqXG4gICAqIEFic2VudCBtZWFucyBcInR5cGUgcGFjayBjb3VudHNcIiwgd2hpY2ggaXMgcmlnaHQgd2hlcmUgdGhlIHF1b3RhIGhhcyBub1xuICAgKiBuYXR1cmFsIHVuaXQ6IFwiMSBwYWNrIG9mIEFQSSBjYWxsc1wiIHJlYWRzIGJldHRlciB0aGFuIFwiMjUwMDAgY2FsbHNcIi4gVGhlXG4gICAqIHN0ZXAgaXRzZWxmIGlzIGFsd2F5cyBkZXJpdmVkIGZyb20gdGhlIGJ1bmRsZSdzIG93biBgZ3JhbnRzYCwgbmV2ZXIgZnJvbSBhXG4gICAqIGNvbnN0YW50IGhlcmUsIGJlY2F1c2UgYSBncmFudCBpcyBlbnYtb3ZlcnJpZGFibGUuXG4gICAqL1xuICBwYWNrVW5pdD86IHsgbmFtZTogc3RyaW5nOyBwZXI6IG51bWJlciB9O1xufVxuXG5jb25zdCBHQiA9IDEwMjQgKiogMztcblxuLyoqXG4gKiBEaXNwbGF5IG1ldGFkYXRhIGZvciBldmVyeSBxdW90YSB0eXBlLiBMYWJlbHMgYXJlIHRoZSBjYW5vbmljYWwgb25lcyDigJQgdGhlXG4gKiBzdHJpbmdzIGhlcmUgYXJlIHVzZXItZmFjaW5nIGFuZCBhcmUgcmVsaWVkIG9uIGJ5IDQyOSBib2RpZXMgYW5kIG5vdGljZXMsIHNvXG4gKiB0aGV5IGNoYW5nZSBvbmx5IGRlbGliZXJhdGVseS5cbiAqL1xuZXhwb3J0IGNvbnN0IFFVT1RBX0NBVEFMT0c6IFJlYWRvbmx5PFJlY29yZDxRdW90YVR5cGUsIFF1b3RhVHlwZU1ldGE+PiA9IHtcbiAgLy8gUGVyLXBlcmlvZCBGTE9XUyDigJQgYSBjcmVhdGlvbiByYXRlLCBub3QgYSBzdG9jay4gRGVsZXRpbmcgdGhlIGVudGl0eSBkb2VzXG4gIC8vIG5vdCBnaXZlIHRoZSBzbG90IGJhY2sgKGBkZWNyZW1lbnQtb24tZGVsZXRlYCB3YXMgY29uc2lkZXJlZCBhbmQgcmVqZWN0ZWQpLFxuICAvLyBzbyB0aGUgd29yZGluZyBzYXlzIFwidGhpcyBwZXJpb2RcIiB0byBzdG9wIHRoZSBzdG9jayByZWFkaW5nLlxuICBwbHVnaW5zOiB7IGxhYmVsOiAnUGx1Z2luIGJ1aWxkJywgbGFiZWxQbHVyYWw6ICdQbHVnaW5zJywgcmVuZGVyOiAnY291bnQnLCBhY2NydWFsOiAnZmxvdycsIG9ic2VydmVkOiAnbWV0ZXJlZCcsIGRlc2NyaXB0aW9uOiAnUGx1Z2luIHZlcnNpb25zIGRlcGxveWVkIHRoaXMgcGVyaW9kJyB9LFxuICBwaXBlbGluZXM6IHsgbGFiZWw6ICdQaXBlbGluZSBjcmVhdGlvbicsIGxhYmVsUGx1cmFsOiAnUGlwZWxpbmVzJywgcmVuZGVyOiAnY291bnQnLCBhY2NydWFsOiAnZmxvdycsIG9ic2VydmVkOiAnbWV0ZXJlZCcsIGRlc2NyaXB0aW9uOiAnUGlwZWxpbmVzIGNyZWF0ZWQgdGhpcyBwZXJpb2QnIH0sXG4gIC8vIFRoZSBjYWxsIGJ1ZGdldHMuIFdISUNIIE9ORSBhIHJlcXVlc3Qgc3BlbmRzIGlzIGRlY2lkZWQgYnlcbiAgLy8gYG1ldGVyZWRRdW90YVR5cGVGb3JgLCBuZXZlciBieSB0aGUgcm91dGU6IGEgc2VydmljZS1hY2NvdW50IGtleSwgYSBQRVJTT05BTFxuICAvLyBBQ0NFU1Mga2V5IChgdG9rZW5fdXNlOiAnYXBpX2tleSdgKSBvciBhbnl0aGluZyBtaW50ZWQgd2hpbGUgaG9sZGluZyBvbmVcbiAgLy8gKGBwYXJlbnRLZXlJZGApIHNwZW5kcyBgYXV0b21hdGlvbkNhbGxzYCBJTlNURUFEIG9mIGBhcGlDYWxsc2AuXG4gIGFwaUNhbGxzOiB7IGxhYmVsOiAnQVBJIGNhbGwnLCBsYWJlbFBsdXJhbDogJ0FQSSBjYWxscycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ1JlcXVlc3RzIG1hZGUgYnkgcGVvcGxlIGluIGJyb3dzZXIgc2Vzc2lvbnMgdGhpcyBwZXJpb2QnIH0sXG4gIGF1dG9tYXRpb25DYWxsczogeyBsYWJlbDogJ0F1dG9tYXRpb24gY2FsbCcsIGxhYmVsUGx1cmFsOiAnQXV0b21hdGlvbiBjYWxscycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ1JlcXVlc3RzIG1hZGUgd2l0aCBzZXJ2aWNlLWFjY291bnQgb3IgcGVyc29uYWwgYWNjZXNzIGtleXMgdGhpcyBwZXJpb2QnIH0sXG4gIGFpQ2FsbHM6IHsgbGFiZWw6ICdBSSBjYWxsJywgbGFiZWxQbHVyYWw6ICdBSSBjYWxscycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ0FJIGdlbmVyYXRpb24gaW52b2NhdGlvbnMgdGhpcyBwZXJpb2QnIH0sXG4gIC8vIFRoZSBvbmUgZmxvdyBxdW90YSBvbiBhIHBlcmlvZCBvZiBpdHMgT1dOIOKAlCBhIE1PTlRILCB3aGVyZSBldmVyeSBvdGhlciBmbG93XG4gIC8vIHJvbGxzIG9uIFFVT1RBX1JFU0VUX0RBWVMgKDMgZGF5cykuIFJlbmRlcmVkIGFzIGEgQ09VTlQgYW5kIG5ldmVyIGFzIGFcbiAgLy8gZHVyYXRpb246IHRoZSB1bml0IGlzIGFuIGFic3RyYWN0IGNyZWRpdCBwcmVjaXNlbHkgc28gaXQgY2Fubm90IGJlIG1pc3JlYWQgYXNcbiAgLy8gd2FsbC1jbG9jayAoXCIxMSwyNTAgYnVpbGQgbWludXRlc1wiIHJlYWRzIGFzIDE4NyBob3VycyB3aGVuIGl0IGJ1eXMgMTI1KSwgYW5kXG4gIC8vIGZvcm1hdHRpbmcgaXQgYmFjayBpbnRvIFwiMTg3aCAzMG1cIiB3b3VsZCB1bmRvIHRoYXQuIFRoZSB3YWxsLWNsb2NrIGNvbnZlcnNpb25cbiAgLy8gYmVsb25ncyBpbiB0aGUgcHJlLWJ1aWxkIGNvc3QgaGludCwgd2hlcmUgaXQgZXhwbGFpbnMgcmF0aGVyIHRoYW4gbWlzbGVhZHMuXG4gIGNwdUNyZWRpdHM6IHsgbGFiZWw6ICdDUFUgY3JlZGl0JywgbGFiZWxQbHVyYWw6ICdDUFUgY3JlZGl0cycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ3ZDUFUtbWludXRlcyBvZiBidWlsZCBjb21wdXRlIHVzZWQgdGhpcyBtb250aCcsIHBhY2tVbml0OiB7IG5hbWU6ICdjcmVkaXRzJywgcGVyOiAxIH0gfSxcbiAgLy8gQSBNRUFTVVJFRCB0b3RhbCwgcmVjb21wdXRlZCBvbiBkZW1hbmQgcmF0aGVyIHRoYW4gY291bnRlZCDigJQgdGhlIG9uZSBxdW90YVxuICAvLyB0aGF0IGlzIG5laXRoZXIgYSBwZXJpb2QgZmxvdyBub3IgYSBjcmVhdGUtdGltZSBjb3VudC5cbiAgc3RvcmFnZUJ5dGVzOiB7IGxhYmVsOiAnUmVnaXN0cnkgc3RvcmFnZScsIGxhYmVsUGx1cmFsOiAnUmVnaXN0cnkgc3RvcmFnZScsIHJlbmRlcjogJ2J5dGVzJywgYWNjcnVhbDogJ3N0b2NrJywgb2JzZXJ2ZWQ6ICdtZWFzdXJlZCcsIGRlc2NyaXB0aW9uOiAnUmVnaXN0cnkgc3RvcmFnZSBjdXJyZW50bHkgaW4gdXNlJywgcGFja1VuaXQ6IHsgbmFtZTogJ0dCJywgcGVyOiBHQiB9IH0sXG4gIC8vIFJlc291cmNlLWNvdW50IGNhcHM6IGNvdW50ZWQgYXQgY3JlYXRlIHRpbWUgYW5kIERFQ1JFTUVOVEVEIG9uIGRlbGV0ZSwgc29cbiAgLy8gdGhlc2UgcmVhbGx5IGFyZSBzdG9ja3MgYW5kIFwidGhpcyBwZXJpb2RcIiB3b3VsZCBiZSB3cm9uZy5cbiAgZGFzaGJvYXJkczogeyBsYWJlbDogJ0Rhc2hib2FyZCcsIGxhYmVsUGx1cmFsOiAnRGFzaGJvYXJkcycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ3N0b2NrJywgb2JzZXJ2ZWQ6ICdtZXRlcmVkJywgZGVzY3JpcHRpb246ICdEYXNoYm9hcmRzIGN1cnJlbnRseSBkZWZpbmVkJyB9LFxuICBhbGVydFJ1bGVzOiB7IGxhYmVsOiAnQWxlcnQgcnVsZScsIGxhYmVsUGx1cmFsOiAnQWxlcnQgcnVsZXMnLCByZW5kZXI6ICdjb3VudCcsIGFjY3J1YWw6ICdzdG9jaycsIG9ic2VydmVkOiAnbWV0ZXJlZCcsIGRlc2NyaXB0aW9uOiAnQWxlcnQgcnVsZXMgY3VycmVudGx5IGRlZmluZWQnIH0sXG4gIGFsZXJ0RGVzdGluYXRpb25zOiB7IGxhYmVsOiAnQWxlcnQgZGVzdGluYXRpb24nLCBsYWJlbFBsdXJhbDogJ0FsZXJ0IGRlc3RpbmF0aW9ucycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ3N0b2NrJywgb2JzZXJ2ZWQ6ICdtZXRlcmVkJywgZGVzY3JpcHRpb246ICdBbGVydCBkZXN0aW5hdGlvbnMgY3VycmVudGx5IGRlZmluZWQnIH0sXG4gIGlkcENvbmZpZ3M6IHsgbGFiZWw6ICdJZFAgY29uZmlndXJhdGlvbicsIGxhYmVsUGx1cmFsOiAnSWRQIGNvbmZpZ3VyYXRpb25zJywgcmVuZGVyOiAnY291bnQnLCBhY2NydWFsOiAnc3RvY2snLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ0lkZW50aXR5LXByb3ZpZGVyIGNvbmZpZ3VyYXRpb25zIGN1cnJlbnRseSBkZWZpbmVkJyB9LFxuICBsaXN0aW5nczogeyBsYWJlbDogJ1BsdWdpbiBsaXN0aW5nJywgbGFiZWxQbHVyYWw6ICdQbHVnaW4gbGlzdGluZ3MnLCByZW5kZXI6ICdjb3VudCcsIGFjY3J1YWw6ICdzdG9jaycsIG9ic2VydmVkOiAnbWV0ZXJlZCcsIGRlc2NyaXB0aW9uOiAnQWN0aXZlIHBsdWdpbiBsaXN0aW5ncyB5b3UgcHVibGlzaCcgfSxcbn07XG5cbi8qKlxuICogQ29uc3VtYWJsZXMgdGhhdCBhcmUgTk9UIHF1b3RhIHR5cGVzIGJ1dCByZW5kZXIgYmVzaWRlIHRoZW0g4oCUIHNhbWUgbGFiZWwsXG4gKiBzYW1lIGJhciwgc2FtZSBjYXJkLlxuICpcbiAqIGBzZWF0c2AgaXMgdGhlIG9ubHkgb25lOiBpdCBpcyBhIFNUT0NLIChob3cgbWFueSBwZW9wbGUgbWF5IGJlIG9uIHRoZVxuICogYWNjb3VudCkgcmF0aGVyIHRoYW4gYSBwZXItcGVyaW9kIGZsb3csIHNvIGl0IGlzIGRlbGliZXJhdGVseSBvdXRzaWRlXG4gKiBgUXVvdGFUeXBlYCBhbmQgaXMgc291cmNlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIHF1b3RhIHJvbGx1cC4gQnV0IHRoZSBiaWxsaW5nXG4gKiB1c2FnZSBjYXJkIGRyYXdzIGl0IGluIHRoZSBzYW1lIGxpc3QsIGFuZCBiZWZvcmUgdGhpcyBlbnRyeSBleGlzdGVkIHRoYXQgb25lXG4gKiByb3cgY2FycmllZCBpdHMgb3duIGlubGluZSBcIlNlYXRzXCIgbGFiZWwgd2hpbGUgdGhlIGZpdmUgYmVzaWRlIGl0IGNhbWUgZnJvbVxuICogdGhlIGNhdGFsb2cg4oCUIHRoZSBwcmVjaXNlIHNwbGl0LWZhY3QgZHJpZnQgdGhpcyBmaWxlIGV4aXN0cyB0byByZW1vdmUuXG4gKlxuICogS2VlcCB0aGlzIGZvciB0aGluZ3MgcmVuZGVyZWQgQVMgYSBjb25zdW1hYmxlLiBJdCBpcyBub3QgYSBiYWNrIGRvb3IgZm9yXG4gKiBxdW90YSB0eXBlczogYSByZWFsIHF1b3RhIGJlbG9uZ3MgaW4ge0BsaW5rIFFVT1RBX0NBVEFMT0d9LCB3aGVyZVxuICogYFJlY29yZDxRdW90YVR5cGUsIOKApj5gIGZvcmNlcyB0aGUgZW50cnkuXG4gKi9cbmV4cG9ydCBjb25zdCBOT05fUVVPVEFfQ09OU1VNQUJMRV9DQVRBTE9HOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBRdW90YVR5cGVNZXRhPj4gPSB7XG4gIHNlYXRzOiB7IGxhYmVsOiAnU2VhdCcsIGxhYmVsUGx1cmFsOiAnU2VhdHMnLCByZW5kZXI6ICdjb3VudCcsIGFjY3J1YWw6ICdzdG9jaycsIG9ic2VydmVkOiAnbWVhc3VyZWQnLCBkZXNjcmlwdGlvbjogJ01lbWJlcnMgdGhpcyBhY2NvdW50IG1heSBoYXZlJyB9LFxufTtcblxuLyoqXG4gKiBFdmVyeSBkZXNjcmliZWQgY29uc3VtYWJsZSwgd2lkZW5lZCBmb3IgbG9va3VwcyBieSBhIHZhbHVlIHRoYXQgY2FtZSBvZmYgdGhlXG4gKiB3aXJlLlxuICovXG5jb25zdCBieUtleTogUmVjb3JkPHN0cmluZywgUXVvdGFUeXBlTWV0YSB8IHVuZGVmaW5lZD4gPSB7XG4gIC4uLk5PTl9RVU9UQV9DT05TVU1BQkxFX0NBVEFMT0csXG4gIC4uLlFVT1RBX0NBVEFMT0csXG59O1xuXG4vKipcbiAqIFRoaXMgdHlwZSdzIHNpbmd1bGFyIGxhYmVsLCBvciB0aGUgcmF3IGtleSBmb3IgYSB2YWx1ZSBvdXRzaWRlIHRoZSBjYXRhbG9nLlxuICpcbiAqIFRoZSBhY2Nlc3NvcnMgdGFrZSBgc3RyaW5nYCBiZWNhdXNlIHRoZSBxdW90YSB0eXBlIG9mdGVuIGFycml2ZXMgZnJvbSB0aGUgd2lyZVxuICogKGEgNDI5IGJvZHksIGEgcXVvdGEgcmVzcG9uc2UpIHdoZXJlIGFuIHVua25vd24gdmFsdWUgbXVzdCByZW5kZXIgYXMgc29tZXRoaW5nXG4gKiByYXRoZXIgdGhhbiBjcmFzaCBhIHBhZ2UuIFRoZSBgUXVvdGFUeXBlYCBvdmVybG9hZCBpcyBmb3IgaW50ZXJuYWwgY2FsbGVyczogaXRcbiAqIG1ha2VzIGEgdHlwbyBhIGNvbXBpbGUgZXJyb3IgaW5zdGVhZCBvZiBhIGtleSByZW5kZXJlZCBhcyBhIGxhYmVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGFMYWJlbCh0eXBlOiBRdW90YVR5cGUpOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFMYWJlbCh0eXBlOiBzdHJpbmcpOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFMYWJlbCh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnlLZXlbdHlwZV0/LmxhYmVsID8/IHR5cGU7XG59XG5cbi8qKiBUaGlzIHR5cGUncyBQTFVSQUwgbGFiZWwsIG9yIHRoZSByYXcga2V5IGZvciBhIHZhbHVlIG91dHNpZGUgdGhlIGNhdGFsb2cuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGFMYWJlbFBsdXJhbCh0eXBlOiBRdW90YVR5cGUpOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFMYWJlbFBsdXJhbCh0eXBlOiBzdHJpbmcpOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFMYWJlbFBsdXJhbCh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnlLZXlbdHlwZV0/LmxhYmVsUGx1cmFsID8/IHR5cGU7XG59XG5cbi8qKlxuICogSG93IHRvIHJlbmRlciB0aGlzIHR5cGUncyB2YWx1ZXMuIGBjb3VudGAgZm9yIGFueXRoaW5nIHRoZSBjYXRhbG9nIGRvZXMgbm90XG4gKiBrbm93LCBzbyBhbiB1bmZhbWlsaWFyIHdpcmUgdmFsdWUgcmVuZGVycyBhcyBhIHBsYWluIG51bWJlci5cbiAqXG4gKiBSZWFkIFRISVMgcmF0aGVyIHRoYW4gYXNraW5nIFwiaXMgaXQgYnl0ZXM/XCIuIEEgYm9vbGVhbiBoZWxwZXIgZGVncmFkZXNcbiAqIHNpbGVudGx5IHRoZSBtb21lbnQge0BsaW5rIFF1b3RhUmVuZGVyfSBncm93cyBhIHRoaXJkIG1lbWJlciDigJQgYSBuZXcgbW9kZVxuICogd291bGQgc2ltcGx5IHJlbmRlciBhcyBhIGNvdW50LCB3aXRoIG5vdGhpbmcgZmFpbGluZyDigJQgd2hlcmVhcyBhIGNhbGxlciB0aGF0XG4gKiBzd2l0Y2hlcyBvbiB0aGlzIHZhbHVlIGV4aGF1c3RpdmVseSBzdG9wcyBjb21waWxpbmcgdW50aWwgaXQgaGFuZGxlcyB0aGUgbmV3XG4gKiBtb2RlLiBUaGF0IGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGUgY2F0YWxvZywgYXBwbGllZCB0byBpdHMgb3duIGFjY2Vzc29ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUmVuZGVyKHR5cGU6IFF1b3RhVHlwZSk6IFF1b3RhUmVuZGVyO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUmVuZGVyKHR5cGU6IHN0cmluZyk6IFF1b3RhUmVuZGVyO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUmVuZGVyKHR5cGU6IHN0cmluZyk6IFF1b3RhUmVuZGVyIHtcbiAgcmV0dXJuIGJ5S2V5W3R5cGVdPy5yZW5kZXIgPz8gJ2NvdW50Jztcbn1cblxuY29uc3QgQllURV9VTklUUyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQiddIGFzIGNvbnN0O1xuXG4vKipcbiAqIEEgYnl0ZSBjb3VudCBhcyBhIGh1bWFuIGFtb3VudCDigJQgYDEuNSBHQmAsIGA1MTIgTUJgLCBgMCBCYC5cbiAqXG4gKiBUaGUgT05FIGltcGxlbWVudGF0aW9uOiB0aGUgZnJvbnRlbmQncyBgZm9ybWF0Qnl0ZXNgIGRlbGVnYXRlcyBoZXJlIHJhdGhlclxuICogdGhhbiBrZWVwaW5nIGl0cyBvd24gY29weSwgc28gYSBzdG9yYWdlIGZpZ3VyZSByZWFkcyBpZGVudGljYWxseSBpbiBhIHF1b3RhXG4gKiBub3RpY2UsIGEgNDAzIGV4cGxhbmF0aW9uIGFuZCB0aGUgZGFzaGJvYXJkLiBCaW5hcnkgdW5pdHMgKDEwMjQpLCBvbmUgZGVjaW1hbFxuICogYmVsb3cgMTAgYW5kIHJvdW5kZWQgYWJvdmUsIHdoaWNoIGlzIHdoYXQgdGhlIGRhc2hib2FyZCBhbHJlYWR5IHJlbmRlcmVkIOKAlFxuICogdGhpcyBtb3ZlZCB0aGUgYWxnb3JpdGhtLCBpdCBkaWQgbm90IGNoYW5nZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJ5dGVBbW91bnQoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGJ5dGVzKSB8fCBieXRlcyA8IDApIHJldHVybiAnMCBCJztcbiAgbGV0IHZhbHVlID0gYnl0ZXM7XG4gIGxldCBpID0gMDtcbiAgd2hpbGUgKHZhbHVlID49IDEwMjQgJiYgaSA8IEJZVEVfVU5JVFMubGVuZ3RoIC0gMSkge1xuICAgIHZhbHVlIC89IDEwMjQ7XG4gICAgaSsrO1xuICB9XG4gIHJldHVybiB2YWx1ZSA8IDEwID8gYCR7dmFsdWUudG9GaXhlZCgxKX0gJHtCWVRFX1VOSVRTW2ldfWAgOiBgJHtNYXRoLnJvdW5kKHZhbHVlKX0gJHtCWVRFX1VOSVRTW2ldfWA7XG59XG5cbi8qKlxuICogQSByYXcgcXVvdGEgdmFsdWUgYXMgdGhlIGFtb3VudCBhIEhVTUFOIHNob3VsZCByZWFkLCBwZXIgdGhpcyB0eXBlJ3NcbiAqIHtAbGluayBRdW90YVJlbmRlcn0g4oCUIGJ5dGVzIGFzIGAyNSBHQmAsIGNvdW50cyBncm91cGVkIGFzIGA2MCwwMDBgLlxuICpcbiAqIEZvciBzZXJ2ZXItc2lkZSBjb3B5IChxdW90YSBub3RpY2VzLCBhdWRpdCByZWFzb25zLCA0MDMgZXhwbGFuYXRpb25zKSwgd2hpY2hcbiAqIGlzIHdoeSBpdCBpcyBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBmcm9udGVuZDogYSBzdG9yYWdlIG5vdGljZSB0aGF0XG4gKiBpbnRlcnBvbGF0ZWQgdGhlIHJhdyBudW1iZXIgd291bGQgcmVhZCBcInVzZWQgYWxsIDI2ODQzNTQ1NjAwIG9mIGl0cyByZWdpc3RyeVxuICogc3RvcmFnZVwiLiBUaGUgZnJvbnRlbmQgaGFzIGl0cyBvd24gdGhpbiB3cmFwcGVyIGJlY2F1c2UgaXQgcmVuZGVycyBhblxuICogdW5saW1pdGVkICgtMSkgbGltaXQgYXMgYOKInmAsIHdoaWNoIGlzIGEgZGlzcGxheSBjaG9pY2Ugbm8gc2VydmVyIGNvcHkgbWFrZXNcbiAqICh1bmxpbWl0ZWQgb3JncyBhcmUgc2tpcHBlZCBiZWZvcmUgYW55IGNvcHkgaXMgZ2VuZXJhdGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFF1b3RhQW1vdW50KHR5cGU6IHN0cmluZywgdmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBxdW90YVJlbmRlcih0eXBlKSA9PT0gJ2J5dGVzJyA/IGZvcm1hdEJ5dGVBbW91bnQodmFsdWUpIDogdmFsdWUudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyk7XG59XG5cbi8qKlxuICogSG93IHRoaXMgcXVvdGEncyB1c2FnZSBpcyBvYnNlcnZlZDogYG1ldGVyZWRgIChpbmNyZW1lbnRlZCkgb3IgYG1lYXN1cmVkYFxuICogKHJlYWQgb24gZGVtYW5kKS4gVW5rbm93biB3aXJlIHZhbHVlcyByZWFkIGFzIGBtZXRlcmVkYCwgbWF0Y2hpbmcgZXZlcnlcbiAqIHF1b3RhIGJ1dCBzdG9yYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGFPYnNlcnZhdGlvbih0eXBlOiBRdW90YVR5cGUpOiBRdW90YU9ic2VydmF0aW9uO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhT2JzZXJ2YXRpb24odHlwZTogc3RyaW5nKTogUXVvdGFPYnNlcnZhdGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YU9ic2VydmF0aW9uKHR5cGU6IHN0cmluZyk6IFF1b3RhT2JzZXJ2YXRpb24ge1xuICByZXR1cm4gYnlLZXlbdHlwZV0/Lm9ic2VydmVkID8/ICdtZXRlcmVkJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoaXMgcXVvdGEgcmVmaWxscyBvbiB0aGUgcGVyaW9kIChgZmxvd2ApIG9yIHBlcnNpc3RzIChgc3RvY2tgKS5cbiAqIFVua25vd24gd2lyZSB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgYGZsb3dgLCBtYXRjaGluZyBldmVyeSBtZXRlcmVkIHF1b3RhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGFBY2NydWFsKHR5cGU6IFF1b3RhVHlwZSk6IFF1b3RhQWNjcnVhbDtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YUFjY3J1YWwodHlwZTogc3RyaW5nKTogUXVvdGFBY2NydWFsO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhQWNjcnVhbCh0eXBlOiBzdHJpbmcpOiBRdW90YUFjY3J1YWwge1xuICByZXR1cm4gYnlLZXlbdHlwZV0/LmFjY3J1YWwgPz8gJ2Zsb3cnO1xufVxuXG4vKiogV2hhdCB0aGlzIHR5cGUgY291bnRzLCBvciB0aGUgZW1wdHkgc3RyaW5nIGZvciBhIHZhbHVlIG91dHNpZGUgdGhlIGNhdGFsb2cuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGFEZXNjcmlwdGlvbih0eXBlOiBRdW90YVR5cGUpOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFEZXNjcmlwdGlvbih0eXBlOiBzdHJpbmcpOiBzdHJpbmc7XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFEZXNjcmlwdGlvbih0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnlLZXlbdHlwZV0/LmRlc2NyaXB0aW9uID8/ICcnO1xufVxuXG4vKiogVGhlIHBhY2sgdW5pdCBmb3IgdGhpcyB0eXBlLCBvciBgbnVsbGAgdG8gdHlwZSBwYWNrIGNvdW50cyBpbnN0ZWFkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUGFja1VuaXQodHlwZTogUXVvdGFUeXBlKTogeyBuYW1lOiBzdHJpbmc7IHBlcjogbnVtYmVyIH0gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUGFja1VuaXQodHlwZTogc3RyaW5nKTogeyBuYW1lOiBzdHJpbmc7IHBlcjogbnVtYmVyIH0gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUGFja1VuaXQodHlwZTogc3RyaW5nKTogeyBuYW1lOiBzdHJpbmc7IHBlcjogbnVtYmVyIH0gfCBudWxsIHtcbiAgcmV0dXJuIGJ5S2V5W3R5cGVdPy5wYWNrVW5pdCA/PyBudWxsO1xufVxuIl19
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtY2F0YWxvZy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL3F1b3RhLWNhdGFsb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQThKdEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUVyQjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUErQztJQUN2RSw0RUFBNEU7SUFDNUUsOEVBQThFO0lBQzlFLCtEQUErRDtJQUMvRCxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLHNDQUFzQyxFQUFFO0lBQ3RLLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSwrQkFBK0IsRUFBRTtJQUN4Syw2REFBNkQ7SUFDN0QsK0VBQStFO0lBQy9FLDJFQUEyRTtJQUMzRSxrRUFBa0U7SUFDbEUsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSx5REFBeUQsRUFBRTtJQUN4TCxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSx3RUFBd0UsRUFBRTtJQUM1TixPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLHVDQUF1QyxFQUFFO0lBQ25LLDhFQUE4RTtJQUM5RSx5RUFBeUU7SUFDekUsZ0ZBQWdGO0lBQ2hGLCtFQUErRTtJQUMvRSxnRkFBZ0Y7SUFDaEYsOEVBQThFO0lBQzlFLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsK0NBQStDLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDM04sNkVBQTZFO0lBQzdFLHlEQUF5RDtJQUN6RCxZQUFZLEVBQUUsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxtQ0FBbUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUMxTiw0RUFBNEU7SUFDNUUsNERBQTREO0lBQzVELFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsOEJBQThCLEVBQUU7SUFDbEssVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSwrQkFBK0IsRUFBRTtJQUNySyxpQkFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLHNDQUFzQyxFQUFFO0lBQ2pNLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLG9EQUFvRCxFQUFFO0lBQ3hNLDhFQUE4RTtJQUM5RSwrRUFBK0U7SUFDL0UsOEVBQThFO0lBQzlFLDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0UsOEVBQThFO0lBQzlFLHlEQUF5RDtJQUN6RCxFQUFFO0lBQ0YsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLG1CQUFtQjtJQUNuQixRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxvQ0FBb0MsRUFBRTtDQUNsTCxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBNEM7SUFDbkYsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSwrQkFBK0IsRUFBRTtDQUN0SixDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxLQUFLLEdBQThDO0lBQ3ZELEdBQUcsNEJBQTRCO0lBQy9CLEdBQUcsYUFBYTtDQUNqQixDQUFDO0FBWUYsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3JDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUM7QUFDcEMsQ0FBQztBQUtELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxJQUFZO0lBQzNDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsSUFBSSxJQUFJLENBQUM7QUFDMUMsQ0FBQztBQWNELE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBWTtJQUN0QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQVUsQ0FBQztBQUUxRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFhO0lBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdkQsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxLQUFLLElBQUksSUFBSSxDQUFDO1FBQ2QsQ0FBQyxFQUFFLENBQUM7SUFDTixDQUFDO0lBQ0QsT0FBTyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUN2RyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsS0FBYTtJQUMzRCxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pHLENBQUM7QUFTRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBWTtJQUMzQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLElBQUksU0FBUyxDQUFDO0FBQzVDLENBQUM7QUFRRCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQVk7SUFDdkMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLE1BQU0sQ0FBQztBQUN4QyxDQUFDO0FBS0QsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQVk7SUFDM0MsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQztBQUN4QyxDQUFDO0FBS0QsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFZO0lBQ3hDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBxdW90YS10eXBlIGRpc3BsYXkgY2F0YWxvZywgYXMgREFUQSBPTkxZIOKAlCB3aGF0IGEgcXVvdGEgaXMgQ0FMTEVEIGFuZCBob3dcbiAqIGl0cyBudW1iZXIgaXMgUkVOREVSRUQsIGZvciBldmVyeSBgUXVvdGFUeXBlYC5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgYW5kIGVudi1mcmVlIHNvIHRoZSBicm93c2VyIGltcG9ydHMgaXQgZGlyZWN0bHlcbiAqIChgQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUvcXVvdGEtY2F0YWxvZ2ApLiBJdHMgb25seSBpbXBvcnQgaXMgYSB0eXBlLCB3aGljaFxuICogaXMgZXJhc2VkIGF0IGNvbXBpbGUgdGltZSwgc28gbm90aGluZyBvZiB0aGUgc2VydmVyIGdyYXBoIHJlYWNoZXMgdGhlIGJ1bmRsZS5cbiAqXG4gKiBXSFkgSVQgRVhJU1RTLiBUaGUgc2FtZSBmYWN0cyB3ZXJlIHNwZWxsZWQgaW4gc2l4IHBsYWNlczogdGhpcyBwYWNrYWdlJ3NcbiAqIGBRVU9UQV9UWVBFX0xBQkVMU2AsIGFuZCBmaXZlIGluZGVwZW5kZW50IG1hcHMgaW4gdGhlIGZyb250ZW5kIOKAlCB0aGUgcHJlc3N1cmVcbiAqIGJhbm5lcidzIGxhYmVscywgdGhlIHF1b3RhcyBwYWdlJ3MgYFFVT1RBX01FVEFgLCB0aGUgb3JnIGhvbWUncyBgUVVPVEFfTEFCRUxTYCxcbiAqIHRoZSBiaWxsaW5nIHVzYWdlIGNhcmQncyBgUVVPVEFfTEFCRUxTYCAod2l0aCBpdHMgb3duIGJ5dGUgZmxhZyksIGFuZCB0aGVcbiAqIGFkZC1vbiBncmlkJ3MgYFBBQ0tfVU5JVFNgLiBFYWNoIGtuZXcgYSBzdWJzZXQsIGVhY2ggY291bGQgZHJpZnQsIGFuZCBhZGRpbmcgYVxuICogcXVvdGEgdHlwZSBtZWFudCBmaW5kaW5nIGFsbCBzaXguIGBQQUNLX1VOSVRTYCBoYWQgZXhhY3RseSBvbmUgbWVtYmVyLCBzbyB0aGVcbiAqIGFkZC1vbiBncmlkIHJlbmRlcmVkIGEgR0Igc3RlcCBmb3Igc3RvcmFnZSBhbmQgYSBiYXJlIHBhY2sgY291bnQgZm9yXG4gKiBldmVyeXRoaW5nIGVsc2Ug4oCUIG5vdCBhIGRlY2lzaW9uIGFueW9uZSByZXZpc2l0ZWQsIGp1c3QgdGhlIG9uZSBlbnRyeSBzb21lYm9keVxuICogbmVlZGVkIGF0IHRoZSB0aW1lLlxuICpcbiAqIEFkZCBhIHF1b3RhIHR5cGUgaGVyZSBhbmQgZXZlcnkgc3VyZmFjZSByZW5kZXJzIGl0OiBgUmVjb3JkPFF1b3RhVHlwZSwg4oCmPmBcbiAqIG1ha2VzIHRoZSBjb21waWxlciBkZW1hbmQgdGhlIGVudHJ5LCBzbyBub25lIG9mIHRoZSBzaXggY2FuIGJlIGZvcmdvdHRlblxuICogYWdhaW4uXG4gKlxuICogRVZFUlkgZGlzcGxheSBmYWN0IGxpdmVzIGhlcmUsIGluY2x1ZGluZyB0aGUgcGx1cmFsIGxhYmVsLiBBIGZpcnN0IGRyYWZ0IGtlcHRcbiAqIHBsdXJhbHMgaW4gYSBmcm9udGVuZCBoZWxwZXIgd2l0aCBhIGBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+YCBhbmQgYSBmYWxsYmFjayB0b1xuICogdGhlIHNpbmd1bGFyIOKAlCB3aGljaCB3b3VsZCBoYXZlIHJlbmRlcmVkIGEgbmV3IHF1b3RhIHR5cGUncyBwbHVyYWwgd3JvbmdseSBhbmRcbiAqIHNpbGVudGx5LCByZXByb2R1Y2luZyB0aGUgZXhhY3QgcGFydGlhbC1tYXAgdHJhcCB0aGlzIGZpbGUgcmVtb3Zlcy4gQSBmYWN0XG4gKiBzcGxpdCBhY3Jvc3MgdHdvIHBhY2thZ2VzIGlzIGEgZmFjdCB0aGF0IGRyaWZ0cy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFF1b3RhVHlwZSB9IGZyb20gJy4vY29tbW9uLmpzJztcblxuLyoqIEhvdyBhIHF1b3RhJ3MgdXNhZ2UgaXMgbGVhcm5lZDogaW5jcmVtZW50ZWQgYXMgaXQgaGFwcGVucywgb3IgcmVhZCBvbiBkZW1hbmQuICovXG5leHBvcnQgdHlwZSBRdW90YU9ic2VydmF0aW9uID1cbiAgLyoqIFRoZSBwbGF0Zm9ybSBpbmNyZW1lbnRzIGEgY291bnRlciBhcyB0aGUgd29yayBoYXBwZW5zLiAqL1xuICB8ICdtZXRlcmVkJ1xuICAvKiogTm90aGluZyBpbmNyZW1lbnRzOiB0aGUgZmlndXJlIGlzIHJlYWQgZnJvbSB0aGUgc3lzdGVtIG9mIHJlY29yZC4gKi9cbiAgfCAnbWVhc3VyZWQnO1xuXG4vKiogV2hldGhlciBhIHF1b3RhIHJlZmlsbHMgb24gdGhlIHBlcmlvZCBvciBwZXJzaXN0cyB1bnRpbCBzb21ldGhpbmcgY2hhbmdlcy4gKi9cbmV4cG9ydCB0eXBlIFF1b3RhQWNjcnVhbCA9XG4gIC8qKiBBIHBlci1wZXJpb2QgcmF0ZTogcmVzZXJ2ZWQgb24gdXNlLCB6ZXJvZWQgYXQgdGhlIHBlcmlvZCBib3VuZGFyeS4gKi9cbiAgfCAnZmxvdydcbiAgLyoqIEEgbGV2ZWwgdGhhdCBzdGF5cyB1bnRpbCB0aGUgdGVuYW50IGZyZWVzIGl0LiBObyByZXNldCwgbm8gZm9yZWNhc3QuICovXG4gIHwgJ3N0b2NrJztcblxuLyoqIEhvdyBhIHJhdyBxdW90YSBudW1iZXIgc2hvdWxkIGJlIHJlbmRlcmVkLiAqL1xuZXhwb3J0IHR5cGUgUXVvdGFSZW5kZXIgPVxuICAvKiogQSBwbGFpbiBpbnRlZ2VyIOKAlCBcIjQgLyAxMFwiLiAqL1xuICB8ICdjb3VudCdcbiAgLyoqIEEgYnl0ZSBjb3VudCDigJQgcmVuZGVyIHdpdGggYGZvcm1hdEJ5dGVzYCAoXCIxOC40IEdCXCIpLCBuZXZlciByYXcuICovXG4gIHwgJ2J5dGVzJztcblxuLyoqIFdoYXQgYSBzdXJmYWNlIG5lZWRzIHRvIGtub3cgdG8gc2hvdyBvbmUgcXVvdGEgdHlwZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUeXBlTWV0YSB7XG4gIC8qKlxuICAgKiBTSU5HVUxBUiBodW1hbiBsYWJlbCDigJQgdGhlIG9uZSBzcGVsbGluZyBldmVyeSA0MjkgYm9keSwgbm90aWZpY2F0aW9uIGFuZFxuICAgKiBkYXNoYm9hcmQgdXNlcyAoXCJBUEkgY2FsbCBxdW90YSByZWFjaGVkIOKAplwiKS5cbiAgICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQTFVSQUwgbGFiZWwsIGZvciBzdXJmYWNlcyB0aGF0IGxpc3QgZGltZW5zaW9ucyByYXRoZXIgdGhhbiBhZGRyZXNzIG9uZVxuICAgKiAoXCJBUEkgY2FsbHNcIiBvbiBhIHVzYWdlIGNhcmQsIGFnYWluc3QgXCJBUEkgY2FsbCBxdW90YSByZWFjaGVkXCIgaW4gYSA0MjkpLlxuICAgKlxuICAgKiBSRVFVSVJFRCwgYW5kIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIGZyb250ZW5kLCBiZWNhdXNlIHRoZSBmaXJzdCBkcmFmdCBwdXRcbiAgICogaXQgaW4gYSBgUmVjb3JkPHN0cmluZywgc3RyaW5nPmAgaGVscGVyIHRoYXQgZmVsbCBiYWNrIHRvIHRoZSBzaW5ndWxhciB3aGVuXG4gICAqIGEgdHlwZSB3YXMgbWlzc2luZyDigJQgc28gYSBuZXcgcXVvdGEgdHlwZSB3b3VsZCBoYXZlIHJlbmRlcmVkIFwiQnVpbGQgbWludXRlXCJcbiAgICogaW4gcGx1cmFsIGNvbnRleHRzLCB3cm9uZ2x5IGFuZCBzaWxlbnRseS4gVGhhdCBpcyB0aGUgc2FtZSBwYXJ0aWFsLW1hcCB0cmFwXG4gICAqIHRoaXMgY2F0YWxvZyBleGlzdHMgdG8gcmVtb3ZlLCBhbmQgYFJlY29yZDxRdW90YVR5cGUsIOKApj5gIGNsb3NlcyBpdCBvbmx5IGlmXG4gICAqIGV2ZXJ5IGRpc3BsYXkgZmFjdCBsaXZlcyBoZXJlLlxuICAgKi9cbiAgbGFiZWxQbHVyYWw6IHN0cmluZztcbiAgLyoqIEhvdyB0byByZW5kZXIgYSByYXcgdmFsdWUgZm9yIHRoaXMgdHlwZS4gKi9cbiAgcmVuZGVyOiBRdW90YVJlbmRlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBxdW90YSBSRUZJTExTIG9uIHRoZSBwZXJpb2QsIG9yIHBlcnNpc3RzIHVudGlsIHRoZSB0ZW5hbnRcbiAgICogY2hhbmdlcyBzb21ldGhpbmcuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIHNpbmdsZSBtb3N0IGxvYWQtYmVhcmluZyBzZW1hbnRpYyBkaWZmZXJlbmNlIGJldHdlZW4gcXVvdGFcbiAgICogdHlwZXMgYW5kIG5vdGhpbmcgY291bGQgcmVhZCBpdCBiZWZvcmU6IGEgc3VyZmFjZSBoYWQgdG8ga25vdywgYnkgaGFuZCxcbiAgICogdGhhdCBcInJlc2V0cyBpbiAyIGRheXNcIiBpcyB0cnVlIG9mIGBhcGlDYWxsc2AgYW5kIGZhbHNlIG9mIGBzdG9yYWdlQnl0ZXNgLlxuICAgKiBHZXR0aW5nIGl0IHdyb25nIGlzIG5vdCBjb3NtZXRpYyDigJQgdGhlIHF1b3RhcyBwYWdlIHRvbGQgYW4gb3JnYW5pemF0aW9uIGl0c1xuICAgKiByZWdpc3RyeSBzdG9yYWdlIHdvdWxkIHJlc2V0LCB3aGljaCBpcyB0aGUgb3Bwb3NpdGUgb2YgdGhlIG9uZSB0aGluZyBpdFxuICAgKiBuZWVkcyB0byB1bmRlcnN0YW5kIGFib3V0IHN0b3JhZ2UuXG4gICAqXG4gICAqIC0gYGZsb3dgIOKAlCBhIHBlci1wZXJpb2QgcmF0ZSwgcmVzZXJ2ZWQgb24gY3JlYXRlL2J1aWxkIGFuZCB6ZXJvZWQgYXQgdGhlXG4gICAqICAgYm91bmRhcnkuIEhpdHRpbmcgaXQgaXMgdGVtcG9yYXJ5IGFuZCB0aGUgYWNjb3VudCBzZWxmLWhlYWxzLiBUaGUgcGVyaW9kIGlzXG4gICAqICAgUEVSIFRZUEUgcmF0aGVyIHRoYW4gZ2xvYmFsOiBgUVVPVEFfUkVTRVRfREFZU2AgKDMgZGF5cykgZm9yIGV2ZXJ5IGZsb3cgYnV0XG4gICAqICAgYGNwdUNyZWRpdHNgLCB3aGljaCBpcyBtb250aGx5LiBSZWFkIGl0IHRocm91Z2ggYHF1b3RhUGVyaW9kRGF5c2AgYW5kIG5ldmVyXG4gICAqICAgYXNzdW1lIHRoZSBnbG9iYWwg4oCUIGEgZm9yZWNhc3Qgb3IgYSBcInJlc2V0cyBpbiBOIGRheXNcIiBsaW5lIGNvbXB1dGVkXG4gICAqICAgYWdhaW5zdCB0aGUgd3Jvbmcgd2luZG93IGlzIHdyb25nIGJ5IGEgZmFjdG9yIG9mIHRlbiBmb3IgY3JlZGl0cy5cbiAgICogLSBgc3RvY2tgIOKAlCBhIGxldmVsLCBub3QgYSByYXRlLiBJdCBzdGF5cyB3aGVyZSBpdCBpcyB1bnRpbCBieXRlcyBhcmUgZnJlZWRcbiAgICogICBvciByb3dzIGFyZSBkZWxldGVkLCBzbyBhIHJlc2V0IGRhdGUsIGEgXCJyZXNldHMgaW4gTiBkYXlzXCIgbGluZSBhbmQgYVxuICAgKiAgIGJ1cm4tcmF0ZSBmb3JlY2FzdCBhcmUgYWxsIG1lYW5pbmdsZXNzIGZvciBpdC4gYHN0b3JhZ2VCeXRlc2AgaXMgbWVhc3VyZWQ7XG4gICAqICAgdGhlIHJlc291cmNlLWNvdW50IGNhcHMgYXJlIGNvdW50ZWQgYXQgY3JlYXRlIHRpbWUgYW5kIGRlY3JlbWVudGVkIG9uXG4gICAqICAgZGVsZXRlOyBgbGlzdGluZ3NgIGNvdW50cyBhY3RpdmUgcHVibGljYXRpb25zLlxuICAgKlxuICAgKiBUaGUge0BsaW5rIFF1b3RhVHlwZU1ldGEuZGVzY3JpcHRpb259IHdvcmRpbmcgZm9sbG93cyBmcm9tIHRoaXMgKFwidGhpc1xuICAgKiBwZXJpb2RcIiBhZ2FpbnN0IFwiY3VycmVudGx5XCIpLCBhbmQgYSB0ZXN0IGhvbGRzIHRoZSB0d28gaW4gYWdyZWVtZW50LlxuICAgKi9cbiAgYWNjcnVhbDogUXVvdGFBY2NydWFsO1xuICAvKipcbiAgICogSG93IHVzYWdlIGlzIE9CU0VSVkVEIOKAlCB3aGljaCBpcyBhIGRpZmZlcmVudCBxdWVzdGlvbiBmcm9tIHdoZXRoZXIgdGhlXG4gICAqIHF1b3RhIHJlZmlsbHMsIGFuZCB0aGUgdHdvIGRvIG5vdCBsaW5lIHVwLlxuICAgKlxuICAgKiAtIGBtZXRlcmVkYCDigJQgdGhlIHBsYXRmb3JtIElOQ1JFTUVOVFMgYSBjb3VudGVyIGFzIHRoZSB3b3JrIGhhcHBlbnMuIEV2ZXJ5XG4gICAqICAgcXVvdGEgYnV0IG9uZSwgaW5jbHVkaW5nIHRoZSBjcmVhdGUtdGltZSBjb3VudHMgdGhhdCBhcmUgc3RvY2tzXG4gICAqICAgKGBkYXNoYm9hcmRzYCwgYGxpc3RpbmdzYCwg4oCmKS5cbiAgICogLSBgbWVhc3VyZWRgIOKAlCBub3RoaW5nIGluY3JlbWVudHMgYW55dGhpbmc7IHRoZSBmaWd1cmUgaXMgUkVBRCBmcm9tIHRoZVxuICAgKiAgIHN5c3RlbSBvZiByZWNvcmQgb24gZGVtYW5kLiBgc3RvcmFnZUJ5dGVzYCBvbmx5OiB0aGUgcmVnaXN0cnkgd2Fsa3MgaXRzXG4gICAqICAgb3duIGNhdGFsb2csIHdoaWNoIGlzIHdoeSBpdCBpcyBcInRoZSBvbmUgcXVvdGEgbm90aGluZyBpbmNyZW1lbnRzXCIuXG4gICAqXG4gICAqIEl0IGRlY2lkZXMgd2hpY2ggY29kZSBwYXRoIG1heSBsZWdpdGltYXRlbHkgbm90aWZ5IGFib3V0IGEgcXVvdGEuIEEgc3RvcmFnZVxuICAgKiBub3RpY2UgYXJyaXZpbmcgZnJvbSB0aGUgaW5jcmVtZW50IHBhdGggY291bGQgb25seSBiZSBhIGJ1ZywgYW5kIGFcbiAgICogYGxpc3RpbmdzYCBub3RpY2UgYXJyaXZpbmcgZnJvbSBhIHN3ZWVwIGxpa2V3aXNlIOKAlCBjb25mbGF0aW5nIHRoaXMgd2l0aFxuICAgKiB7QGxpbmsgYWNjcnVhbH0gd291bGQgaGF2ZSBzaWxlbmNlZCBldmVyeSBjcmVhdGUtdGltZSBjb3VudCBxdW90YSwgYmVjYXVzZVxuICAgKiB0aG9zZSBhcmUgc3RvY2tzIHRoYXQgYXJlIG5vbmV0aGVsZXNzIG1ldGVyZWQuXG4gICAqL1xuICBvYnNlcnZlZDogUXVvdGFPYnNlcnZhdGlvbjtcbiAgLyoqXG4gICAqIFdoYXQgdGhpcyBjb3VudGVyIGFjdHVhbGx5IGNvdW50cywgaW4gb25lIHNob3J0IHBocmFzZSDigJQgdGhlIGFuc3dlciB0byBcImFtIElcbiAgICogc3BlbmRpbmcgdGhpcyBvbmU/XCIuXG4gICAqXG4gICAqIFJFUVVJUkVELCBhbmQgYSBkaXNwbGF5IEZBQ1QgcmF0aGVyIHRoYW4gcGFnZSBjb3B5LCB3aGljaCBpcyB0aGUgY2FsbCBhXG4gICAqIGZpcnN0IHBhc3MgZ290IHdyb25nIGJ5IGp1ZGdpbmcgdGhlIGZpZWxkJ3MgbmFtZSBpbnN0ZWFkIG9mIGl0cyBjb250ZW50LiBJdFxuICAgKiBoYWQgYmVlbiBsZWZ0IGluIGEgZnJvbnRlbmQgYFJlY29yZDxEaXNwbGF5ZWRRdW90YVR5cGUsIHN0cmluZz5gIG9uIHRoZVxuICAgKiByZWFzb25pbmcgdGhhdCBkZXNjcmlwdGlvbnMgYXJlIGEgcGFnZSdzIG93biB2b2ljZS4gVGhleSBhcmUgbm90OiBlYWNoIG9mXG4gICAqIHRoZXNlIGFuc3dlcnMgYSBxdWVzdGlvbiB3aG9zZSBhbnN3ZXIgaXMgdGhlIHNhbWUgb24gZXZlcnkgc3VyZmFjZSwgYW5kIHR3b1xuICAgKiBzdXJmYWNlcyBkaXNhZ3JlZWluZyBpcyBhIGJ1Zywgbm90IGEgZGlmZmVyZW5jZSBpbiB0b25lLiBUd28gb2YgdGhlIGZpdmVcbiAgICogbG9jYWwgY29waWVzIGhhZCBhbHJlYWR5IGRyaWZ0ZWQg4oCUIGBhdXRvbWF0aW9uQ2FsbHNgIG9taXR0ZWQgcGVyc29uYWxcbiAgICogYWNjZXNzIGtleXMgKHNvIGEgUEFUIGhvbGRlciByZWFkIHRoZSBwYWdlIGFuZCBjb25jbHVkZWQgdGhleSB3ZXJlIHNwZW5kaW5nXG4gICAqIGBhcGlDYWxsc2ApLCBhbmQgYHBsdWdpbnNgL2BwaXBlbGluZXNgIHdlcmUgcGhyYXNlZCBhcyBzdG9ja3MuXG4gICAqXG4gICAqIFRoZSB0ZXN0IGlzIHdoZXRoZXIgYGRvY3MvcXVvdGFzLm1kYCBhbmQgdGhpcyBzdHJpbmcgY2FuIGxlZ2l0aW1hdGVseVxuICAgKiBkaWZmZXIuIEZvciB0aGVzZSwgbm8uIEZvciBhIHRpZXIncyBwb3NpdGlvbmluZyBsaW5lIChcIlN0YXJ0ZXIgdGllclwiKSBvciB0aGVcbiAgICogcXVvdGFzIHBhZ2UncyBwb29saW5nIGV4cGxhbmF0aW9uLCB5ZXMg4oCUIHRob3NlIHN0YXkgaW4gdGhlIHBhZ2UsIGV4YWN0bHkgYXNcbiAgICogYFRJRVJfTUVUQWAgYWxyZWFkeSBzcGxpdHMgYSB0aWVyJ3MgbGFiZWwgZnJvbSBpdHMgc2FsZXMgY29weS5cbiAgICpcbiAgICogUGhyYXNpbmcgZm9sbG93cyB0aGUgU0VNQU5USUNTIGluIHtAbGluayBRdW90YVR5cGV9J3Mgb3duIGRvY3VtZW50YXRpb24sIG5vdFxuICAgKiBhIGhvdXNlIHN0eWxlOiBcInRoaXMgcGVyaW9kXCIgZm9yIHRoZSBwZXItcGVyaW9kIGZsb3dzLCBcImN1cnJlbnRseVwiIGZvciB0aGVcbiAgICogY3JlYXRlLXRpbWUgY291bnRzIHRoYXQgZGVjcmVtZW50IG9uIGRlbGV0ZSwgYW5kIG5laXRoZXIgZm9yIHRoZSBtZWFzdXJlZFxuICAgKiBzdG9yYWdlIHRvdGFsLlxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1bml0IGFuIEFERC1PTiBQQUNLIG9mIHRoaXMgcXVvdGEgaXMgdHlwZWQgaW4sIGFuZCB0aGUgZGl2aXNvciBmcm9tIHRoZVxuICAgKiByYXcgZ3JhbnQgdG8gdGhhdCB1bml0IOKAlCBzbyBhICsxMCBHQiBzdG9yYWdlIHBhY2sgb2ZmZXJzIGEgR0Igc3RlcCByYXRoZXJcbiAgICogdGhhbiBhIHBhY2sgY291bnQuXG4gICAqXG4gICAqIEFic2VudCBtZWFucyBcInR5cGUgcGFjayBjb3VudHNcIiwgd2hpY2ggaXMgcmlnaHQgd2hlcmUgdGhlIHF1b3RhIGhhcyBub1xuICAgKiBuYXR1cmFsIHVuaXQ6IFwiMSBwYWNrIG9mIEFQSSBjYWxsc1wiIHJlYWRzIGJldHRlciB0aGFuIFwiMjUwMDAgY2FsbHNcIi4gVGhlXG4gICAqIHN0ZXAgaXRzZWxmIGlzIGFsd2F5cyBkZXJpdmVkIGZyb20gdGhlIGJ1bmRsZSdzIG93biBgZ3JhbnRzYCwgbmV2ZXIgZnJvbSBhXG4gICAqIGNvbnN0YW50IGhlcmUsIGJlY2F1c2UgYSBncmFudCBpcyBlbnYtb3ZlcnJpZGFibGUuXG4gICAqL1xuICBwYWNrVW5pdD86IHsgbmFtZTogc3RyaW5nOyBwZXI6IG51bWJlciB9O1xufVxuXG5jb25zdCBHQiA9IDEwMjQgKiogMztcblxuLyoqXG4gKiBEaXNwbGF5IG1ldGFkYXRhIGZvciBldmVyeSBxdW90YSB0eXBlLiBMYWJlbHMgYXJlIHRoZSBjYW5vbmljYWwgb25lcyDigJQgdGhlXG4gKiBzdHJpbmdzIGhlcmUgYXJlIHVzZXItZmFjaW5nIGFuZCBhcmUgcmVsaWVkIG9uIGJ5IDQyOSBib2RpZXMgYW5kIG5vdGljZXMsIHNvXG4gKiB0aGV5IGNoYW5nZSBvbmx5IGRlbGliZXJhdGVseS5cbiAqL1xuZXhwb3J0IGNvbnN0IFFVT1RBX0NBVEFMT0c6IFJlYWRvbmx5PFJlY29yZDxRdW90YVR5cGUsIFF1b3RhVHlwZU1ldGE+PiA9IHtcbiAgLy8gUGVyLXBlcmlvZCBGTE9XUyDigJQgYSBjcmVhdGlvbiByYXRlLCBub3QgYSBzdG9jay4gRGVsZXRpbmcgdGhlIGVudGl0eSBkb2VzXG4gIC8vIG5vdCBnaXZlIHRoZSBzbG90IGJhY2sgKGBkZWNyZW1lbnQtb24tZGVsZXRlYCB3YXMgY29uc2lkZXJlZCBhbmQgcmVqZWN0ZWQpLFxuICAvLyBzbyB0aGUgd29yZGluZyBzYXlzIFwidGhpcyBwZXJpb2RcIiB0byBzdG9wIHRoZSBzdG9jayByZWFkaW5nLlxuICBwbHVnaW5zOiB7IGxhYmVsOiAnUGx1Z2luIGJ1aWxkJywgbGFiZWxQbHVyYWw6ICdQbHVnaW5zJywgcmVuZGVyOiAnY291bnQnLCBhY2NydWFsOiAnZmxvdycsIG9ic2VydmVkOiAnbWV0ZXJlZCcsIGRlc2NyaXB0aW9uOiAnUGx1Z2luIHZlcnNpb25zIGRlcGxveWVkIHRoaXMgcGVyaW9kJyB9LFxuICBwaXBlbGluZXM6IHsgbGFiZWw6ICdQaXBlbGluZSBjcmVhdGlvbicsIGxhYmVsUGx1cmFsOiAnUGlwZWxpbmVzJywgcmVuZGVyOiAnY291bnQnLCBhY2NydWFsOiAnZmxvdycsIG9ic2VydmVkOiAnbWV0ZXJlZCcsIGRlc2NyaXB0aW9uOiAnUGlwZWxpbmVzIGNyZWF0ZWQgdGhpcyBwZXJpb2QnIH0sXG4gIC8vIFRoZSBjYWxsIGJ1ZGdldHMuIFdISUNIIE9ORSBhIHJlcXVlc3Qgc3BlbmRzIGlzIGRlY2lkZWQgYnlcbiAgLy8gYG1ldGVyZWRRdW90YVR5cGVGb3JgLCBuZXZlciBieSB0aGUgcm91dGU6IGEgc2VydmljZS1hY2NvdW50IGtleSwgYSBQRVJTT05BTFxuICAvLyBBQ0NFU1Mga2V5IChgdG9rZW5fdXNlOiAnYXBpX2tleSdgKSBvciBhbnl0aGluZyBtaW50ZWQgd2hpbGUgaG9sZGluZyBvbmVcbiAgLy8gKGBwYXJlbnRLZXlJZGApIHNwZW5kcyBgYXV0b21hdGlvbkNhbGxzYCBJTlNURUFEIG9mIGBhcGlDYWxsc2AuXG4gIGFwaUNhbGxzOiB7IGxhYmVsOiAnQVBJIGNhbGwnLCBsYWJlbFBsdXJhbDogJ0FQSSBjYWxscycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ1JlcXVlc3RzIG1hZGUgYnkgcGVvcGxlIGluIGJyb3dzZXIgc2Vzc2lvbnMgdGhpcyBwZXJpb2QnIH0sXG4gIGF1dG9tYXRpb25DYWxsczogeyBsYWJlbDogJ0F1dG9tYXRpb24gY2FsbCcsIGxhYmVsUGx1cmFsOiAnQXV0b21hdGlvbiBjYWxscycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ1JlcXVlc3RzIG1hZGUgd2l0aCBzZXJ2aWNlLWFjY291bnQgb3IgcGVyc29uYWwgYWNjZXNzIGtleXMgdGhpcyBwZXJpb2QnIH0sXG4gIGFpQ2FsbHM6IHsgbGFiZWw6ICdBSSBjYWxsJywgbGFiZWxQbHVyYWw6ICdBSSBjYWxscycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ0FJIGdlbmVyYXRpb24gaW52b2NhdGlvbnMgdGhpcyBwZXJpb2QnIH0sXG4gIC8vIFRoZSBvbmUgZmxvdyBxdW90YSBvbiBhIHBlcmlvZCBvZiBpdHMgT1dOIOKAlCBhIE1PTlRILCB3aGVyZSBldmVyeSBvdGhlciBmbG93XG4gIC8vIHJvbGxzIG9uIFFVT1RBX1JFU0VUX0RBWVMgKDMgZGF5cykuIFJlbmRlcmVkIGFzIGEgQ09VTlQgYW5kIG5ldmVyIGFzIGFcbiAgLy8gZHVyYXRpb246IHRoZSB1bml0IGlzIGFuIGFic3RyYWN0IGNyZWRpdCBwcmVjaXNlbHkgc28gaXQgY2Fubm90IGJlIG1pc3JlYWQgYXNcbiAgLy8gd2FsbC1jbG9jayAoXCIxMSwyNTAgYnVpbGQgbWludXRlc1wiIHJlYWRzIGFzIDE4NyBob3VycyB3aGVuIGl0IGJ1eXMgMTI1KSwgYW5kXG4gIC8vIGZvcm1hdHRpbmcgaXQgYmFjayBpbnRvIFwiMTg3aCAzMG1cIiB3b3VsZCB1bmRvIHRoYXQuIFRoZSB3YWxsLWNsb2NrIGNvbnZlcnNpb25cbiAgLy8gYmVsb25ncyBpbiB0aGUgcHJlLWJ1aWxkIGNvc3QgaGludCwgd2hlcmUgaXQgZXhwbGFpbnMgcmF0aGVyIHRoYW4gbWlzbGVhZHMuXG4gIGNwdUNyZWRpdHM6IHsgbGFiZWw6ICdDUFUgY3JlZGl0JywgbGFiZWxQbHVyYWw6ICdDUFUgY3JlZGl0cycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ2Zsb3cnLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ3ZDUFUtbWludXRlcyBvZiBidWlsZCBjb21wdXRlIHVzZWQgdGhpcyBtb250aCcsIHBhY2tVbml0OiB7IG5hbWU6ICdjcmVkaXRzJywgcGVyOiAxIH0gfSxcbiAgLy8gQSBNRUFTVVJFRCB0b3RhbCwgcmVjb21wdXRlZCBvbiBkZW1hbmQgcmF0aGVyIHRoYW4gY291bnRlZCDigJQgdGhlIG9uZSBxdW90YVxuICAvLyB0aGF0IGlzIG5laXRoZXIgYSBwZXJpb2QgZmxvdyBub3IgYSBjcmVhdGUtdGltZSBjb3VudC5cbiAgc3RvcmFnZUJ5dGVzOiB7IGxhYmVsOiAnUmVnaXN0cnkgc3RvcmFnZScsIGxhYmVsUGx1cmFsOiAnUmVnaXN0cnkgc3RvcmFnZScsIHJlbmRlcjogJ2J5dGVzJywgYWNjcnVhbDogJ3N0b2NrJywgb2JzZXJ2ZWQ6ICdtZWFzdXJlZCcsIGRlc2NyaXB0aW9uOiAnUmVnaXN0cnkgc3RvcmFnZSBjdXJyZW50bHkgaW4gdXNlJywgcGFja1VuaXQ6IHsgbmFtZTogJ0dCJywgcGVyOiBHQiB9IH0sXG4gIC8vIFJlc291cmNlLWNvdW50IGNhcHM6IGNvdW50ZWQgYXQgY3JlYXRlIHRpbWUgYW5kIERFQ1JFTUVOVEVEIG9uIGRlbGV0ZSwgc29cbiAgLy8gdGhlc2UgcmVhbGx5IGFyZSBzdG9ja3MgYW5kIFwidGhpcyBwZXJpb2RcIiB3b3VsZCBiZSB3cm9uZy5cbiAgZGFzaGJvYXJkczogeyBsYWJlbDogJ0Rhc2hib2FyZCcsIGxhYmVsUGx1cmFsOiAnRGFzaGJvYXJkcycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ3N0b2NrJywgb2JzZXJ2ZWQ6ICdtZXRlcmVkJywgZGVzY3JpcHRpb246ICdEYXNoYm9hcmRzIGN1cnJlbnRseSBkZWZpbmVkJyB9LFxuICBhbGVydFJ1bGVzOiB7IGxhYmVsOiAnQWxlcnQgcnVsZScsIGxhYmVsUGx1cmFsOiAnQWxlcnQgcnVsZXMnLCByZW5kZXI6ICdjb3VudCcsIGFjY3J1YWw6ICdzdG9jaycsIG9ic2VydmVkOiAnbWV0ZXJlZCcsIGRlc2NyaXB0aW9uOiAnQWxlcnQgcnVsZXMgY3VycmVudGx5IGRlZmluZWQnIH0sXG4gIGFsZXJ0RGVzdGluYXRpb25zOiB7IGxhYmVsOiAnQWxlcnQgZGVzdGluYXRpb24nLCBsYWJlbFBsdXJhbDogJ0FsZXJ0IGRlc3RpbmF0aW9ucycsIHJlbmRlcjogJ2NvdW50JywgYWNjcnVhbDogJ3N0b2NrJywgb2JzZXJ2ZWQ6ICdtZXRlcmVkJywgZGVzY3JpcHRpb246ICdBbGVydCBkZXN0aW5hdGlvbnMgY3VycmVudGx5IGRlZmluZWQnIH0sXG4gIGlkcENvbmZpZ3M6IHsgbGFiZWw6ICdJZFAgY29uZmlndXJhdGlvbicsIGxhYmVsUGx1cmFsOiAnSWRQIGNvbmZpZ3VyYXRpb25zJywgcmVuZGVyOiAnY291bnQnLCBhY2NydWFsOiAnc3RvY2snLCBvYnNlcnZlZDogJ21ldGVyZWQnLCBkZXNjcmlwdGlvbjogJ0lkZW50aXR5LXByb3ZpZGVyIGNvbmZpZ3VyYXRpb25zIGN1cnJlbnRseSBkZWZpbmVkJyB9LFxuICAvLyBNRUFTVVJFRCwgbm90IG1ldGVyZWQg4oCUIHRoZSBsYWJlbCB3YXMgd3JvbmcsIG5vdCB0aGUgYmVoYXZpb3VyLiBOb3RoaW5nIGhhc1xuICAvLyBldmVyIGluY3JlbWVudGVkIGEgYGxpc3RpbmdzYCBjb3VudGVyOiBlbmZvcmNlbWVudCByZWFkcyB0aGUgbGl2ZSBjb3VudCBmcm9tXG4gIC8vIHRoZSBwbHVnaW4gc2VydmljZSdzIG93biByb3dzIChgbGlzdGluZ3MuY291bnRBY3RpdmVgKSwgd2hpY2ggSVMgdGhlIHN5c3RlbVxuICAvLyBvZiByZWNvcmQgZm9yIHdoYXQgYSBwdWJsaXNoZXIgaGFzIGxpc3RlZC4gRGVjbGFyaW5nIGl0IGBtZXRlcmVkYCBtZWFudCB0aGVcbiAgLy8gZGFzaGJvYXJkIHNob3dlZCBcIjAgb2YgTlwiIGZvcmV2ZXIgYW5kIHRoZSA4MCUvMTAwJSB0aHJlc2hvbGQgbm90aWNlcyBjb3VsZFxuICAvLyBuZXZlciBmaXJlLCBiZWNhdXNlIGB0aHJlc2hvbGQtbm90aWZpZXJgIGRyb3BzIGFueSBub3RpY2Ugd2hvc2Ugc291cmNlIGRvZXNcbiAgLy8gbm90IG1hdGNoIGBvYnNlcnZlZGAgYW5kIG5vIGluY3JlbWVudCB3YXMgZXZlciBjb21pbmcuXG4gIC8vXG4gIC8vIFdpcmluZyBhbiBpbmNyZW1lbnQgaW5zdGVhZCB3b3VsZCBoYXZlIGJlZW4gdGhlIHdyb25nIHJlcGFpcjogaXQgY3JlYXRlcyBhXG4gIC8vIFNFQ09ORCBudW1iZXIgZm9yIGEgZmFjdCB0aGUgcGx1Z2luIHNlcnZpY2UgYWxyZWFkeSBvd25zIGV4YWN0bHksIGFuZCB0aGVcbiAgLy8gdHdvIHRoZW4gZHJpZnQgb24gZXZlcnkgeWFuaywgdHJhbnNmZXIsIHN1c3BlbnNpb24gYW5kIHB1cmdlIHRoYXQgZG9lcyBub3RcbiAgLy8gcmVtZW1iZXIgdG8gZGVjcmVtZW50LiBTYW1lIHNoYXBlIGFzIGBzdG9yYWdlQnl0ZXNgLCB3aGljaCBpcyBtZWFzdXJlZCBmb3JcbiAgLy8gdGhlIHNhbWUgcmVhc29uLlxuICBsaXN0aW5nczogeyBsYWJlbDogJ1BsdWdpbiBsaXN0aW5nJywgbGFiZWxQbHVyYWw6ICdQbHVnaW4gbGlzdGluZ3MnLCByZW5kZXI6ICdjb3VudCcsIGFjY3J1YWw6ICdzdG9jaycsIG9ic2VydmVkOiAnbWVhc3VyZWQnLCBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBwbHVnaW4gbGlzdGluZ3MgeW91IHB1Ymxpc2gnIH0sXG59O1xuXG4vKipcbiAqIENvbnN1bWFibGVzIHRoYXQgYXJlIE5PVCBxdW90YSB0eXBlcyBidXQgcmVuZGVyIGJlc2lkZSB0aGVtIOKAlCBzYW1lIGxhYmVsLFxuICogc2FtZSBiYXIsIHNhbWUgY2FyZC5cbiAqXG4gKiBgc2VhdHNgIGlzIHRoZSBvbmx5IG9uZTogaXQgaXMgYSBTVE9DSyAoaG93IG1hbnkgcGVvcGxlIG1heSBiZSBvbiB0aGVcbiAqIGFjY291bnQpIHJhdGhlciB0aGFuIGEgcGVyLXBlcmlvZCBmbG93LCBzbyBpdCBpcyBkZWxpYmVyYXRlbHkgb3V0c2lkZVxuICogYFF1b3RhVHlwZWAgYW5kIGlzIHNvdXJjZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBxdW90YSByb2xsdXAuIEJ1dCB0aGUgYmlsbGluZ1xuICogdXNhZ2UgY2FyZCBkcmF3cyBpdCBpbiB0aGUgc2FtZSBsaXN0LCBhbmQgYmVmb3JlIHRoaXMgZW50cnkgZXhpc3RlZCB0aGF0IG9uZVxuICogcm93IGNhcnJpZWQgaXRzIG93biBpbmxpbmUgXCJTZWF0c1wiIGxhYmVsIHdoaWxlIHRoZSBmaXZlIGJlc2lkZSBpdCBjYW1lIGZyb21cbiAqIHRoZSBjYXRhbG9nIOKAlCB0aGUgcHJlY2lzZSBzcGxpdC1mYWN0IGRyaWZ0IHRoaXMgZmlsZSBleGlzdHMgdG8gcmVtb3ZlLlxuICpcbiAqIEtlZXAgdGhpcyBmb3IgdGhpbmdzIHJlbmRlcmVkIEFTIGEgY29uc3VtYWJsZS4gSXQgaXMgbm90IGEgYmFjayBkb29yIGZvclxuICogcXVvdGEgdHlwZXM6IGEgcmVhbCBxdW90YSBiZWxvbmdzIGluIHtAbGluayBRVU9UQV9DQVRBTE9HfSwgd2hlcmVcbiAqIGBSZWNvcmQ8UXVvdGFUeXBlLCDigKY+YCBmb3JjZXMgdGhlIGVudHJ5LlxuICovXG5leHBvcnQgY29uc3QgTk9OX1FVT1RBX0NPTlNVTUFCTEVfQ0FUQUxPRzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUXVvdGFUeXBlTWV0YT4+ID0ge1xuICBzZWF0czogeyBsYWJlbDogJ1NlYXQnLCBsYWJlbFBsdXJhbDogJ1NlYXRzJywgcmVuZGVyOiAnY291bnQnLCBhY2NydWFsOiAnc3RvY2snLCBvYnNlcnZlZDogJ21lYXN1cmVkJywgZGVzY3JpcHRpb246ICdNZW1iZXJzIHRoaXMgYWNjb3VudCBtYXkgaGF2ZScgfSxcbn07XG5cbi8qKlxuICogRXZlcnkgZGVzY3JpYmVkIGNvbnN1bWFibGUsIHdpZGVuZWQgZm9yIGxvb2t1cHMgYnkgYSB2YWx1ZSB0aGF0IGNhbWUgb2ZmIHRoZVxuICogd2lyZS5cbiAqL1xuY29uc3QgYnlLZXk6IFJlY29yZDxzdHJpbmcsIFF1b3RhVHlwZU1ldGEgfCB1bmRlZmluZWQ+ID0ge1xuICAuLi5OT05fUVVPVEFfQ09OU1VNQUJMRV9DQVRBTE9HLFxuICAuLi5RVU9UQV9DQVRBTE9HLFxufTtcblxuLyoqXG4gKiBUaGlzIHR5cGUncyBzaW5ndWxhciBsYWJlbCwgb3IgdGhlIHJhdyBrZXkgZm9yIGEgdmFsdWUgb3V0c2lkZSB0aGUgY2F0YWxvZy5cbiAqXG4gKiBUaGUgYWNjZXNzb3JzIHRha2UgYHN0cmluZ2AgYmVjYXVzZSB0aGUgcXVvdGEgdHlwZSBvZnRlbiBhcnJpdmVzIGZyb20gdGhlIHdpcmVcbiAqIChhIDQyOSBib2R5LCBhIHF1b3RhIHJlc3BvbnNlKSB3aGVyZSBhbiB1bmtub3duIHZhbHVlIG11c3QgcmVuZGVyIGFzIHNvbWV0aGluZ1xuICogcmF0aGVyIHRoYW4gY3Jhc2ggYSBwYWdlLiBUaGUgYFF1b3RhVHlwZWAgb3ZlcmxvYWQgaXMgZm9yIGludGVybmFsIGNhbGxlcnM6IGl0XG4gKiBtYWtlcyBhIHR5cG8gYSBjb21waWxlIGVycm9yIGluc3RlYWQgb2YgYSBrZXkgcmVuZGVyZWQgYXMgYSBsYWJlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhTGFiZWwodHlwZTogUXVvdGFUeXBlKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhTGFiZWwodHlwZTogc3RyaW5nKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhTGFiZWwodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ5S2V5W3R5cGVdPy5sYWJlbCA/PyB0eXBlO1xufVxuXG4vKiogVGhpcyB0eXBlJ3MgUExVUkFMIGxhYmVsLCBvciB0aGUgcmF3IGtleSBmb3IgYSB2YWx1ZSBvdXRzaWRlIHRoZSBjYXRhbG9nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhTGFiZWxQbHVyYWwodHlwZTogUXVvdGFUeXBlKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhTGFiZWxQbHVyYWwodHlwZTogc3RyaW5nKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhTGFiZWxQbHVyYWwodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ5S2V5W3R5cGVdPy5sYWJlbFBsdXJhbCA/PyB0eXBlO1xufVxuXG4vKipcbiAqIEhvdyB0byByZW5kZXIgdGhpcyB0eXBlJ3MgdmFsdWVzLiBgY291bnRgIGZvciBhbnl0aGluZyB0aGUgY2F0YWxvZyBkb2VzIG5vdFxuICoga25vdywgc28gYW4gdW5mYW1pbGlhciB3aXJlIHZhbHVlIHJlbmRlcnMgYXMgYSBwbGFpbiBudW1iZXIuXG4gKlxuICogUmVhZCBUSElTIHJhdGhlciB0aGFuIGFza2luZyBcImlzIGl0IGJ5dGVzP1wiLiBBIGJvb2xlYW4gaGVscGVyIGRlZ3JhZGVzXG4gKiBzaWxlbnRseSB0aGUgbW9tZW50IHtAbGluayBRdW90YVJlbmRlcn0gZ3Jvd3MgYSB0aGlyZCBtZW1iZXIg4oCUIGEgbmV3IG1vZGVcbiAqIHdvdWxkIHNpbXBseSByZW5kZXIgYXMgYSBjb3VudCwgd2l0aCBub3RoaW5nIGZhaWxpbmcg4oCUIHdoZXJlYXMgYSBjYWxsZXIgdGhhdFxuICogc3dpdGNoZXMgb24gdGhpcyB2YWx1ZSBleGhhdXN0aXZlbHkgc3RvcHMgY29tcGlsaW5nIHVudGlsIGl0IGhhbmRsZXMgdGhlIG5ld1xuICogbW9kZS4gVGhhdCBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhlIGNhdGFsb2csIGFwcGxpZWQgdG8gaXRzIG93biBhY2Nlc3NvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90YVJlbmRlcih0eXBlOiBRdW90YVR5cGUpOiBRdW90YVJlbmRlcjtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YVJlbmRlcih0eXBlOiBzdHJpbmcpOiBRdW90YVJlbmRlcjtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YVJlbmRlcih0eXBlOiBzdHJpbmcpOiBRdW90YVJlbmRlciB7XG4gIHJldHVybiBieUtleVt0eXBlXT8ucmVuZGVyID8/ICdjb3VudCc7XG59XG5cbmNvbnN0IEJZVEVfVU5JVFMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInXSBhcyBjb25zdDtcblxuLyoqXG4gKiBBIGJ5dGUgY291bnQgYXMgYSBodW1hbiBhbW91bnQg4oCUIGAxLjUgR0JgLCBgNTEyIE1CYCwgYDAgQmAuXG4gKlxuICogVGhlIE9ORSBpbXBsZW1lbnRhdGlvbjogdGhlIGZyb250ZW5kJ3MgYGZvcm1hdEJ5dGVzYCBkZWxlZ2F0ZXMgaGVyZSByYXRoZXJcbiAqIHRoYW4ga2VlcGluZyBpdHMgb3duIGNvcHksIHNvIGEgc3RvcmFnZSBmaWd1cmUgcmVhZHMgaWRlbnRpY2FsbHkgaW4gYSBxdW90YVxuICogbm90aWNlLCBhIDQwMyBleHBsYW5hdGlvbiBhbmQgdGhlIGRhc2hib2FyZC4gQmluYXJ5IHVuaXRzICgxMDI0KSwgb25lIGRlY2ltYWxcbiAqIGJlbG93IDEwIGFuZCByb3VuZGVkIGFib3ZlLCB3aGljaCBpcyB3aGF0IHRoZSBkYXNoYm9hcmQgYWxyZWFkeSByZW5kZXJlZCDigJRcbiAqIHRoaXMgbW92ZWQgdGhlIGFsZ29yaXRobSwgaXQgZGlkIG5vdCBjaGFuZ2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCeXRlQW1vdW50KGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShieXRlcykgfHwgYnl0ZXMgPCAwKSByZXR1cm4gJzAgQic7XG4gIGxldCB2YWx1ZSA9IGJ5dGVzO1xuICBsZXQgaSA9IDA7XG4gIHdoaWxlICh2YWx1ZSA+PSAxMDI0ICYmIGkgPCBCWVRFX1VOSVRTLmxlbmd0aCAtIDEpIHtcbiAgICB2YWx1ZSAvPSAxMDI0O1xuICAgIGkrKztcbiAgfVxuICByZXR1cm4gdmFsdWUgPCAxMCA/IGAke3ZhbHVlLnRvRml4ZWQoMSl9ICR7QllURV9VTklUU1tpXX1gIDogYCR7TWF0aC5yb3VuZCh2YWx1ZSl9ICR7QllURV9VTklUU1tpXX1gO1xufVxuXG4vKipcbiAqIEEgcmF3IHF1b3RhIHZhbHVlIGFzIHRoZSBhbW91bnQgYSBIVU1BTiBzaG91bGQgcmVhZCwgcGVyIHRoaXMgdHlwZSdzXG4gKiB7QGxpbmsgUXVvdGFSZW5kZXJ9IOKAlCBieXRlcyBhcyBgMjUgR0JgLCBjb3VudHMgZ3JvdXBlZCBhcyBgNjAsMDAwYC5cbiAqXG4gKiBGb3Igc2VydmVyLXNpZGUgY29weSAocXVvdGEgbm90aWNlcywgYXVkaXQgcmVhc29ucywgNDAzIGV4cGxhbmF0aW9ucyksIHdoaWNoXG4gKiBpcyB3aHkgaXQgaXMgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgZnJvbnRlbmQ6IGEgc3RvcmFnZSBub3RpY2UgdGhhdFxuICogaW50ZXJwb2xhdGVkIHRoZSByYXcgbnVtYmVyIHdvdWxkIHJlYWQgXCJ1c2VkIGFsbCAyNjg0MzU0NTYwMCBvZiBpdHMgcmVnaXN0cnlcbiAqIHN0b3JhZ2VcIi4gVGhlIGZyb250ZW5kIGhhcyBpdHMgb3duIHRoaW4gd3JhcHBlciBiZWNhdXNlIGl0IHJlbmRlcnMgYW5cbiAqIHVubGltaXRlZCAoLTEpIGxpbWl0IGFzIGDiiJ5gLCB3aGljaCBpcyBhIGRpc3BsYXkgY2hvaWNlIG5vIHNlcnZlciBjb3B5IG1ha2VzXG4gKiAodW5saW1pdGVkIG9yZ3MgYXJlIHNraXBwZWQgYmVmb3JlIGFueSBjb3B5IGlzIGdlbmVyYXRlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRRdW90YUFtb3VudCh0eXBlOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gcXVvdGFSZW5kZXIodHlwZSkgPT09ICdieXRlcycgPyBmb3JtYXRCeXRlQW1vdW50KHZhbHVlKSA6IHZhbHVlLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycpO1xufVxuXG4vKipcbiAqIEhvdyB0aGlzIHF1b3RhJ3MgdXNhZ2UgaXMgb2JzZXJ2ZWQ6IGBtZXRlcmVkYCAoaW5jcmVtZW50ZWQpIG9yIGBtZWFzdXJlZGBcbiAqIChyZWFkIG9uIGRlbWFuZCkuIFVua25vd24gd2lyZSB2YWx1ZXMgcmVhZCBhcyBgbWV0ZXJlZGAsIG1hdGNoaW5nIGV2ZXJ5XG4gKiBxdW90YSBidXQgc3RvcmFnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhT2JzZXJ2YXRpb24odHlwZTogUXVvdGFUeXBlKTogUXVvdGFPYnNlcnZhdGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YU9ic2VydmF0aW9uKHR5cGU6IHN0cmluZyk6IFF1b3RhT2JzZXJ2YXRpb247XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFPYnNlcnZhdGlvbih0eXBlOiBzdHJpbmcpOiBRdW90YU9ic2VydmF0aW9uIHtcbiAgcmV0dXJuIGJ5S2V5W3R5cGVdPy5vYnNlcnZlZCA/PyAnbWV0ZXJlZCc7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGlzIHF1b3RhIHJlZmlsbHMgb24gdGhlIHBlcmlvZCAoYGZsb3dgKSBvciBwZXJzaXN0cyAoYHN0b2NrYCkuXG4gKiBVbmtub3duIHdpcmUgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGBmbG93YCwgbWF0Y2hpbmcgZXZlcnkgbWV0ZXJlZCBxdW90YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhQWNjcnVhbCh0eXBlOiBRdW90YVR5cGUpOiBRdW90YUFjY3J1YWw7XG5leHBvcnQgZnVuY3Rpb24gcXVvdGFBY2NydWFsKHR5cGU6IHN0cmluZyk6IFF1b3RhQWNjcnVhbDtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YUFjY3J1YWwodHlwZTogc3RyaW5nKTogUXVvdGFBY2NydWFsIHtcbiAgcmV0dXJuIGJ5S2V5W3R5cGVdPy5hY2NydWFsID8/ICdmbG93Jztcbn1cblxuLyoqIFdoYXQgdGhpcyB0eXBlIGNvdW50cywgb3IgdGhlIGVtcHR5IHN0cmluZyBmb3IgYSB2YWx1ZSBvdXRzaWRlIHRoZSBjYXRhbG9nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhRGVzY3JpcHRpb24odHlwZTogUXVvdGFUeXBlKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhRGVzY3JpcHRpb24odHlwZTogc3RyaW5nKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhRGVzY3JpcHRpb24odHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ5S2V5W3R5cGVdPy5kZXNjcmlwdGlvbiA/PyAnJztcbn1cblxuLyoqIFRoZSBwYWNrIHVuaXQgZm9yIHRoaXMgdHlwZSwgb3IgYG51bGxgIHRvIHR5cGUgcGFjayBjb3VudHMgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90YVBhY2tVbml0KHR5cGU6IFF1b3RhVHlwZSk6IHsgbmFtZTogc3RyaW5nOyBwZXI6IG51bWJlciB9IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YVBhY2tVbml0KHR5cGU6IHN0cmluZyk6IHsgbmFtZTogc3RyaW5nOyBwZXI6IG51bWJlciB9IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiBxdW90YVBhY2tVbml0KHR5cGU6IHN0cmluZyk6IHsgbmFtZTogc3RyaW5nOyBwZXI6IG51bWJlciB9IHwgbnVsbCB7XG4gIHJldHVybiBieUtleVt0eXBlXT8ucGFja1VuaXQgPz8gbnVsbDtcbn1cbiJdfQ==
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
import type { QuotaType } from './common.js';
|
|
2
|
+
import { type QuotaTierLimits } from './tier-limits.js';
|
|
3
|
+
/**
|
|
4
|
+
* The limits shape, the code-default table and the sizing arithmetic live in
|
|
5
|
+
* `./tier-limits.js` — dependency-free, so the BROWSER imports them
|
|
6
|
+
* (`@pipeline-builder/api-core/tier-limits`) instead of keeping a hand-synced
|
|
7
|
+
* copy. Re-exported here because this is the module every server consumer and
|
|
8
|
+
* the package barrel already name; what stays here is everything the env
|
|
9
|
+
* touches.
|
|
10
|
+
*/
|
|
11
|
+
export { AUTOMATION_CALLS_SIZING, automationCallsFor, DEFAULT_TIER_LIMITS, tierLabel } from './tier-limits.js';
|
|
12
|
+
export type { QuotaTierLimits } from './tier-limits.js';
|
|
2
13
|
/** Available quota tier identifiers.
|
|
3
14
|
*
|
|
4
15
|
* `unlimited` is a special tier: every quota is `-1` (uncapped) and it includes
|
|
@@ -6,168 +17,11 @@ import type { QuotaType } from './common.js';
|
|
|
6
17
|
* metering/enforcement surface exists, so nothing is capped), and it is NEVER
|
|
7
18
|
* shown or selectable when billing is enabled — see `STANDARD_TIERS`. */
|
|
8
19
|
export type QuotaTier = 'developer' | 'pro' | 'team' | 'business' | 'enterprise' | 'unlimited';
|
|
9
|
-
/** Limit values for each quota type within a tier. */
|
|
10
|
-
export interface QuotaTierLimits {
|
|
11
|
-
plugins: number;
|
|
12
|
-
pipelines: number;
|
|
13
|
-
apiCalls: number;
|
|
14
|
-
/**
|
|
15
|
-
* Metered API calls made by ORG SERVICE ACCOUNTS (automation), counted
|
|
16
|
-
* instead of `apiCalls` so pipelines can't starve the org's people. See
|
|
17
|
-
* {@link AUTOMATION_CALLS_SIZING} for how the defaults are derived.
|
|
18
|
-
*/
|
|
19
|
-
automationCalls: number;
|
|
20
|
-
aiCalls: number;
|
|
21
|
-
/**
|
|
22
|
-
* Aggregate registry storage cap in BYTES. Counted across every repo
|
|
23
|
-
* under the org's `org-{orgId}/` namespace. -1 means unlimited.
|
|
24
|
-
* push-gate reads this; the image-registry rejects token issuance for
|
|
25
|
-
* `push` scope when the org's measured usage exceeds the limit.
|
|
26
|
-
*/
|
|
27
|
-
storageBytes: number;
|
|
28
|
-
/**
|
|
29
|
-
* vCPU-MINUTES of plugin-build compute per MONTH — the one quota on a period
|
|
30
|
-
* of its own (every other flow quota rolls on `QUOTA_RESET_DAYS`, 3 days).
|
|
31
|
-
*
|
|
32
|
-
* Derived from the `plugins` cap rather than guessed: `plugins x 10` builds a
|
|
33
|
-
* month, at a flat 30 wall-minutes a build and 1.5 vCPU of buildkitd, so
|
|
34
|
-
* `credits = builds x 45`. The flat per-build figure is deliberate — scaling
|
|
35
|
-
* BOTH the build count and the per-build cost by tier made credits
|
|
36
|
-
* superlinear in tier on the strength of an unmeasured claim, and it made a
|
|
37
|
-
* pack's credit grant tier-dependent, which the catalogue's grant shape cannot
|
|
38
|
-
* express.
|
|
39
|
-
*
|
|
40
|
-
* This is the first dimension with genuine per-unit marginal cost: every other
|
|
41
|
-
* quota is a rate limit protecting shared infrastructure, this one is compute
|
|
42
|
-
* the platform pays for. See `docs/plans/cpu-credits.md`.
|
|
43
|
-
*/
|
|
44
|
-
cpuCredits: number;
|
|
45
|
-
/** Count-quotas on the user-editable feature tables added to close per-org
|
|
46
|
-
* DoS via spam. -1 means unlimited. */
|
|
47
|
-
dashboards: number;
|
|
48
|
-
alertRules: number;
|
|
49
|
-
alertDestinations: number;
|
|
50
|
-
idpConfigs: number;
|
|
51
|
-
/**
|
|
52
|
-
* Active, non-suspended plugin-ecosystem listings the org publishes
|
|
53
|
-
* (docs/plugin-installing.md). A COUNT quota — installs never
|
|
54
|
-
* count. -1 = unlimited. Extendable via the `listing_pack` add-on bundle.
|
|
55
|
-
*/
|
|
56
|
-
listings: number;
|
|
57
|
-
/**
|
|
58
|
-
* Max org members (active users / seats). -1 = unlimited. This is the "Team"
|
|
59
|
-
* tier differentiator — enforced at member-invite time (an invite is blocked
|
|
60
|
-
* when active members + pending invites would exceed this).
|
|
61
|
-
*/
|
|
62
|
-
seats: number;
|
|
63
|
-
/**
|
|
64
|
-
* Max designated SUPPORT CONTACTS — the members authorised to open support
|
|
65
|
-
* cases. -1 = unlimited. Base is **0 on every tier**: support is an add-on at
|
|
66
|
-
* every tier and included in none, so an org with no support bundle has no
|
|
67
|
-
* contacts and cannot open a case. That makes the support paywall a quota
|
|
68
|
-
* check rather than a feature flag.
|
|
69
|
-
*
|
|
70
|
-
* Like `seats` this is a tier LIMIT, not a tracked counter — enforced live at
|
|
71
|
-
* designation time against current designations across the org subtree.
|
|
72
|
-
* Extended per unit by the `support_standard` / `support_priority` BASELINE
|
|
73
|
-
* bundles, which are priced per contact.
|
|
74
|
-
*/
|
|
75
|
-
supportContacts: number;
|
|
76
|
-
/**
|
|
77
|
-
* How many of those contacts may be UPGRADED to premium (24×7, 8-hour
|
|
78
|
-
* response, and the only ones who may declare `urgent`).
|
|
79
|
-
*
|
|
80
|
-
* A second dimension rather than a third baseline level, because premium is an
|
|
81
|
-
* UPGRADE and not an alternative. The shape it encodes: an org buys N baseline
|
|
82
|
-
* contacts and upgrades M of them, M ≤ N. That is what lets a 100-seat
|
|
83
|
-
* customer give business-hours support to its three named contacts and 24×7
|
|
84
|
-
* to the one who carries the pager — the case the mutually-exclusive ladder
|
|
85
|
-
* could not express at all, where buying "99 standard + 1 premium" charged for
|
|
86
|
-
* 100 units and granted one contact.
|
|
87
|
-
*
|
|
88
|
-
* ADDITIVE, deliberately. A premium contact costs the baseline unit PLUS the
|
|
89
|
-
* upgrade ($19.99 + $99.99), because it is served during business hours
|
|
90
|
-
* through the baseline and overnight through the upgrade; pricing the upgrade
|
|
91
|
-
* as a delta would pretend the baseline were free. Base 0 on every tier, like
|
|
92
|
-
* `supportContacts`, so the paywall stays a quota check.
|
|
93
|
-
*/
|
|
94
|
-
supportPremiumContacts: number;
|
|
95
|
-
/**
|
|
96
|
-
* Reporting retention in DAYS — NOT a flow quota (never decremented, absent
|
|
97
|
-
* from `VALID_QUOTA_TYPES`): these ride the tier-baseline + bundle-grant math
|
|
98
|
-
* purely as an entitlement the billing service syncs to reporting's
|
|
99
|
-
* `dora_settings`. -1 = unlimited (the sweep skips the org entirely).
|
|
100
|
-
* `eventRetentionDays` — non-deploy `pipeline_events` (STAGE/ACTION/build).
|
|
101
|
-
* `doraRetentionDays` — deploy events + `deployment_outcomes` + `incidents`,
|
|
102
|
-
* and the per-org report-query window for DORA routes.
|
|
103
|
-
* Extendable via the `retention_pack` / `dora_history_pack` add-on bundles.
|
|
104
|
-
*/
|
|
105
|
-
eventRetentionDays: number;
|
|
106
|
-
doraRetentionDays: number;
|
|
107
|
-
}
|
|
108
20
|
/** Full preset for a single tier (label + limits). */
|
|
109
21
|
export interface QuotaTierPreset {
|
|
110
22
|
label: string;
|
|
111
23
|
limits: QuotaTierLimits;
|
|
112
24
|
}
|
|
113
|
-
/**
|
|
114
|
-
* How the `automationCalls` defaults are sized — written down so the next
|
|
115
|
-
* person to touch them argues with the arithmetic, not with the numbers.
|
|
116
|
-
*
|
|
117
|
-
* Every call an org's automation keys make in one pipeline RUN, itemized (the
|
|
118
|
-
* earlier sizing counted only the plugin lookups and hand-waved the rest as
|
|
119
|
-
* "×2"):
|
|
120
|
-
*
|
|
121
|
-
* plugin lookups 12 one per plugin step (self-mutating pipeline)
|
|
122
|
-
* synth 1 the synth step fetching the pipeline config
|
|
123
|
-
* runtime check 1 the pre-deploy runtime-check call
|
|
124
|
-
* security-report upload 1 the scan step posting its report
|
|
125
|
-
* registry register 1 pipeline-register stamping the deployed version
|
|
126
|
-
* reporting ingest batches 12 the event forwarder posts ~one batch per action
|
|
127
|
-
* --
|
|
128
|
-
* 28 calls per run
|
|
129
|
-
*
|
|
130
|
-
* Per default period (`QUOTA_RESET_DAYS`, 3 days) one active pipeline running
|
|
131
|
-
* hourly makes 28 × 24 × 3 = 2,016 calls. An org keeps far more pipelines alive
|
|
132
|
-
* than it CREATES in a period (`pipelines` is a creation rate), so active
|
|
133
|
-
* pipelines are taken as 4× the tier's `pipelines`. On top sits a per-ORG
|
|
134
|
-
* constant that does not scale with pipelines: the ingest-health heartbeat
|
|
135
|
-
* (≤ 1/minute → 1,440/day → 4,320/period). The sum gets 25% headroom (retries,
|
|
136
|
-
* registry pushes, ad-hoc CI scripts on keys) and rounds UP to the next 10,000:
|
|
137
|
-
*
|
|
138
|
-
* developer 2×4×2016 + 4320 = 20,448 × 1.25 = 25,560 → 30,000
|
|
139
|
-
* pro 5×4×2016 + 4320 = 44,640 × 1.25 = 55,800 → 60,000
|
|
140
|
-
* team 10×4×2016 + 4320 = 84,960 × 1.25 = 106,200 → 110,000
|
|
141
|
-
* business 20×4×2016 + 4320 = 165,600 × 1.25 = 207,000 → 210,000
|
|
142
|
-
* enterprise 30×4×2016 + 4320 = 246,240 × 1.25 = 307,800 → 310,000
|
|
143
|
-
*
|
|
144
|
-
* {@link automationCallsFor} computes exactly this, and the tier tests hold the
|
|
145
|
-
* table to it. Over the cap the 429 is SOFT for a band ({@link quotaGracePct}):
|
|
146
|
-
* a self-mutating pipeline that hard-stopped at 100% stayed stopped until the
|
|
147
|
-
* period reset, up to 3 days. The limits are PER PERIOD: an operator who
|
|
148
|
-
* lengthens `QUOTA_RESET_DAYS` should scale `QUOTA_TIER_<TIER>_AUTOMATION_CALLS`
|
|
149
|
-
* by the same factor.
|
|
150
|
-
*/
|
|
151
|
-
export declare const AUTOMATION_CALLS_SIZING: {
|
|
152
|
-
readonly callsPerRun: {
|
|
153
|
-
readonly pluginLookups: 12;
|
|
154
|
-
readonly synth: 1;
|
|
155
|
-
readonly runtimeCheck: 1;
|
|
156
|
-
readonly securityReportUpload: 1;
|
|
157
|
-
readonly registryRegister: 1;
|
|
158
|
-
readonly ingestBatches: 12;
|
|
159
|
-
};
|
|
160
|
-
readonly runsPerDay: 24;
|
|
161
|
-
readonly activePipelinesPerCreation: 4;
|
|
162
|
-
/** Ingest-health heartbeats per org per day (≤ one a minute). */
|
|
163
|
-
readonly heartbeatsPerDay: 1440;
|
|
164
|
-
/** Multiplier on the itemized total. */
|
|
165
|
-
readonly headroom: 1.25;
|
|
166
|
-
/** Defaults round UP to a multiple of this. */
|
|
167
|
-
readonly roundTo: 10000;
|
|
168
|
-
};
|
|
169
|
-
/** The {@link AUTOMATION_CALLS_SIZING} formula for a tier creating `pipelines` per period. */
|
|
170
|
-
export declare function automationCallsFor(pipelines: number, periodDays?: number): number;
|
|
171
25
|
/** The soft band for `quotaType` in percent, or 0 for a type that stops hard. */
|
|
172
26
|
export declare function quotaGracePct(quotaType: string): number;
|
|
173
27
|
/**
|
|
@@ -182,10 +36,23 @@ export declare function quotaGracePct(quotaType: string): number;
|
|
|
182
36
|
* to have.
|
|
183
37
|
*/
|
|
184
38
|
export declare function enforcedQuotaLimit(quotaType: string, limit: number, gracePct?: number): number;
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
*
|
|
39
|
+
/** All valid tier names (incl. `unlimited`), in ladder order. Used for validation
|
|
40
|
+
* of a *stored* tier — `unlimited` is a valid value even though it's never
|
|
41
|
+
* offered for sale. Derived from the code-default limits table, which is the one
|
|
42
|
+
* place a tier cannot be added without being given numbers. */
|
|
188
43
|
export declare const VALID_TIERS: readonly QuotaTier[];
|
|
44
|
+
/**
|
|
45
|
+
* Every tier's preset, keyed off {@link VALID_TIERS} rather than written out
|
|
46
|
+
* tier by tier — a tier added to the limits table gets its preset here with no
|
|
47
|
+
* second edit.
|
|
48
|
+
*
|
|
49
|
+
* The label defaults to {@link tierLabel} of the key ("business" → "Business",
|
|
50
|
+
* "pro_plus" → "Pro Plus"), which is what all six were spelled as by hand, and
|
|
51
|
+
* stays overridable via `QUOTA_TIER_<TIER>_LABEL` for a deployment that wants its
|
|
52
|
+
* own wording — or for a key the derivation cannot get right, such as an acronym.
|
|
53
|
+
* Display name only: it never affects a limit.
|
|
54
|
+
*/
|
|
55
|
+
export declare const QUOTA_TIERS: Record<QuotaTier, QuotaTierPreset>;
|
|
189
56
|
/** The standard, billing-selectable tiers — the ones offered as purchasable plans
|
|
190
57
|
* and shown in tier pickers. Derived as "every valid tier except `unlimited`",
|
|
191
58
|
* which is the billing-DISABLED default and is never displayed/selectable when
|