@workflow/core 5.0.0-beta.47 → 5.0.0-beta.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +13 -3
- package/dist/describe-error.d.ts.map +1 -1
- package/dist/describe-error.js +16 -1
- package/dist/private.d.ts +2 -4
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +1 -1
- package/dist/runtime/constants.d.ts +9 -7
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +10 -8
- package/dist/runtime/helpers.d.ts +13 -0
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +14 -1
- package/dist/runtime/quickjs-serde.d.ts.map +1 -1
- package/dist/runtime/quickjs-serde.js +62 -1
- package/dist/runtime/run.d.ts +42 -0
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +102 -17
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +8 -4
- package/dist/runtime/start.d.ts +31 -1
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +38 -6
- package/dist/runtime/suspension-handler.d.ts +54 -1
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +83 -20
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +174 -61
- package/dist/serialization/reducers/common-vm.d.ts.map +1 -1
- package/dist/serialization/reducers/common-vm.js +38 -1
- package/dist/serialization/reducers/common.d.ts.map +1 -1
- package/dist/serialization/reducers/common.js +26 -2
- package/dist/serialization/types.d.ts +7 -0
- package/dist/serialization/types.d.ts.map +1 -1
- package/dist/serialization/types.js +1 -1
- package/dist/serialization.d.ts +46 -2
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +249 -75
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +3 -6
- package/dist/workflow.js +6 -6
- package/docs/foundations/streaming.mdx +28 -0
- package/docs/how-it-works/understanding-directives.mdx +1 -1
- package/package.json +10 -10
package/dist/private.js
CHANGED
|
@@ -726,4 +726,4 @@ export function scheduleWorkflowSuspension(ctx) {
|
|
|
726
726
|
ctx.onWorkflowError(new WorkflowSuspension(ctx.invocationsQueue, ctx.globalThis));
|
|
727
727
|
});
|
|
728
728
|
}
|
|
729
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcml2YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR2hELE9BQU8sRUFBa0Isa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFhakUsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFFekUsTUFBTSxhQUFhLEdBRWYsVUFBVSxDQUFDO0FBRWYsd0RBQXdEO0FBQ3hELE1BQU0sZUFBZSxHQUFHLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLEtBQUssSUFBSSxHQUFHLEVBR25FLENBQUMsQ0FBQztBQUVMLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDMUMsaUNBQWlDO0lBQ2pDLHlCQUF5QjtJQUN6Qix5QkFBeUI7Q0FDMUIsQ0FBQyxDQUFDO0FBRUgsU0FBUyx3QkFBd0IsQ0FBQyxNQUFjO0lBQzlDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDOUMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFNUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxlQUF1QixFQUFFLEVBQUU7UUFDM0MsSUFB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QyxHQUFHLENBQUMsdUJBQXVCLElBQUksR0FBRyxDQUFDLHVCQUF1QixDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FDekUsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLEdBQWdDLEVBQ2hDLEVBQWM7SUFFZCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUU7UUFDakIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLHVFQUF1RTtZQUN2RSxxRUFBcUU7WUFDckUscUVBQXFFO1lBQ3JFLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDekIsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sRUFBRSxFQUFFLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLE1BQU0sVUFBVSwwQkFBMEIsQ0FDeEMsR0FBZ0M7SUFFaEMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLG9CQUFvQixDQUFDO0lBQzVDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7UUFDekIsSUFBSSxVQUFVLEtBQUssR0FBRyxDQUFDLG9CQUFvQjtZQUFFLE9BQU87UUFDcEQsR0FBRyxDQUFDLGVBQWUsQ0FDakIsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUM3RCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVdGlscyB1c2VkIGJ5IHRoZSBidW5kbGVyIHdoZW4gdHJhbnNmb3JtaW5nIGNvZGVcbiAqL1xuXG5pbXBvcnQgeyBXb3JrZmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgd2l0aFJlc29sdmVycyB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFdvcmxkQ2FwYWJpbGl0aWVzIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgRXZlbnRzQ29uc3VtZXIgfSBmcm9tICcuL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgeyB0eXBlIFF1ZXVlSXRlbSwgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXBsYXlQYXlsb2FkQ2FjaGUgfSBmcm9tICcuL3JlcGxheS1wYXlsb2FkLWNhY2hlLmpzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi9zY2hlbWFzLmpzJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZEtleSB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFxuICBBcmdzIGV4dGVuZHMgU2VyaWFsaXphYmxlW10gPSBhbnlbXSxcbiAgUmVzdWx0IGV4dGVuZHMgU2VyaWFsaXphYmxlIHwgdW5rbm93biA9IHVua25vd24sXG4+ID0gKCguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPFJlc3VsdD4pICYge1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICBzdGVwSWQ/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBSZWdpc3RlcmVkU3RlcHNLZXkgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvY29yZS8vcmVnaXN0ZXJlZFN0ZXBzJyk7XG5cbmNvbnN0IGdsb2JhbFN5bWJvbHM6IHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICBbUmVnaXN0ZXJlZFN0ZXBzS2V5XT86IE1hcDxzdHJpbmcsIFN0ZXBGdW5jdGlvbj47XG59ID0gZ2xvYmFsVGhpcztcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IC9cbmNvbnN0IHJlZ2lzdGVyZWRTdGVwcyA9IChnbG9iYWxTeW1ib2xzW1JlZ2lzdGVyZWRTdGVwc0tleV0gPz89IG5ldyBNYXA8XG4gIHN0cmluZyxcbiAgU3RlcEZ1bmN0aW9uXG4+KCkpO1xuXG5jb25zdCBCVUlMVElOX1JFU1BPTlNFX1NURVBfTkFNRVMgPSBuZXcgU2V0KFtcbiAgJ19fYnVpbHRpbl9yZXNwb25zZV9hcnJheV9idWZmZXInLFxuICAnX19idWlsdGluX3Jlc3BvbnNlX2pzb24nLFxuICAnX19idWlsdGluX3Jlc3BvbnNlX3RleHQnLFxuXSk7XG5cbmZ1bmN0aW9uIGdldFN0ZXBJZEFsaWFzQ2FuZGlkYXRlcyhzdGVwSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGFydHMgPSBzdGVwSWQuc3BsaXQoJy8vJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgcGFydHNbMF0gIT09ICdzdGVwJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZVBhdGggPSBwYXJ0c1sxXTtcbiAgY29uc3QgZm5OYW1lID0gcGFydHNbMl07XG4gIGNvbnN0IG1vZHVsZVBhdGhBbGlhc2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3QgYWRkQWxpYXMgPSAoYWxpYXNNb2R1bGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoYWxpYXNNb2R1bGVQYXRoICE9PSBtb2R1bGVQYXRoKSB7XG4gICAgICBtb2R1bGVQYXRoQWxpYXNlcy5hZGQoYWxpYXNNb2R1bGVQYXRoKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKG1vZHVsZVBhdGguc3RhcnRzV2l0aCgnLi93b3JrZmxvd3MvJykpIHtcbiAgICBjb25zdCB3b3JrZmxvd1JlbGF0aXZlUGF0aCA9IG1vZHVsZVBhdGguc2xpY2UoJy4vJy5sZW5ndGgpO1xuICAgIGFkZEFsaWFzKGAuL2V4YW1wbGUvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9zcmMvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgfSBlbHNlIGlmIChtb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJy4vZXhhbXBsZS93b3JrZmxvd3MvJykpIHtcbiAgICBjb25zdCB3b3JrZmxvd1JlbGF0aXZlUGF0aCA9IG1vZHVsZVBhdGguc2xpY2UoJy4vZXhhbXBsZS8nLmxlbmd0aCk7XG4gICAgYWRkQWxpYXMoYC4vJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9zcmMvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgfSBlbHNlIGlmIChtb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJy4vc3JjL3dvcmtmbG93cy8nKSkge1xuICAgIGNvbnN0IHdvcmtmbG93UmVsYXRpdmVQYXRoID0gbW9kdWxlUGF0aC5zbGljZSgnLi9zcmMvJy5sZW5ndGgpO1xuICAgIGFkZEFsaWFzKGAuLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gICAgYWRkQWxpYXMoYC4vZXhhbXBsZS8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgbW9kdWxlUGF0aEFsaWFzZXMsXG4gICAgKGFsaWFzTW9kdWxlUGF0aCkgPT4gYHN0ZXAvLyR7YWxpYXNNb2R1bGVQYXRofS8vJHtmbk5hbWV9YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRCdWlsdGluUmVzcG9uc2VTdGVwQWxpYXMoc3RlcElkOiBzdHJpbmcpOiBTdGVwRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICBpZiAoIUJVSUxUSU5fUkVTUE9OU0VfU1RFUF9OQU1FUy5oYXMoc3RlcElkKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtyZWdpc3RlcmVkU3RlcElkLCBzdGVwRm5dIG9mIHJlZ2lzdGVyZWRTdGVwcy5lbnRyaWVzKCkpIHtcbiAgICBpZiAocmVnaXN0ZXJlZFN0ZXBJZC5lbmRzV2l0aChgLy8ke3N0ZXBJZH1gKSkge1xuICAgICAgcmV0dXJuIHN0ZXBGbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgc3RlcCBmdW5jdGlvbiB0byBiZSBzZXJ2ZWQgaW4gdGhlIHNlcnZlciBidW5kbGUuXG4gKiBBbHNvIHNldHMgdGhlIHN0ZXBJZCBwcm9wZXJ0eSBvbiB0aGUgZnVuY3Rpb24gZm9yIHNlcmlhbGl6YXRpb24gc3VwcG9ydC5cbiAqXG4gKiBOb3RlOiBUaGUgU1dDIGNvbXBpbGVyIHBsdWdpbiBubyBsb25nZXIgZ2VuZXJhdGVzIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uXG4gKiBTdGVwIHJlZ2lzdHJhdGlvbiBpcyBub3cgaW5saW5lZCBhcyBhIHNlbGYtY29udGFpbmVkIElJRkUgdGhhdCB3cml0ZXNcbiAqIGRpcmVjdGx5IHRvIHRoZSBnbG9iYWwgTWFwIGF0IFN5bWJvbC5mb3IoXCJAd29ya2Zsb3cvY29yZS8vcmVnaXN0ZXJlZFN0ZXBzXCIpLlxuICogVGhpcyBmdW5jdGlvbiBpcyBrZXB0IGZvciBpbnRlcm5hbC90ZXN0IHVzZSBvbmx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTdGVwRnVuY3Rpb24oc3RlcElkOiBzdHJpbmcsIHN0ZXBGbjogU3RlcEZ1bmN0aW9uKSB7XG4gIHJlZ2lzdGVyZWRTdGVwcy5zZXQoc3RlcElkLCBzdGVwRm4pO1xuICBzdGVwRm4uc3RlcElkID0gc3RlcElkO1xufVxuXG4vKipcbiAqIEZpbmQgYSByZWdpc3RlcmVkIHN0ZXAgZnVuY3Rpb24gYnkgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RlcEZ1bmN0aW9uKHN0ZXBJZDogc3RyaW5nKTogU3RlcEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGlyZWN0TWF0Y2ggPSByZWdpc3RlcmVkU3RlcHMuZ2V0KHN0ZXBJZCk7XG4gIGlmIChkaXJlY3RNYXRjaCkge1xuICAgIHJldHVybiBkaXJlY3RNYXRjaDtcbiAgfVxuXG4gIC8vIFN1cHBvcnQgZXF1aXZhbGVudCB3b3JrZmxvdyBwYXRoIGFsaWFzZXMgaW4gbWl4ZWQgc3ltbGluayBlbnZpcm9ubWVudHMuXG4gIGZvciAoY29uc3QgYWxpYXNTdGVwSWQgb2YgZ2V0U3RlcElkQWxpYXNDYW5kaWRhdGVzKHN0ZXBJZCkpIHtcbiAgICBjb25zdCBhbGlhc01hdGNoID0gcmVnaXN0ZXJlZFN0ZXBzLmdldChhbGlhc1N0ZXBJZCk7XG4gICAgaWYgKGFsaWFzTWF0Y2gpIHtcbiAgICAgIHJldHVybiBhbGlhc01hdGNoO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJ1aWx0aW5BbGlhc01hdGNoID0gZ2V0QnVpbHRpblJlc3BvbnNlU3RlcEFsaWFzKHN0ZXBJZCk7XG4gIGlmIChidWlsdGluQWxpYXNNYXRjaCkge1xuICAgIHJldHVybiBidWlsdGluQWxpYXNNYXRjaDtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8vIE5vdGU6IF9fcHJpdmF0ZV9nZXRDbG9zdXJlVmFycyBpcyBubyBsb25nZXIgcmUtZXhwb3J0ZWQgaGVyZS5cbi8vIFRoZSBTV0MgY29tcGlsZXIgcGx1Z2luIG5vdyBpbmxpbmVzIGNsb3N1cmUgdmFyaWFibGUgYWNjZXNzIGFzIGFcbi8vIHNlbGYtY29udGFpbmVkIElJRkUgdGhhdCByZWFkcyBkaXJlY3RseSBmcm9tIHRoZSBnbG9iYWwgQXN5bmNMb2NhbFN0b3JhZ2Vcbi8vIGF0IFN5bWJvbC5mb3IoXCJXT1JLRkxPV19TVEVQX0NPTlRFWFRfU1RPUkFHRVwiKS5cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQge1xuICBydW5JZDogc3RyaW5nO1xuICBlbmNyeXB0aW9uS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkO1xuICB3b3JsZENhcGFiaWxpdGllcz86IFdvcmxkQ2FwYWJpbGl0aWVzO1xuICBnbG9iYWxUaGlzOiB0eXBlb2YgZ2xvYmFsVGhpcztcbiAgLyoqXG4gICAqIEluY3JlbWVudHMgd2hlbiBhIHN1c3BlbnNpb24gaXMgYWNjZXB0ZWQgYW5kIG9uIGV2ZXJ5IHJldGFpbmVkLXNlc3Npb25cbiAgICogcmVzdW1lLiBTdGVwLCBob29rLCBhbmQgYXR0cmlidXRlIHN1c3BlbnNpb24gc2lnbmFscyBjYXB0dXJlIGl0IHdoZW5cbiAgICogc2NoZWR1bGVkIGFuZCBuby1vcCBpZiBpdCBtb3ZlZCwgd2hpY2ggZHJvcHMgc2FtZS1ib3VuZGFyeSBzaWJsaW5nIHNpZ25hbHNcbiAgICogYW5kIHRpbWVycyBxdWV1ZWQgYXQgYm91bmRhcnkgTiB0aGF0IHdvdWxkIGZpcmUgYWZ0ZXIgdGhlIHNlc3Npb24gcmVzdW1lZFxuICAgKiBpbnRvIGJvdW5kYXJ5IE4rMS4gU2xlZXAgc2lnbmFscyBhcmUgaW50ZW50aW9uYWxseSB1bmd1YXJkZWQ6IHRoZWlyXG4gICAqIHByZXNlbmNlIG1ha2VzIHRoZSBib3VuZGFyeSB1bnJldGFpbmFibGUsIHNvIGEgbGF0ZSBzaWduYWwgY29ycmVjdGx5XG4gICAqIGRlbW90ZXMgdGhlIHNlc3Npb24gKHdvcmtmbG93LnRzIGBvbldvcmtmbG93RXJyb3JgKS5cbiAgICovXG4gIHN1c3BlbnNpb25HZW5lcmF0aW9uOiBudW1iZXI7XG4gIGV2ZW50c0NvbnN1bWVyOiBFdmVudHNDb25zdW1lcjtcbiAgLyoqXG4gICAqIE1hcCBvZiBwZW5kaW5nIGludm9jYXRpb25zIGtleWVkIGJ5IGNvcnJlbGF0aW9uSWQuXG4gICAqIFVzaW5nIE1hcCBpbnN0ZWFkIG9mIEFycmF5IGZvciBPKDEpIGxvb2t1cC9kZWxldGUgb3BlcmF0aW9ucy5cbiAgICovXG4gIGludm9jYXRpb25zUXVldWU6IE1hcDxzdHJpbmcsIFF1ZXVlSXRlbT47XG4gIG9uV29ya2Zsb3dFcnJvcjogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIE1pbnRzIHRoZSBVTElEIGJvZHkgb2YgYSBjb3JyZWxhdGlvbiBpZC4gRXZlcnkgZW50aXR5IGEgcmVwbGF5IGNyZWF0ZXNcbiAgICogZHJhd3MgZnJvbSB0aGlzIG9uZSBtb25vdG9uaWMgc2VxdWVuY2UsIHNvIGFuIGlkIGlzIGFuIG9yZGluYWwgb3ZlciB0aGVcbiAgICogd2hvbGUgcnVuIGFuZCBib3RoIHJlcGxheXMgb2YgYSBydW4gbXVzdCBkcmF3IGluIHRoZSBzYW1lIG9yZGVyLlxuICAgKi9cbiAgZ2VuZXJhdGVVbGlkOiAoKSA9PiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNb25vdG9uZSBjb3VudCBvZiBjb3JyZWxhdGlvbi1pZCBkcmF3cyB0aGlzIHJlcGxheSBoYXMgbWFkZS4gUHJvZ3Jlc3NcbiAgICogbWV0cmljIGZvciB7QGxpbmsgcXVpZXNjZUVhcmxpZXJDYXNjYWRlc306IGEgbWFjcm90YXNrIHR1cm4gaW4gd2hpY2ggaXRcbiAgICogZG9lcyBub3QgbW92ZSAoYW5kIG5vIGh5ZHJhdGlvbiBpcyBpbiBmbGlnaHQpIG1lYW5zIGV2ZXJ5IHdva2VuIGJyYW5jaCBoYXNcbiAgICogcnVuIGFzIGZhciBhcyBpdCBjYW4gd2l0aG91dCBhbm90aGVyIGRlbGl2ZXJ5LiBPcHRpb25hbCBzbyBsaWdodHdlaWdodFxuICAgKiB0ZXN0IGNvbnRleHRzIGRlZ3JhZGUgdG8gdGhlIHNpbmdsZS15aWVsZCBiZWhhdmlvci5cbiAgICovXG4gIHJlYWRvbmx5IG1pbnRDb3VudD86IG51bWJlcjtcbiAgZ2VuZXJhdGVOYW5vaWQ6ICgpID0+IHN0cmluZztcbiAgLyoqXG4gICAqIFNlcXVlbnRpYWwgcHJvbWlzZSBxdWV1ZSB0aGF0IGVuc3VyZXMgYWxsIGV2ZW50LWRyaXZlbiBwcm9taXNlIHJlc29sdXRpb25zXG4gICAqIChzdGVwIHJlc3VsdHMsIGhvb2sgcGF5bG9hZHMsIGZhaWx1cmVzLCBzdXNwZW5zaW9ucykgaGFwcGVuIGluIGV2ZW50IGxvZ1xuICAgKiBvcmRlci4gRXZlcnkgcmVzb2x2ZSwgcmVqZWN0LCBvciB3b3JrZmxvdyBlcnJvciBpcyBjaGFpbmVkIHRocm91Z2ggdGhpc1xuICAgKiBxdWV1ZSBzbyB0aGF0IGV2ZW4gaWYgaW5kaXZpZHVhbCBvcGVyYXRpb25zIHRha2UgdmFyaWFibGUgdGltZSAoZS5nLixcbiAgICogYXN5bmMgZGVjcnlwdGlvbiksIHByb21pc2VzIHJlc29sdmUgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gICAqL1xuICBwcm9taXNlUXVldWU6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBDb3VudGVyIG9mIGluLWZsaWdodCBhc3luYyBkYXRhIGRlbGl2ZXJ5IG9wZXJhdGlvbnMgKHN0ZXAgcmVzdWx0XG4gICAqIGh5ZHJhdGlvbiwgaG9vayBwYXlsb2FkIGh5ZHJhdGlvbiwgYWJvcnQgc2lnbmFsIGh5ZHJhdGlvbikuIFN1c3BlbnNpb25zXG4gICAqIG11c3Qgd2FpdCBmb3IgdGhpcyB0byByZWFjaCAwIGJlZm9yZSBmaXJpbmcsIHRvIGF2b2lkIHByZWVtcHRpbmcgZGF0YVxuICAgKiBkZWxpdmVyeSwgZS5nLiBkZWh5ZHJhdGluZyBhIHN0ZXAncyBhcmd1bWVudHMgd2hpbGUgYW4gYWJvcnQgdGhhdCBzaG91bGRcbiAgICogYmUgcmVmbGVjdGVkIGluIHRob3NlIGFyZ3VtZW50cyBpcyBzdGlsbCBoeWRyYXRpbmcgaXRzIHJlYXNvbi5cbiAgICovXG4gIHBlbmRpbmdEZWxpdmVyaWVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBPcmRlcmVkIHJlZ2lzdHJ5IG9mIGluLWZsaWdodCBcImJyYW5jaC1kZWNpZGluZ1wiIGRlbGl2ZXJpZXM6IHRoZVxuICAgKiByZXNvbHV0aW9ucyBhIHdvcmtmbG93IHR5cGljYWxseSBgUHJvbWlzZS5yYWNlYHMgb24sIG9yIGF3YWl0cyBmcm9tXG4gICAqIGluZGVwZW5kZW50IGNvbmN1cnJlbnQgYnJhbmNoZXM6IGhvb2sgcGF5bG9hZHMgKGBob29rX3JlY2VpdmVkYCksIHdhaXRcbiAgICogY29tcGxldGlvbnMgKGB3YWl0X2NvbXBsZXRlZGApLCBhbmQgc3RlcCByZXN1bHRzIChgc3RlcF9jb21wbGV0ZWRgIC9cbiAgICogYHN0ZXBfZmFpbGVkYCkuIEtleWVkIGJ5IHRoZSBkZWxpdmVyeSdzIHBvc2l0aW9uIChpbmRleCkgaW4gdGhlIGNvbnN1bWVkXG4gICAqIGV2ZW50IGxvZy5cbiAgICpcbiAgICogVGhlIHByb2JsZW06IGVhY2ggb2YgdGhlc2UgcmVzb2x1dGlvbnMgcmVhY2hlcyB3b3JrZmxvdyBjb2RlIGFmdGVyIGFcbiAgICogZGlmZmVyZW50LCB3b3JrbG9hZC1kZXBlbmRlbnQgbnVtYmVyIG9mIG1pY3JvdGFzayBob3BzLiBBIGJ1ZmZlcmVkIGhvb2tcbiAgICogcGF5bG9hZCBpcyBvYnNlcnZlZCB2aWEgdGhlIGFzeW5jIGhvb2sgaXRlcmF0b3IgKGB5aWVsZCBhd2FpdCB0aGlzYCksXG4gICAqIGNvc3RpbmcgZXh0cmEgaG9wczsgYSBgd2FpdF9jb21wbGV0ZWRgIHJlc29sdmVzIHdpdGggZmV3ZXIsIGFuZCBhIHJldXNlZFxuICAgKiBzbGVlcCBjYW4gcmVzb2x2ZSBpbiBhbiBlbnRpcmVseSBlYXJsaWVyIGxvb3AgaXRlcmF0aW9uOyBhIHN0ZXAgcmVzdWx0IGlzXG4gICAqIGdhdGVkIG9uIGh5ZHJhdGlvbiB3aG9zZSBjb3N0IHZhcmllcyBiZXR3ZWVuIHJlcGxheXMgb2YgdGhlIFNBTUVcbiAgICogaW52b2NhdGlvbjogdGhlIGZpcnN0IHJlcGxheSBwYXlzIHRoZSBmdWxsIGRlY3J5cHQvZGVjb21wcmVzcy9yZXZpdmUsXG4gICAqIHdoaWxlIGxhdGVyIHJlcGxheXMgc2hhcmluZyB0aGUgaW52b2NhdGlvbidzIGBSZXBsYXlQYXlsb2FkQ2FjaGVgXG4gICAqIG1lbW8taGl0IHNtYWxsIHByaW1pdGl2ZSByZXN1bHRzIGFuZCByZXNvbHZlIGluIG9uZSBvciB0d28gaG9wcy4gRWl0aGVyXG4gICAqIHdheSwgdGhlIHJlc29sdXRpb24gdGhhdCB0aGUgY29tbWl0dGVkIGV2ZW50IGxvZyBvcmRlcmVkIGZpcnN0IGNhbiBsb3NlIGFcbiAgICogYFByb21pc2UucmFjZWAgKG9yIGEgYHVzZVN0ZXBgIFVMSUQgYWxsb2NhdGlvbikgdG8gYSBmYXN0ZXItIG9yXG4gICAqIGFscmVhZHktcmVzb2x2ZWQgY29tcGV0aXRvciwgZGl2ZXJnaW5nIGZyb20gdGhlIGxvZyBhbmQgc3VyZmFjaW5nIGFzXG4gICAqIGBDb3JydXB0ZWRFdmVudExvZ0Vycm9yYC5cbiAgICpcbiAgICogVGhlIGZpeCBpcyBhIHN0cmljdCwgZGV0ZXJtaW5pc3RpYyBkZWxpdmVyeSBvcmRlciBhbmNob3JlZCBvblxuICAgKiBldmVudC1sb2cgcG9zaXRpb246IGEgZGVsaXZlcnkgZG9lcyBub3QgcmVzb2x2ZSB0byB0aGUgd29ya2Zsb3cgdW50aWxcbiAgICogZXZlcnkgcmVsZXZhbnQgZWFybGllci1pbi1sb2cgZGVsaXZlcnkgaGFzIGJlZW4gZGVsaXZlcmVkLiBCZWNhdXNlIHRoZVxuICAgKiBnYXRlIGlzIFwidGhlIGVhcmxpZXIgZGVsaXZlcnkgcmVzb2x2ZWRcIiwgbm90IFwid29uIGEgdGltaW5nIHJhY2VcIiwgdGhlXG4gICAqIG91dGNvbWUgaXMgaW5kZXBlbmRlbnQgb2YgbWljcm90YXNrIGhvcHMsIGh5ZHJhdGlvbi9kZWNyeXB0aW9uIHRpbWUsXG4gICAqIGFuZCBgUHJvbWlzZS5yYWNlYCBhcmd1bWVudCBvcmRlci4gV2hpY2ggZWFybGllciBraW5kcyBhIGRlbGl2ZXJ5IGRlZmVyc1xuICAgKiBiZWhpbmQgaXMgc3BlbGxlZCBvdXQgb24ge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9LlxuICAgKlxuICAgKiBJbmRleCBpcyB1c2VkIHJhdGhlciB0aGFuIHRoZSBgZXZlbnRJZGAgc3RyaW5nIGJlY2F1c2UgYGV2ZW50SWRgIGlzIGFuXG4gICAqIG9wYXF1ZSwgd29ybGQtYXNzaWduZWQgdmFsdWUgbm90IGd1YXJhbnRlZWQgdG8gc29ydCBpbiBjcmVhdGlvbiBvcmRlclxuICAgKiAob25seSB0aGUgYnVuZGxlZCBVTElEIHdvcmxkcyBoYXBwZW4gdG8pLlxuICAgKlxuICAgKiBPcHRpb25hbCBzbyBvbGRlci9vdXQtb2YtdHJlZSBjb250ZXh0cyAoYW5kIGxpZ2h0d2VpZ2h0IHRlc3QgaGFybmVzc2VzKVxuICAgKiB0aGF0IGRvIG5vdCBpbml0aWFsaXplIGl0IGRlZ3JhZGUgZ3JhY2VmdWxseSB0byB0aGUgcHJldmlvdXMgYmVoYXZpb3IuXG4gICAqL1xuICBwZW5kaW5nRGVsaXZlcnlCYXJyaWVycz86IE1hcDxudW1iZXIsIERlbGl2ZXJ5QmFycmllckVudHJ5PjtcbiAgLyoqXG4gICAqIEludm9jYXRpb24tc2NvcGVkIGNhY2hlIG9mIHByZXBhcmVkIHNlcmlhbGl6ZWQgcGF5bG9hZHMgYW5kIGltbXV0YWJsZSBmaW5hbFxuICAgKiB2YWx1ZXMuIFByZXBhcmVkIGJ5dGVzIHN1cnZpdmUgZnJlc2ggcmVwbGF5IFZNczsgb2JqZWN0IGdyYXBocyBkbyBub3QuXG4gICAqL1xuICByZXBsYXlQYXlsb2FkQ2FjaGU6IFJlcGxheVBheWxvYWRDYWNoZTtcbn1cblxuLyoqIFRoZSBraW5kIG9mIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBhIGJhcnJpZXIgcmVwcmVzZW50cy4gKi9cbmV4cG9ydCB0eXBlIERlbGl2ZXJ5S2luZCA9ICdob29rJyB8ICd3YWl0JyB8ICdzdGVwJztcblxuaW50ZXJmYWNlIERlbGl2ZXJ5QmFycmllckVudHJ5IHtcbiAga2luZDogRGVsaXZlcnlLaW5kO1xuICAvKiogUmVzb2x2ZXMgb25jZSB0aGlzIGRlbGl2ZXJ5IGlzIGhhbmRlZCB0byB0aGUgd29ya2Zsb3cgb3IgcmV0aXJlZC4gKi9cbiAgcmVsZWFzZWQ6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZGVsaXZlcnkgaXMgY29tbWl0dGVkIHRvIHJlYWNoaW5nIHRoZSB3b3JrZmxvdyB3aXRob3V0IGFueVxuICAgKiBmdXJ0aGVyIGFjdGlvbiBieSB3b3JrZmxvdyBjb2RlLiBUcnVlIGZvciB3YWl0IGNvbXBsZXRpb25zIGFuZCBzdGVwXG4gICAqIHJlc3VsdHMsIHdoaWNoIGFsd2F5cyByZXNvbHZlIGZyb20gdGhlaXIgb3duIGNoYWluLCBhbmQgZm9yIGEgaG9vayBwYXlsb2FkXG4gICAqIHRoYXQgYWxyZWFkeSBoYWQgYSB3YWl0aW5nIGNvbnN1bWVyIHdoZW4gaXQgd2FzIGNvbnN1bWVkLlxuICAgKlxuICAgKiBGYWxzZSBmb3IgYSBCVUZGRVJFRCBob29rIHBheWxvYWQgbm8gY29uc3VtZXIgaGFzIGNsYWltZWQgeWV0OiBpdCBpc1xuICAgKiBkZWxpdmVyZWQgYnkgYGNsYWltKClgLCBpLmUuIHdoZW5ldmVyIHRoZSB3b3JrZmxvdyBuZXh0IHJlYWRzIHRoZSBob29rLFxuICAgKiB3aGljaCBtYXkgYmUgY2F1c2FsbHkgKmFmdGVyKiBhIGxhdGVyLWluLWxvZyBkZWxpdmVyeS4gYGFybSgpYCBmbGlwcyBpdFxuICAgKiBvbmNlIGEgY29uc3VtZXIgdGFrZXMgdGhlIHBheWxvYWQuXG4gICAqL1xuICBhcm1lZDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhpcyBlbnRyeSBoYXMgYmVlbiByZW1vdmVkIGFuZCBpdHMgYHJlbGVhc2VkYCBwcm9taXNlIHNldHRsZWQuICovXG4gIHJldGlyZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSZXRpcmUgdGhpcyBlbnRyeTogcmVzb2x2ZSBgcmVsZWFzZWRgIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgcmVnaXN0cnksXG4gICAqIHdpdGhvdXQgbWFya2luZyB0aGUgaGFuZGxlIGRlbGl2ZXJlZCB0byB0aGUgd29ya2Zsb3cuIEEgc2FmZXR5LXJldGlyZWRcbiAgICogYnVmZmVyZWQgcGF5bG9hZCBtYXkgdGhlcmVmb3JlIGluc3RhbGwgYSBmcmVzaCBlbnRyeSBpZiBpdCBpcyBjbGFpbWVkIGJ5XG4gICAqIGEgcmV0YWluZWQgVk0gbGF0ZXIuIENhbGxlZCBvbmx5IGJ5IHRoZSBjb250ZXh0J3Mgc2FmZXR5LW5ldCBkaXNwZW5zZXJcbiAgICogKHtAbGluayBlbnN1cmVCYXJyaWVyU2FmZXR5TmV0fSksIGFuZCBvbmx5IG9uIHRoZSBsb3dlc3QtaW5kZXggZW50cnkgYXRcbiAgICogZGVsaXZlcnkgaWRsZS4gSWRlbXBvdGVudC5cbiAgICovXG4gIHJldGlyZTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBXaGljaCBlYXJsaWVyIGtpbmRzIGVhY2ggZGVsaXZlcnkga2luZCBkZWZlcnMgYmVoaW5kLiBDaG9zZW4gc28gdGhhdCBubyBraW5kXG4gKiBibG9ja3Mgb24gYSBwZWVyIGl0IGRvZXMgbm90IG5lZWQgdG86XG4gKlxuICogIC0gYSBob29rIGRlZmVycyBiZWhpbmQgZWFybGllciBIT09LUywgV0FJVFMgYW5kIFNURVBTO1xuICogIC0gYSB3YWl0IGRlZmVycyBiZWhpbmQgZWFybGllciBIT09LUyBhbmQgU1RFUFMgKG5vdCBlYXJsaWVyIHdhaXRzLCBzaW5jZSBhXG4gKiAgICB3YWl0IG5ldmVyIG5lZWRzIHRvIHF1ZXVlIGJlaGluZCBhbm90aGVyIHdhaXQpO1xuICogIC0gYSBzdGVwIGRlZmVycyBiZWhpbmQgZWFybGllciBXQUlUUywgSE9PS1MgYW5kIFNURVBTLlxuICpcbiAqIFRoZSBzdGVwLWJlaGluZC1zdGVwIGVkZ2UgaXMgbm90IHJlZHVuZGFudCB3aXRoIHRoZSBzZXJpYWwgYHByb21pc2VRdWV1ZWAuXG4gKiBUaGUgcXVldWUgZml4ZXMgdGhlIG9yZGVyIGluIHdoaWNoIHN0ZXAgcmVzdWx0cyBhcmUgSFlEUkFURUQsIGJ1dCBhIHN0ZXAgbm9cbiAqIGxvbmdlciByZXNvbHZlcyBpbnNpZGUgaXRzIHF1ZXVlIHNsb3Q6IGl0IGNhcHR1cmVzIHRoZSBvdXRjb21lIHRoZXJlIGFuZFxuICogcmVzb2x2ZXMgZnJvbSBhIGRldGFjaGVkIGNvbnRpbnVhdGlvbiBvbmNlIGl0cyBiYXJyaWVyIGNsZWFycy4gVHdvIHN0ZXBzXG4gKiBhZ3JlZSBvbiB0aGF0IGNvbnRpbnVhdGlvbidzIG9yZGVyaW5nIG9ubHkgd2hpbGUgdGhleSBkZWZlciBiZWhpbmQgdGhlIHNhbWVcbiAqIHNldCwgd2hpY2ggaG9sZHMgd2hlbiB0aGV5IGFyZSBjb25zdW1lZCBpbiB0aGUgc2FtZSBkcmFpbiB3aW5kb3cgYnV0IG5vdFxuICogYWNyb3NzIHdpbmRvd3M6IGEgc3RlcCBjb25zdW1lZCBsYXRlciBjYW4gbWlzcyBhIHdhaXQvaG9vayBiYXJyaWVyIHRoYXQgYW5cbiAqIGVhcmxpZXIgc3RlcCBpcyBzdGlsbCBwYXJrZWQgb24sIGJlY2F1c2UgdGhlIGJhcnJpZXIgcmV0aXJlZCBpbiBiZXR3ZWVuLiBUaGVcbiAqIGVhcmxpZXIgc3RlcCBpcyB0aGVuIHdhaXRpbmcgb3V0IHRoZSBtYWNyb3Rhc2sgeWllbGQgYmVsb3cgd2hpbGUgdGhlIGxhdGVyXG4gKiBvbmUgcmVzb2x2ZXMgb24gbWljcm90YXNrcywgYW5kIG92ZXJ0YWtlcyBpdC4gU2VlXG4gKiBgZGVsaXZlcnktYmFycmllci1jb3ZlcmFnZS50ZXN0LnRzYC4gRGVmZXJyaW5nIGJlaGluZCBlYXJsaWVyIHN0ZXBzXG4gKiBjbG9zZXMgdGhhdCB3aW5kb3cgc3RydWN0dXJhbGx5OiB0aGUgZWFybGllciBzdGVwJ3MgYmFycmllciBpcyBzdGlsbFxuICogcmVnaXN0ZXJlZCBwcmVjaXNlbHkgYmVjYXVzZSBpdCBoYXMgbm90IGRlbGl2ZXJlZCB5ZXQuXG4gKlxuICogRXZlcnkgZWRnZSBwb2ludHMgZnJvbSBhIGxhdGVyIGxvZyBpbmRleCB0byBhIHN0cmljdGx5IGVhcmxpZXIgb25lLCBzbyB0aGVcbiAqIHdhaXQtZm9yIGdyYXBoIGNhbiBuZXZlciBjb250YWluIGEgY3ljbGUuXG4gKi9cbmNvbnN0IERFRkVSX0JFSElORDogUmVjb3JkPERlbGl2ZXJ5S2luZCwgcmVhZG9ubHkgRGVsaXZlcnlLaW5kW10+ID0ge1xuICBob29rOiBbJ2hvb2snLCAnd2FpdCcsICdzdGVwJ10sXG4gIHdhaXQ6IFsnaG9vaycsICdzdGVwJ10sXG4gIHN0ZXA6IFsnd2FpdCcsICdob29rJywgJ3N0ZXAnXSxcbn07XG5cbi8qKlxuICogV2hldGhlciBhIGRlbGl2ZXJ5IG9mIGBraW5kYCBhdCBsb2cgaW5kZXggYGluZGV4YCBnYXRlcyBvbiB0aGUgZWFybGllclxuICogcmVnaXN0cnkgZW50cnkgYG90aGVyYCAoYXQgYG90aGVySW5kZXhgKS5cbiAqXG4gKiBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGF0IHF1ZXN0aW9uLCBjYWxsZWQgYnkgYm90aFxuICoge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9ICh3aGljaCBhd2FpdHMgd2hhdCBpdCBnYXRlcyBvbikgYW5kXG4gKiB7QGxpbmsgY29tcHV0ZVJlc29sdmVzT25JdHNPd259ICh3aGljaCByZWN1cnNlcyBpbnRvIHdoYXQgaXQgZ2F0ZXMgb24pLlxuICogVGhvc2UgdHdvIE1VU1QgYWdyZWUgZXhhY3RseSwgYW5kIHRoZSBkb2MgYmxvY2sgb25cbiAqIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfSBzdGFrZXMgZGVhZGxvY2stZnJlZWRvbSBvbiBpdCwgc28gdGhlXG4gKiBjb25kaXRpb24gbGl2ZXMgaGVyZSByYXRoZXIgdGhhbiBiZWluZyBzcGVsbGVkIG91dCB0d2ljZS5cbiAqXG4gKiBPbmUgZGVsaWJlcmF0ZSBleGNlcHRpb246IHRoZSBsb2ctb3JkZXItZHJhd3MgdHVybnN0aWxlIGluXG4gKiB7QGxpbmsgcXVpZXNjZUVhcmxpZXJDYXNjYWRlc30gd2FpdHMgb24gQU5ZIGxvd2VyIGFybWVkIGVudHJ5LCBhIHN0cmljdGx5XG4gKiB3aWRlciByZWxhdGlvbiB0aGFuIHRoaXMgb25lLiBXaHkgdGhhdCB3aWR0aCBjYW5ub3QgZGVhZGxvY2sgdGhlXG4gKiBzYWZldHktbmV0IGRpc3BlbnNlciBpcyBhcmd1ZWQgYXQgdGhlIHR1cm5zdGlsZSBpdHNlbGYuXG4gKi9cbmZ1bmN0aW9uIGdhdGVzT24oXG4gIGtpbmQ6IERlbGl2ZXJ5S2luZCxcbiAgaW5kZXg6IG51bWJlcixcbiAgb3RoZXJJbmRleDogbnVtYmVyLFxuICBvdGhlcjogRGVsaXZlcnlCYXJyaWVyRW50cnlcbik6IGJvb2xlYW4ge1xuICBpZiAob3RoZXJJbmRleCA+PSBpbmRleCB8fCAhREVGRVJfQkVISU5EW2tpbmRdLmluY2x1ZGVzKG90aGVyLmtpbmQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEEgc3RlcCBza2lwcyBhbiBVTkFSTUVEIGVhcmxpZXIgZW50cnkgKGFuIHVuY2xhaW1lZCBidWZmZXJlZCBob29rXG4gIC8vIHBheWxvYWQpLiBTZWUgdGhlIGFzeW1tZXRyeSBkZXNjcmliZWQgb24gYGF3YWl0RWFybGllckRlbGl2ZXJpZXNgLiBUaGVcbiAgLy8gc2tpcCBpcyBkaXJlY3QsIG5ldmVyIHRyYW5zaXRpdmU6IGFybWVkIGVudHJpZXMgYXJlIHN0aWxsIGdhdGVkIG9uLCBldmVuXG4gIC8vIHdoZW4gdGhleSBhcmUgdGhlbXNlbHZlcyBwYXJrZWQgYmVoaW5kIHN1Y2ggYSBwYXlsb2FkLlxuICByZXR1cm4gIShraW5kID09PSAnc3RlcCcgJiYgIW90aGVyLmFybWVkKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBlbnRyeWAgd2lsbCByZXNvbHZlIG9uIGl0cyBvd246IGl0IGlzIGFybWVkLCBhbmQgZXZlcnkgZWFybGllclxuICogZGVsaXZlcnkgaXQgYWN0dWFsbHkgZ2F0ZXMgb24gKHtAbGluayBnYXRlc09ufSkgd2lsbCBsaWtld2lzZSByZXNvbHZlIG9uIGl0c1xuICogb3duLlxuICpcbiAqIEEgc3RlcCBkb2VzIG5vdCBnYXRlIG9uIGFuIHVuY2xhaW1lZCBidWZmZXJlZCBwYXlsb2FkLCBzbyBzdWNoIGEgcGF5bG9hZFxuICogY2Fubm90IGtlZXAgaXQgZnJvbSByZXNvbHZpbmcuIEEgc3RlcCBET0VTIGdhdGUgb24gZWFybGllciBhcm1lZCB3YWl0cyBhbmRcbiAqIGhvb2tzLCBzbyBvbmUgcGFya2VkIGJlaGluZCBhbiB1bmNsYWltZWQgcGF5bG9hZCBtYWtlcyB0aGUgc3RlcFxuICogbm9uLXNlbGYtcmVzb2x2aW5nIGluIHR1cm4uIERpc2FncmVlaW5nIHdpdGgge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9XG4gKiBoZXJlIHdvdWxkIG5vdCBiZSBhIGNvc21ldGljIHByb2JsZW06IHRoaXMgcHJlZGljYXRlIGlzIHdoYXRcbiAqIHtAbGluayBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeX0gdXNlcyB0byBkZWNpZGUgd2hldGhlciBpZGxlIGlzIHJlYWNoYWJsZSxcbiAqIGFuZCBhbiBlbnRyeSByZXBvcnRlZCBzZWxmLXJlc29sdmluZyB3aGlsZSBpdCBpcyBpbiBmYWN0IHBhcmtlZCBiZWhpbmQgYVxuICogcGF5bG9hZCB0aGF0IG9ubHkgdGhlIGlkbGUgc2FmZXR5IG5ldCBjYW4gcmV0aXJlIHdvdWxkIGdhdGUgaXRzIG93blxuICogcmV0aXJlbWVudC5cbiAqXG4gKiBSZWN1cnNpb24gdGVybWluYXRlcyBiZWNhdXNlIGV2ZXJ5IGVkZ2UgcG9pbnRzIHRvIGEgc3RyaWN0bHkgc21hbGxlciBpbmRleC5cbiAqIGBtZW1vYCBrZWVwcyB0aGUgd2FsayBsaW5lYXIgaW4gcmVnaXN0cnkgc2l6ZSwgYW5kIHRoZSByZWdpc3RyeSBpcyBub3Qgc21hbGxcbiAqIGJ5IGNvbnN0cnVjdGlvbjogYEV2ZW50c0NvbnN1bWVyYCBkcmFpbnMgY29uc2VjdXRpdmVseSBjb25zdW1hYmxlIGV2ZW50c1xuICogc3luY2hyb25vdXNseSB3aGlsZSBiYXJyaWVycyBvbmx5IHJldGlyZSBvbiBtaWNyb3Rhc2stZHJpdmVuIGRlbGl2ZXJpZXMsIHNvXG4gKiBhIGZhbi1vdXQgb2YgYFByb21pc2UucmFjZShbaG9vaywgc2xlZXBdKWAgYnJhbmNoZXMgYWNjdW11bGF0ZXMgb25lIGJhcnJpZXJcbiAqIHBlciBicmFuY2ggcGVyIGtpbmQuIFRoZSBtZW1vIE1VU1QgYmUgcGVyLWNhbGw6IGBhcm1lZGAgbXV0YXRlcyBiZXR3ZWVuXG4gKiBjYWxscyBhcyBidWZmZXJlZCBwYXlsb2FkcyBhcmUgY2xhaW1lZC5cbiAqXG4gKiBUaGUgbWVtbyBpcyBhbiBvcHRpbWl6YXRpb24sIG5vdCBhIGNvcnJlY3RuZXNzIHJlcXVpcmVtZW50LiBJdCBvbmNlIHdhcyBvbmU6XG4gKiBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2AgdXNlZCB0byBydW4gdGhpcyB3YWxrIGZvciBldmVyeSBlYXJsaWVyIGVudHJ5IG9mIGFcbiAqIHN0ZXAgZGVsaXZlcnksIHdpdGggbm8gZWFybHkgZXhpdCwgd2hpY2ggdW5tZW1vaXplZCBpcyBUKG4pID0gzqMgVChqKSxcbiAqIG1lYXN1cmVkIGF0IDQuM2U4IHJlY3Vyc2l2ZSBjYWxscyAoODRzKSBmb3IgNDAgYWx0ZXJuYXRpbmcgYXJtZWQgaG9vay93YWl0XG4gKiBiYXJyaWVycy4gVGhhdCBjYWxsIHNpdGUgaXMgZ29uZTsgYSBzdGVwIG5vdyB0ZXN0cyBgYXJtZWRgIGRpcmVjdGx5LiBUaGUgb25lXG4gKiBzdXJ2aXZpbmcgY2FsbGVyLCB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9LCBjYW5ub3QgcmVhY2ggdGhhdFxuICogc2hhcGU6IGl0IHJldHVybnMgYXQgdGhlIEZJUlNUIHNlbGYtcmVzb2x2aW5nIGVudHJ5LCBzbyBpdCBvbmx5IGV2ZXJcbiAqIGFkdmFuY2VzIHBhc3QgZW50cmllcyB0aGF0IGFyZSBub24tc2VsZi1yZXNvbHZpbmcsIGFuZCB0aG9zZSBzaG9ydC1jaXJjdWl0XG4gKiBvbiB0aGVpciBmaXJzdCBmYWxzZSBjaGlsZC4gRXZlcnkgZW50cnkgaXQgZXZhbHVhdGVzIHRoZXJlZm9yZSBoYXNcbiAqIGFsbC1mYWxzZSBwcmVkZWNlc3NvcnMgYW5kIHJldHVybnMgYWZ0ZXIgb25lIGNoaWxkLCBkZWdlbmVyYXRpbmcgdGhlIHdhbGsgdG9cbiAqIGEgY2hhaW4gKG1lYXN1cmVkOiA5OCBjYWxscyB1bm1lbW9pemVkIGZvciB0aGUgd29yc3QgNDAtYmFycmllciBzaGFwZSwgMVxuICogY2FsbCBmb3IgdGhlIHJlZ2lzdHJ5IGFib3ZlKS4gRG8gbm90IHJlc3RvcmUgYW4gZXhwb25lbnRpYWwgY2xhaW0gaGVyZVxuICogd2l0aG91dCByZXN0b3JpbmcgYSBjYWxsZXIgdGhhdCBjYW4gcHJvZHVjZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZXNPbkl0c093bihcbiAgYmFycmllcnM6IE1hcDxudW1iZXIsIERlbGl2ZXJ5QmFycmllckVudHJ5PixcbiAgaW5kZXg6IG51bWJlcixcbiAgZW50cnk6IERlbGl2ZXJ5QmFycmllckVudHJ5LFxuICBtZW1vOiBNYXA8bnVtYmVyLCBib29sZWFuPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNhY2hlZCA9IG1lbW8uZ2V0KGluZGV4KTtcbiAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjb21wdXRlUmVzb2x2ZXNPbkl0c093bihiYXJyaWVycywgaW5kZXgsIGVudHJ5LCBtZW1vKTtcbiAgbWVtby5zZXQoaW5kZXgsIHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVSZXNvbHZlc09uSXRzT3duKFxuICBiYXJyaWVyczogTWFwPG51bWJlciwgRGVsaXZlcnlCYXJyaWVyRW50cnk+LFxuICBpbmRleDogbnVtYmVyLFxuICBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnksXG4gIG1lbW86IE1hcDxudW1iZXIsIGJvb2xlYW4+XG4pOiBib29sZWFuIHtcbiAgaWYgKCFlbnRyeS5hcm1lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtvdGhlckluZGV4LCBvdGhlcl0gb2YgYmFycmllcnMpIHtcbiAgICBpZiAoIWdhdGVzT24oZW50cnkua2luZCwgaW5kZXgsIG90aGVySW5kZXgsIG90aGVyKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghcmVzb2x2ZXNPbkl0c093bihiYXJyaWVycywgb3RoZXJJbmRleCwgb3RoZXIsIG1lbW8pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEF3YWl0cywgaW4gc3RyaWN0IGV2ZW50LWxvZyBvcmRlciwgZXZlcnkgc3RpbGwtcmVnaXN0ZXJlZCBkZWxpdmVyeSB0aGF0IGlzXG4gKiBlYXJsaWVyIGluIHRoZSBsb2cgdGhhbiBgZXZlbnRJbmRleGAgYW5kIHRoYXQgYSBkZWxpdmVyeSBvZiBga2luZGAgZGVmZXJzXG4gKiBiZWhpbmQgKHNlZSB7QGxpbmsgREVGRVJfQkVISU5EfSksIHNvIHRoYXQgdGhpcyByZXNvbHV0aW9uIGlzIGhhbmRlZCB0byB0aGVcbiAqIHdvcmtmbG93IG9ubHkgYWZ0ZXIgYWxsIHJlbGV2YW50IGVhcmxpZXItaW4tbG9nIGRlbGl2ZXJpZXMgaGF2ZSBiZWVuLiBUaGlzXG4gKiBpcyB3aGF0IGtlZXBzIGEgYFByb21pc2UucmFjZWAgKG9yIHRoZSBVTElEIGEgZm9sbG93LXVwIGB1c2VTdGVwYCBkcmF3cyBvblxuICogYSBjb25jdXJyZW50IGJyYW5jaCkgZGV0ZXJtaW5pc3RpYyBhbmQgYWxpZ25lZCB3aXRoIHRoZSBjb21taXR0ZWQgZXZlbnRcbiAqIGxvZywgaW5kZXBlbmRlbnQgb2YgbWljcm90YXNrLWhvcCBjb3VudHMsIGh5ZHJhdGlvbiB0aW1lLCBvciByYWNlLWFyZ3VtZW50XG4gKiBvcmRlci4gV2hlbiB0aGlzIGRlbGl2ZXJ5IGRvZXMgaGF2ZSB0byB3YWl0LCBpdCBhbHNvIHlpZWxkcyBhIG1hY3JvdGFza1xuICogYWZ0ZXJ3YXJkcyBzbyB0aGUgZWFybGllciBkZWxpdmVyeSdzIGNvbnN1bWVyIGNhbiBydW4gdG8gaXRzIG93biBuZXh0XG4gKiBzdXNwZW5zaW9uIHBvaW50IGZpcnN0OyBzZWUgdGhlIGNvbW1lbnQgYXQgdGhhdCBgYXdhaXRgIGZvciB3aHkgb3JkZXJpbmcgdGhlXG4gKiBgcmVzb2x2ZSgpYCBjYWxscyBhbG9uZSBpcyBub3QgZW5vdWdoLlxuICpcbiAqIFdoYXQgY291bnRzIGFzIFwiZGVmZXJzIGJlaGluZFwiIGlzIHtAbGluayBnYXRlc09ufSwgc2hhcmVkIHdpdGhcbiAqIHtAbGluayBjb21wdXRlUmVzb2x2ZXNPbkl0c093bn0gc28gdGhlIHR3byBjYW5ub3QgZHJpZnQuXG4gKlxuICogT25lIGFzeW1tZXRyeTogYSBTVEVQIHJlc3VsdCBza2lwcyBhbnkgZWFybGllciBkZWxpdmVyeSB0aGF0IGlzIFVOQVJNRUQsXG4gKiBpLmUuIGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkIG5vIGNvbnN1bWVyIGhhcyBjbGFpbWVkLiBTdWNoIGEgcGF5bG9hZCBpc1xuICogZGVsaXZlcmVkIG9ubHkgd2hlbiB0aGUgd29ya2Zsb3cgbmV4dCByZWFkcyB0aGUgaG9vaywgYW5kIHJlYWNoaW5nIHRoYXQgcmVhZFxuICogb2Z0ZW4gcmVxdWlyZXMgdGhlIHN0ZXAgcmVzdWx0IGl0c2VsZiAoYGF3YWl0IHN0ZXBYKClgIGJlZm9yZSB0aGVcbiAqIHJlYWQpLiBHYXRpbmcgdGhlIHN0ZXAgb24gaXQgd291bGQgc3RhbGwgdGhlIHdvcmtmbG93IHVudGlsIHRoZSBiYXJyaWVyJ3NcbiAqIGlkbGUgc2FmZXR5IG5ldCBmaXJlcywgd2hpY2ggdGhlbiByZWxlYXNlcyBldmVyeSBkZWxpdmVyeSBxdWV1ZWQgYmVoaW5kIHRoYXRcbiAqIHBheWxvYWQgYXQgb25jZSwgbG9zaW5nIGV4YWN0bHkgdGhlIHJhY2UgdGhpcyBvcmRlcmluZyBleGlzdHMgdG8gcHJvdGVjdC5cbiAqIFdhaXRzIGFuZCBob29rcyBrZWVwIGdhdGluZyBvbiB1bmNsYWltZWQgcGF5bG9hZHM6IGZvciB0aGVtLCB3YWl0aW5nIGZvciB0aGVcbiAqIGNsYWltIElTIHRoZSBvcmRlcmluZyBndWFyYW50ZWUgKGEgYHdhaXRfY29tcGxldGVkYCBtdXN0IG5vdCBwcmVlbXB0IGFcbiAqIHBheWxvYWQgdGhlIGxvZyBvcmRlcmVkIGZpcnN0KS5cbiAqXG4gKiBUaGUgc2tpcCBpcyBkaXJlY3QsIG5ldmVyIHRyYW5zaXRpdmUuIEEgc3RlcCBzdGlsbCBnYXRlcyBvbiBhbiBlYXJsaWVyIEFSTUVEXG4gKiB3YWl0IG9yIGhvb2ssIGluY2x1ZGluZyBvbmUgdGhhdCBpcyBpdHNlbGYgcGFya2VkIGJlaGluZCBhbiB1bmNsYWltZWRcbiAqIHBheWxvYWQuIFNraXBwaW5nIHRob3NlIHRvbyB3b3VsZCBpbnZlcnQgbG9nIG9yZGVyIGZvciB0aGUgY29tbW9uZXN0IHNoYXBlXG4gKiB0aGVyZSBpczogYSB3b3JrZmxvdyB0aGF0IGNyZWF0ZXMgYSBob29rIGl0IGRvZXMgbm90IHJlYWQgb24gdGhpcyBicmFuY2gsXG4gKiByYWNlcyBgc3RlcGAgYWdhaW5zdCBgc2xlZXBgLCBhbmQgaGFzIHRoZSBsb2cgc2F5IHRoZSBzbGVlcCB3b24uIFRoZSBzdGVwXG4gKiB3b3VsZCB0aGVuIG92ZXJ0YWtlIHRoZSB3YWl0LCBib3RoIGJyYW5jaGVzIHdvdWxkIHN3YXAgdGhlIGNvcnJlbGF0aW9uIGlkc1xuICogdGhleSBkcmF3IG5leHQsIGFuZCByZXBsYXkgd291bGQgZGl2ZXJnZS4gU2VlXG4gKiBgc3RlcC1kZWxpdmVyeS1vcmRlcmluZy50ZXN0LnRzYC4gV2FpdGluZyBpbnN0ZWFkIGlzIHNhZmUgYmVjYXVzZSB0aGVcbiAqIHBheWxvYWQncyBvd24gaWRsZSBzYWZldHkgbmV0IHJldGlyZXMgaXQgYW5kIHRoZSB3aG9sZSBjaGFpbiB0aGVuIGRlbGl2ZXJzXG4gKiBpbiBsb2cgb3JkZXI7IHtAbGluayBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeX0gZGVsaWJlcmF0ZWx5IHJlcG9ydHMgc3VjaCBhXG4gKiBzdGVwIGFzIG5vdCBzZWxmLXJlc29sdmluZyBzbyB0aGF0IGlkbGUgc3RheXMgcmVhY2hhYmxlLlxuICpcbiAqIFwiVGhlIHdob2xlIGNoYWluIHRoZW4gZGVsaXZlcnMgaW4gbG9nIG9yZGVyXCIgcmVzdHMgb24gdGhlIFBBWUxPQUQncyBiYXJyaWVyXG4gKiBiZWluZyByZXRpcmVkIGJlZm9yZSB0aGF0IG9mIGFueXRoaW5nIHBhcmtlZCBiZWhpbmQgaXQuIFRoYXQgb3JkZXIgaXNcbiAqIHN0cnVjdHVyYWw6IHNhZmV0eS1uZXQgcmV0aXJlbWVudHMgZ28gdGhyb3VnaCBvbmUgcGVyLWNvbnRleHQgZGlzcGVuc2VyIHRoYXRcbiAqIG9ubHkgZXZlciByZXRpcmVzIHRoZSBsb3dlc3QtaW5kZXggZW50cnkgYXQgZGVsaXZlcnkgaWRsZSwgYW5kIGV2ZXJ5XG4gKiByZXRpcmVtZW50IHRoYXQgd2FrZXMgYSBjaGFpbiBmbGlwcyB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9IGJhY2tcbiAqIHRvIHRydWUsIHJlLWJsb2NraW5nIHRoZSBkaXNwZW5zZXIgdW50aWwgdGhlIGNoYWluIGhhcyBkcmFpbmVkLiBTZWVcbiAqIHtAbGluayBlbnN1cmVCYXJyaWVyU2FmZXR5TmV0fS4gKFRoaXMgdXNlZCB0byByZXN0IG9uIHRoZSBGSUZPIG9mIG9uZSBpZGxlXG4gKiBwb2xsIHBlciBiYXJyaWVyLCB3aGljaCBoZWxkIGZvciBhIHNpbmdsZSBwYXJrZWQgc2VnbWVudCBidXQgZGVjYXllZCB0b1xuICogdGltaW5nIG5vaXNlIHdpdGggc2V2ZXJhbDogdGhlIHJlbGVhc2Ugb3JkZXIsIGFuZCB0aGVyZWZvcmUgdGhlIFVMSURzXG4gKiBkcmF3biBieSB0aGUgd29rZW4gYnJhbmNoZXMsIHRoZW4gZGVwZW5kZWQgb24gaG93IG11Y2ggbG9nIHRoZSByZXBsYXkgaGFkXG4gKiBsb2FkZWQuIHN0b3JtLWxvZy1yZXBsYXkudGVzdC50cyByZXBsYXlzIGEgcHJvZHVjdGlvbiBsb2cgY29ycnVwdGVkIGV4YWN0bHlcbiAqIHRoYXQgd2F5LilcbiAqL1xuLyoqXG4gKiBXaGV0aGVyIGNvcnJlbGF0aW9uLWlkIGRyYXcgb3JkZXIgaXMgcGlubmVkIHRvIGV2ZW50LWxvZyBvcmRlci4gRGVmYXVsdCBPTjpcbiAqIG9ubHkgdGhlIGxpdGVyYWwgc3RyaW5nIGBXT1JLRkxPV19MT0dfT1JERVJfRFJBV1M9MGAgb3B0cyBvdXQuIGA9ZmFsc2VgLFxuICogYD1vZmZgLCBhbmQgZXZlcnkgb3RoZXIgdmFsdWUga2VlcCBpdCBlbmFibGVkLiBSZWFkIHBlciBjYWxsIHNvIHRlc3RzIGNhblxuICogZmxpcCBpdC5cbiAqXG4gKiBPZmYsIGEgZGVsaXZlcnkgdGhhdCBoYWQgdG8gZGVmZXIgeWllbGRzIE9ORSBtYWNyb3Rhc2sgYWZ0ZXIgaXRzXG4gKiBwcmVkZWNlc3NvcnMgcmVzb2x2ZS4gVGhpcyBpcyBlbm91Z2ggZm9yIHNob3J0IGNvbnN1bWVycywgYnV0IGEgd29rZW4gYnJhbmNoXG4gKiB3aG9zZSBwYXRoIHRvIGl0cyBuZXh0IGRyYXcgY3Jvc3NlcyBtb3JlIGhvcHMgKGEgYFByb21pc2UucmFjZWAgcmVzb2x1dGlvbiwgYVxuICogdXNlci1sZXZlbCBzZW1hcGhvcmUsIGFuIGFzeW5jLWl0ZXJhdG9yIHJlYWQpIGNhbiBzdGlsbCBiZSBvdmVydGFrZW4gYnkgYVxuICogbGF0ZXItaW4tbG9nIGRlbGl2ZXJ5J3Mgc2hvcnRlciBjYXNjYWRlLCBzbyB0aGUgcnVuJ3MgZHJhdyBvcmRlciwgaW5jbHVkaW5nXG4gKiBpdHMgY29ycmVsYXRpb24gaWRzLCBkZXBlbmRzIG9uIGhvdyBtdWNoIGxvZyB0aGlzIHJlcGxheSBsb2FkZWQuXG4gKiBPbiwgdGhlIHlpZWxkIGJlY29tZXMgYSBmaXhwb2ludDogdGhlIGRlbGl2ZXJ5IHJlc29sdmVzIG9ubHkgb25jZSBldmVyeVxuICogZWFybGllciBjYXNjYWRlIGhhcyBxdWllc2NlZCwgbWFraW5nIHRoZSBkcmF3IHNlcXVlbmNlIGEgcHVyZSBmdW5jdGlvbiBvZlxuICogdGhlIGRlbnNlIGxvZywgc3RhYmxlIHVuZGVyIHByZWZpeCBleHRlbnNpb24sIGFuZCBjb25jdXJyZW50IHdyaXRlcnMnXG4gKiBkdXBsaWNhdGUgY3JlYXRlcyBpZGVudGljYWwgKGRlZHVwZWQpIGluc3RlYWQgb2YgY29sbGlkaW5nLlxuICovXG5mdW5jdGlvbiBpc0xvZ09yZGVyRHJhd3NFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTE9HX09SREVSX0RSQVdTICE9PSAnMCc7XG59XG5cbi8qKlxuICogT25lIHF1aWVzY2VuY2UgdHVybjogbGV0cyB0aGUgZW50aXJlIHBlbmRpbmcgbWljcm90YXNrIHF1ZXVlIGRyYWluLCB0aGVuXG4gKiB5aWVsZHMgdG8gdGhlIGV2ZW50IGxvb3Agb25jZS4gYHNldEltbWVkaWF0ZWAgKGNoZWNrIHBoYXNlKSBpcyB1c2VkIHdoZXJlXG4gKiBhdmFpbGFibGUgYmVjYXVzZSBOb2RlIGNsYW1wcyBgc2V0VGltZW91dCgwKWAgdG8gfjFtcyB3aGlsZSBgc2V0SW1tZWRpYXRlYFxuICogY29zdHMgfjIwwrVzLiBFdmVyeSBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgcGF5cyB0aGlzIHR1cm4gYXQgbGVhc3RcbiAqIG9uY2UsIHNvIG9uIGEgc2VxdWVudGlhbCByZXBsYXkgdGhlIGNsYW1wIGlzIHRoZSB3aG9sZSBjb3N0LiBUaW1lcnMgc3RpbGxcbiAqIHJ1biBiZXR3ZWVuIGNvbnNlY3V0aXZlIHR1cm5zICh0aGUgbG9vcCByZS1lbnRlcnMgdGhlIGV2ZW50IGxvb3AgZWFjaFxuICogaXRlcmF0aW9uLCBwYXNzaW5nIHRocm91Z2ggdGhlIHRpbWVycyBwaGFzZSksIHNvIGNoYWlucyBwYXJrZWQgb24gdGhlXG4gKiBzYWZldHktbmV0IGRpc3BlbnNlcidzIGBzZXRUaW1lb3V0YCBjYWRlbmNlIGFyZSBub3Qgc3RhcnZlZC5cbiAqL1xuZnVuY3Rpb24gcXVpZXNjZW5jZVR1cm4oZGVsYXlNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkZWxheU1zID09PSAwICYmIHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldEltbWVkaWF0ZShyZXNvbHZlKSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5TXMpKTtcbn1cblxuLyoqXG4gKiBXYWl0cyB1bnRpbCB0aGUgd29ya2Zsb3cgY2FuIG1ha2Ugbm8gZnVydGhlciBwcm9ncmVzcyB3aXRob3V0IGFub3RoZXJcbiAqIGRlbGl2ZXJ5OiByZXBlYXRlZCAocHJvbWlzZS1xdWV1ZSBkcmFpbiArIGV2ZW50LWxvb3AgdHVybilzIHVudGlsIGEgZnVsbFxuICogdHVybiBwYXNzZXMgd2l0aCBubyBuZXcgVUxJRCBkcmF3cyBhbmQgbm8gaHlkcmF0aW9uIGluIGZsaWdodC5cbiAqXG4gKiBUZXJtaW5hdGlvbjogZWFjaCBleHRyYSBpdGVyYXRpb24gcmVxdWlyZXMgYSBuZXcgVUxJRCBkcmF3IG9yIGEgaHlkcmF0aW9uXG4gKiBzdGFydGVkIGluIHRoZSBwcmV2aW91cyB0dXJuLiBgbWludENvdW50YCBjb3VudHMgRVZFUlkgZHJhdyBmcm9tIHRoZSBydW4nc1xuICogc2VxdWVuY2UsIGluY2x1ZGluZyBjb3JyZWxhdGlvbiBpZHMgYW5kIHNlcmlhbGl6YXRpb24tZHJpdmVuIGRyYXdzIChzdHJlYW1cbiAqIGlkcyBtaW50ZWQgdGhyb3VnaCB0aGUgYFNUQUJMRV9VTElEYCBnbG9iYWwgd2hpbGUgZGVoeWRyYXRpbmcpLiBUaGlzIGlzXG4gKiBjb25zZXJ2YXRpdmUgaW4gdGhlIHNhZmUgZGlyZWN0aW9uOiBzZXJpYWxpemF0aW9uIGRyYXdzIG9ubHkgZXh0ZW5kIHRoZVxuICogd2FpdCwgYW5kIGJvdGggYm9keSBwcm9ncmVzcyBhbmQgdGhlIHNlcmlhbGl6YXRpb24gd29yayBvbmUgY2FzY2FkZSBjYW5cbiAqIHNjaGVkdWxlIGFyZSBmaW5pdGUgYmV0d2VlbiBkZWxpdmVyaWVzLCBzbyB0aGUgZml4cG9pbnQgaXMgcmVhY2hlZC4gVGhlXG4gKiBsb29wIGhvbGRzIHRoaXMgZGVsaXZlcnkncyBvd24gYmFycmllciByZWdpc3RlcmVkIChpdHMgYG1hcmtEZWxpdmVyZWRgIGhhc1xuICogbm90IHJ1biksIHNvIGBpc0RlbGl2ZXJ5SWRsZWAgc3RheXMgZmFsc2UgYW5kIG5vIHN1c3BlbnNpb24gY2FuIHByZWVtcHQgdGhlXG4gKiBjYXNjYWRlIGJlaW5nIHdhaXRlZCBvdXQuXG4gKlxuICogQSByZWplY3RlZCBgcHJvbWlzZVF1ZXVlYCBzZXR0bGVzIGltbWVkaWF0ZWx5IGFuZCBmb3JldmVyLCBzbyBsb29waW5nIGF0XG4gKiB0aGUgbm9ybWFsIGNhZGVuY2Ugb24gYSBmYWlsZWQgcnVuIHdvdWxkIGRlZ2VuZXJhdGUgaW50byBhIGJ1c3kgbG9vcCAodGhlXG4gKiBzYW1lIGhhemFyZCB7QGxpbmsgZW5zdXJlQmFycmllclNhZmV0eU5ldH0gZG9jdW1lbnRzKS4gSXRlcmF0aW9ucyB0aGF0XG4gKiBvYnNlcnZlIHRoZSBxdWV1ZSByZWplY3RlZCBiYWNrIG9mZiB0byBhIDUwbXMgdGljayBpbnN0ZWFkLlxuICovXG5hc3luYyBmdW5jdGlvbiBxdWllc2NlRWFybGllckNhc2NhZGVzKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgZXZlbnRJbmRleDogbnVtYmVyXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IG1pbnRzQmVmb3JlID0gY3R4Lm1pbnRDb3VudCA/PyAwO1xuICAgIGNvbnN0IHBlbmRpbmdCZWZvcmUgPSBjdHgucGVuZGluZ0RlbGl2ZXJpZXM7XG4gICAgLy8gU2V0dGxlZCBvciByZWplY3RlZCwgdGhlIHF1ZXVlIHNuYXBzaG90IG9ubHkgb3JkZXJzIHVzIGJlaGluZCB3b3JrXG4gICAgLy8gYWxyZWFkeSBjaGFpbmVkOyBhIHJlamVjdGlvbiBpcyB0aGUgcnVuIGZhaWxpbmcgZWxzZXdoZXJlLlxuICAgIGNvbnN0IHF1ZXVlUmVqZWN0ZWQgPSBhd2FpdCBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oXG4gICAgICAoKSA9PiBmYWxzZSxcbiAgICAgICgpID0+IHRydWVcbiAgICApO1xuICAgIGF3YWl0IHF1aWVzY2VuY2VUdXJuKHF1ZXVlUmVqZWN0ZWQgPyA1MCA6IDApO1xuICAgIGlmIChcbiAgICAgIChjdHgubWludENvdW50ID8/IDApICE9PSBtaW50c0JlZm9yZSB8fFxuICAgICAgcGVuZGluZ0JlZm9yZSAhPT0gMCB8fFxuICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzICE9PSAwXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gUXVpZXQgaXMgbm90IGVub3VnaCBvbiBpdHMgb3duOiBzZXZlcmFsIGRlbGl2ZXJ5IGNoYWlucyBjYW4gYmUgc2l0dGluZ1xuICAgIC8vIGluIHRoaXMgbG9vcCBhdCBvbmNlLCBhbmQgbGV0dGluZyB0aGUgZmlyc3QgcXVpZXQgb2JzZXJ2YXRpb24gcmVzb2x2ZVxuICAgIC8vIHdvdWxkIGJyZWFrIHRoZSB0aWUgYnkgdGltZXIgYXJyaXZhbC4gVGhpcyBtb2RlIHJlbW92ZXMgdGhhdCBhcnJpdmFsLW9yZGVyXG4gICAgLy8gZGVwZW5kZW5jZS4gQSBsb3dlci1pbmRleCBBUk1FRCBiYXJyaWVyIGlzIGEgZGVsaXZlcnkgY29tbWl0dGVkIHRvXG4gICAgLy8gaGFwcGVuaW5nIHRoYXQgaGFzIG5vdCBoYXBwZW5lZCB5ZXQsIHNvIHRoaXMgb25lIGtlZXBzIHdhaXRpbmcuIFVuYXJtZWRcbiAgICAvLyBlbnRyaWVzIChidWZmZXJlZCBwYXlsb2FkcyBub2JvZHkgaGFzIGNsYWltZWQpIGRvIG5vdCBibG9jaywgZXhhY3RseSBhc1xuICAgIC8vIGluIGBnYXRlc09uYDogdGhlaXIgaGFuZG92ZXIgaXMgY2xhaW0tZHJpdmVuLCB3aGljaCBpcyBib2R5LXBvc2l0aW9uXG4gICAgLy8gZGV0ZXJtaW5lZCBhbmQgdGhlcmVmb3JlIGFscmVhZHkgYSBmdW5jdGlvbiBvZiB0aGUgcHJlZml4LlxuICAgIC8vXG4gICAgLy8gVGhpcyBpcyBkZWxpYmVyYXRlbHkgYSBXSURFUiB3YWl0cy1mb3IgcmVsYXRpb24gdGhhbiBgZ2F0ZXNPbmAgKHdoaWNoLFxuICAgIC8vIGUuZy4sIGV4Y2x1ZGVzIHdhaXTihpJ3YWl0KTogdW5kZXIgbG9nLW9yZGVyIGRyYXdzIEVWRVJZIGJyYW5jaC1kZWNpZGluZ1xuICAgIC8vIGRlbGl2ZXJ5IG11c3QgcmVzb2x2ZSBpbiBsb2cgb3JkZXIsIGtpbmRzIGluY2x1ZGVkLiBUaGUgd2lkdGggaXMgc2FmZVxuICAgIC8vIGFnYWluc3QgdGhlIGRpc3BlbnNlciBkZWFkbG9jayB0aGF0IGByZXNvbHZlc09uSXRzT3duYCBndWFyZHMsIGJlY2F1c2VcbiAgICAvLyB0aGUgb25lIGVkZ2UgdGhlIHdpZGVyIHJlbGF0aW9uIGFkZHMgKHdhaXRpbmcgb24gYW4gYXJtZWQgZW50cnkgdGhhdFxuICAgIC8vIGdhdGVzT24gZG9lcyBub3QgbW9kZWwpIGFsd2F5cyBib3R0b21zIG91dCBhdCB0aGUgc2FtZSB1bmFybWVkIHBheWxvYWQ6XG4gICAgLy8gYSBsb3dlciBhcm1lZCBXQUlUIGlzIG5vbi1zZWxmLXJlc29sdmluZyBvbmx5IHdoZW4gaXQgaXMgKHRyYW5zaXRpdmVseSlcbiAgICAvLyBwYXJrZWQgYmVoaW5kIGFuIHVuY2xhaW1lZCBidWZmZXJlZCBwYXlsb2FkLCBhbmQgYSB3YWl0IGdhdGVzIG9uIGV2ZXJ5XG4gICAgLy8gbG93ZXIgaG9vayBhbmQgc3RlcCBkaXJlY3RseSwgc28gdGhlIHNwaW5uZXIgaGVyZSBhbHNvIGdhdGVzIG9uIHRoYXRcbiAgICAvLyBwYXlsb2FkIHRocm91Z2ggYGdhdGVzT25gIGFuZCBpcyBpdHNlbGYgcmVwb3J0ZWQgbm9uLXNlbGYtcmVzb2x2aW5nLlxuICAgIC8vIFRoZSBkaXNwZW5zZXIgdGhlcmVmb3JlIHN0YXlzIHVuYmxvY2tlZCBhbmQgcmV0aXJlcyB0aGUgY2hhaW4gaGVhZDsgc2VlXG4gICAgLy8gdGhlIHBhcmtlZC1jaGFpbiB0ZXN0IGluIGRlbGl2ZXJ5LWJhcnJpZXItY292ZXJhZ2UudGVzdC50cy5cbiAgICBsZXQgbG93ZXJBcm1lZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzID8/IFtdKSB7XG4gICAgICBpZiAoaW5kZXggPCBldmVudEluZGV4ICYmIGVudHJ5LmFybWVkKSB7XG4gICAgICAgIGxvd2VyQXJtZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFsb3dlckFybWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgZXZlbnRJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBraW5kOiBEZWxpdmVyeUtpbmRcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBEZWZlbnNpdmU6IHRvbGVyYXRlIGNvbnRleHRzIHRoYXQgcHJlZGF0ZSB0aGlzIGZpZWxkICh0ZXN0IGhhcm5lc3NlcykuXG4gIGlmIChldmVudEluZGV4ID09PSB1bmRlZmluZWQgfHwgIWN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBiYXJyaWVycyA9IGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycztcbiAgY29uc3QgZWFybGllcjogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgYmFycmllcnMpIHtcbiAgICBpZiAoIWdhdGVzT24oa2luZCwgZXZlbnRJbmRleCwgaW5kZXgsIGVudHJ5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGVhcmxpZXIucHVzaChlbnRyeS5yZWxlYXNlZCk7XG4gIH1cbiAgaWYgKGVhcmxpZXIubGVuZ3RoID4gMCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGVhcmxpZXIpO1xuICB9XG4gIGlmIChpc0xvZ09yZGVyRHJhd3NFbmFibGVkKCkpIHtcbiAgICAvLyBVbmNvbmRpdGlvbmFsLCBub3QganVzdCB3aGVuIGEgYmFycmllciB3YXMgc3RpbGwgcmVnaXN0ZXJlZDogYW4gZWFybGllclxuICAgIC8vIGRlbGl2ZXJ5J3MgYmFycmllciBkZXJlZ2lzdGVycyB3aGVuIGl0cyByZXNvbHZlKCkgcnVucywgYnV0IHRoZSBicmFuY2hcbiAgICAvLyBpdCB3b2tlIG1heSBzdGlsbCBiZSBob3BzIGF3YXkgZnJvbSBpdHMgbmV4dCBkcmF3LiBBIGxhdGVyIGRlbGl2ZXJ5XG4gICAgLy8gY29uc3VtZWQgYWZ0ZXIgdGhhdCBkZXJlZ2lzdHJhdGlvbiBzZWVzIGFuIGVtcHR5IGdhdGUgc2V0LCBhbmQgd2l0aG91dFxuICAgIC8vIHRoaXMgaXQgd291bGQgcmVzb2x2ZSBtaWQtY2FzY2FkZSBhbmQgb3ZlcnRha2UgdGhlIGRyYXcuIFRoaXMgaXMgdGhlIGV4YWN0XG4gICAgLy8gYXJyaXZhbC1vcmRlciBkZXBlbmRlbmNlIHRoaXMgbW9kZSBleGlzdHMgdG8gcmVtb3ZlLiBDb3N0cyBvbmUgcXVpZXRcbiAgICAvLyBtYWNyb3Rhc2sgdHVybiB3aGVuIG5vdGhpbmcgaXMgaW4gZmxpZ2h0LlxuICAgIGF3YWl0IHF1aWVzY2VFYXJsaWVyQ2FzY2FkZXMoY3R4LCBldmVudEluZGV4KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVhcmxpZXIubGVuZ3RoID4gMCkge1xuICAgIC8vIEFuIGVhcmxpZXIgZGVsaXZlcnkgYmVpbmcgXCJkZWxpdmVyZWRcIiBvbmx5IG1lYW5zIGl0cyBgcmVzb2x2ZSgpYCByYW4uXG4gICAgLy8gVGhlIGJyYW5jaCBpdCB3b2tlIG1heSBuZWVkIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgZnVydGhlciBtaWNyb3Rhc2tcbiAgICAvLyBob3BzIGJlZm9yZSBpdCByZWFjaGVzIGl0cyBuZXh0IGB1c2VTdGVwYCBjYWxsIGFuZCBkcmF3cyBhIFVMSUQ6IGFcbiAgICAvLyBgZm9yIGF3YWl0YCBvdmVyIGEgaG9vaywgZm9yIGluc3RhbmNlLCByZXN1bWVzIHRoZSBnZW5lcmF0b3IsIHNldHRsZXNcbiAgICAvLyB0aGUgcHJvbWlzZSBmcm9tIGBuZXh0KClgLCBhbmQgb25seSB0aGVuIHJ1bnMgdGhlIGxvb3AgYm9keS4gUmVzb2x2aW5nXG4gICAgLy8gdGhpcyBkZWxpdmVyeSBvbiBhIG1pY3JvdGFzayB3b3VsZCBsZXQgaXQgb3ZlcnRha2UgdGhhdCBicmFuY2ggYW5kXG4gICAgLy8gcmVvcmRlciB0aGUgVUxJRCBhbGxvY2F0aW9uIGFueXdheSwgdHVybmluZyB0aGUgZ3VhcmFudGVlIGJlbG93IGludG8gYVxuICAgIC8vIGhvcC1jb3VudCByYWNlIHRoYXQgaG9sZHMgb25seSBmb3IgdGhlIHNob3J0ZXN0IGNvbnN1bWVycy5cbiAgICAvL1xuICAgIC8vIFlpZWxkaW5nIGEgbWFjcm90YXNrIGxldHMgdGhlIGVhcmxpZXIgYnJhbmNoJ3MgZW50aXJlIG1pY3JvdGFzayBjaGFpblxuICAgIC8vIGRyYWluIGZpcnN0LCB3aGF0ZXZlciBpdHMgbGVuZ3RoLCBzbyBsb2cgb3JkZXIgc3Vydml2ZXMgcmVnYXJkbGVzcyBvZlxuICAgIC8vIGhvdyB0aGUgd29ya2Zsb3cgY29uc3VtZXMgdGhlIGVhcmxpZXIgZGVsaXZlcnkuIE9ubHkgZGVsaXZlcmllcyB0aGF0XG4gICAgLy8gYWN0dWFsbHkgaGFkIHRvIGRlZmVyIHBheSB0aGlzLCBzbyB0aGUgY29tbW9uIHNpbmdsZS1kZWxpdmVyeSBkcmFpbiBpc1xuICAgIC8vIHVuYWZmZWN0ZWQuXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICB9XG59XG5cbi8qKiBIYW5kbGUgZm9yIGEgcmVnaXN0ZXJlZCBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgYmFycmllci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsaXZlcnlCYXJyaWVyIHtcbiAgLyoqXG4gICAqIE1hcmsgdGhpcyBkZWxpdmVyeSBhcyBkZWxpdmVyZWQgdG8gdGhlIHdvcmtmbG93LiBSZXNvbHZlcyBpdHNcbiAgICogYHJlbGVhc2VkYCBwcm9taXNlIHNvIGFueSBsYXRlci1pbi1sb2cgZGVsaXZlcnkgZ2F0ZWQgb24gaXQgKHZpYVxuICAgKiB7QGxpbmsgYXdhaXRFYXJsaWVyRGVsaXZlcmllc30pIG1heSBwcm9jZWVkLCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZVxuICAgKiByZWdpc3RyeS4gSWRlbXBvdGVudC5cbiAgICovXG4gIG1hcmtEZWxpdmVyZWQ6ICgpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBNYXJrIHRoaXMgZGVsaXZlcnkgYXMgY29tbWl0dGVkIHRvIGhhcHBlbmluZywgZm9yIGEgYmFycmllciByZWdpc3RlcmVkXG4gICAqIHVuYXJtZWQgKGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkKSBvbmNlIGEgY29uc3VtZXIgaGFzIGNsYWltZWQgaXQuIEZyb21cbiAgICogdGhlbiBvbiBhIGxhdGVyIHN0ZXAgcmVzdWx0IG1heSBiZSBvcmRlcmVkIGJlaGluZCBpdC4gSWRlbXBvdGVudC5cbiAgICovXG4gIGFybTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBhdCBpdHMgZXZlbnQtbG9nIGluZGV4IHNvIHRoYXQgbGF0ZXJcbiAqIGRlbGl2ZXJpZXMgY2FuIGJlIG9yZGVyZWQgc3RyaWN0bHkgYWZ0ZXIgaXQuIFJldHVybnMgYW4gaW5lcnQgaGFuZGxlIHdoZW5cbiAqIGBwZW5kaW5nRGVsaXZlcnlCYXJyaWVyc2AgaXMgbm90IGluaXRpYWxpemVkLlxuICpcbiAqIFBhc3MgYGFybWVkOiBmYWxzZWAgZm9yIGEgZGVsaXZlcnkgd2hvc2UgcmVzb2x1dGlvbiB3YWl0cyBvbiB3b3JrZmxvdyBjb2RlXG4gKiBhc2tpbmcgZm9yIGl0IChhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCk7IGNhbGwgYGFybSgpYCB3aGVuIGl0IGRvZXMuXG4gKlxuICogVG8gZ3VhcmFudGVlIGEgbGF0ZXIgZGVsaXZlcnkgZ2F0ZWQgb24gdGhpcyBvbmUgY2FuIG5ldmVyIGhhbmcgd2hlbiB0aGlzXG4gKiBkZWxpdmVyeSBpcyBhYmFuZG9uZWQgKHRoZSB3b3JrZmxvdyB0b29rIGEgZGlmZmVyZW50IGJyYW5jaCBvciBpc1xuICogc3VzcGVuZGluZyBhbmQgbmV2ZXIgb2JzZXJ2ZXMgaXQpLCB0aGUgYmFycmllciBhdXRvLXJlc29sdmVzIGF0IGlkbGUuXG4gKlxuICogSU5WQVJJQU5UIHJlcXVpcmVkIG9mIGV2ZXJ5IGNhbGwgc2l0ZTogYSBiYXJyaWVyIHRoYXQgaXMgZXZlciBgYXJtZWRgIG11c3RcbiAqIGJlIHBhaXJlZCB3aXRoIGEgZGVsaXZlcnkgY2hhaW4gdGhhdCBydW5zIHVuY29uZGl0aW9uYWxseSwgYXR0YWNoZWQgd2hlblxuICogdGhlIGV2ZW50IGlzIGNvbnN1bWVkICh3YWl0cywgc3RlcCByZXN1bHRzLCB3YWl0aW5nLWNvbnN1bWVyIGhvb2sgcGF5bG9hZHMsXG4gKiBhYm9ydHMpLCBvciBieSB0aGUgYGNsYWltKClgIHdob3NlIGludm9jYXRpb24gaXMgd2hhdCBhcm1zIGl0IChidWZmZXJlZFxuICogaG9vayBwYXlsb2FkcykuIFRoZSBpZGxlIGNoZWNrICh7QGxpbmsgc2NoZWR1bGVXaGVuSWRsZX0pIHJlZnVzZXMgdG9cbiAqIG9ic2VydmUgaWRsZSB3aGlsZSBhbiBhcm1lZCwgc2VsZi1yZXNvbHZpbmcgYmFycmllciBpcyB1bmRlbGl2ZXJlZCwgYW5kIHRoZVxuICogc2FmZXR5IG5ldCBiZWxvdyBpcyBpdHNlbGYgaWRsZS1nYXRlZCwgc28gYW4gYXJtZWQgYmFycmllciB3aXRoIG5vXG4gKiB1bmNvbmRpdGlvbmFsIGNoYWluIHdvdWxkIGxpdmVsb2NrIGV2ZXJ5IGlkbGUgY2hlY2sgaW4gdGhlIHJ1biwgaW5jbHVkaW5nXG4gKiBpdHMgb3duIHJldGlyZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlbGl2ZXJ5QmFycmllcihcbiAgY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG4gIGV2ZW50SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAga2luZDogRGVsaXZlcnlLaW5kLFxuICBvcHRpb25zOiB7IGFybWVkPzogYm9vbGVhbiB9ID0ge31cbik6IERlbGl2ZXJ5QmFycmllciB7XG4gIGNvbnN0IGJhcnJpZXJzID0gY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzO1xuICBpZiAoIWJhcnJpZXJzIHx8IGV2ZW50SW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7IG1hcmtEZWxpdmVyZWQ6ICgpID0+IHt9LCBhcm06ICgpID0+IHt9IH07XG4gIH1cblxuICBjb25zdCBpbnN0YWxsID0gKGFybWVkOiBib29sZWFuKTogRGVsaXZlcnlCYXJyaWVyRW50cnkgPT4ge1xuICAgIGlmIChiYXJyaWVycy5oYXMoZXZlbnRJbmRleCkpIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYERlbGl2ZXJ5IGJhcnJpZXIgYWxyZWFkeSByZWdpc3RlcmVkIGF0IGV2ZW50IGluZGV4ICR7ZXZlbnRJbmRleH1gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IHdpdGhSZXNvbHZlcnM8dm9pZD4oKTtcbiAgICBjb25zdCBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnkgPSB7XG4gICAgICBraW5kLFxuICAgICAgcmVsZWFzZWQ6IHByb21pc2UsXG4gICAgICBhcm1lZCxcbiAgICAgIHJldGlyZWQ6IGZhbHNlLFxuICAgICAgcmV0aXJlOiAoKSA9PiB7XG4gICAgICAgIGlmIChlbnRyeS5yZXRpcmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVudHJ5LnJldGlyZWQgPSB0cnVlO1xuICAgICAgICBpZiAoYmFycmllcnMuZ2V0KGV2ZW50SW5kZXgpID09PSBlbnRyeSkge1xuICAgICAgICAgIGJhcnJpZXJzLmRlbGV0ZShldmVudEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LFxuICAgIH07XG4gICAgYmFycmllcnMuc2V0KGV2ZW50SW5kZXgsIGVudHJ5KTtcblxuICAgIC8vIFNhZmV0eSBuZXQ6IGlmIHRoaXMgZGVsaXZlcnkgaXMgbmV2ZXIgZGVsaXZlcmVkIHRvIHRoZSB3b3JrZmxvdyAoaXRzXG4gICAgLy8gYnJhbmNoIHdhcyBub3QgdGFrZW4gLyB0aGUgcnVuIGlzIHN1c3BlbmRpbmcsIG9yIGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkXG4gICAgLy8gaXMgb25seSBjbGFpbWVkIGFmdGVyIGEgbGF0ZXIgZGVsaXZlcnkgdGhlIHdvcmtmbG93IGlzIHN0aWxsIHdhaXRpbmdcbiAgICAvLyBvbiksIGl0IGlzIHJldGlyZWQgYXQgaWRsZSBzbyBhIGxhdGVyIGRlbGl2ZXJ5IGdhdGVkIG9uIGl0IGNhbm5vdFxuICAgIC8vIGRlYWRsb2NrIGFuZCB0aGUgcmVnaXN0cnkgY2Fubm90IGxlYWsgYW4gZW50cnkgcGVyIGFiYW5kb25lZCBkZWxpdmVyeS5cbiAgICAvLyBSZXRpcmVtZW50IGdvZXMgdGhyb3VnaCB0aGUgY29udGV4dCdzIHNpbmdsZSBvcmRlcmVkIGRpc3BlbnNlciByYXRoZXJcbiAgICAvLyB0aGFuIGEgcGVyLWJhcnJpZXIgaWRsZSBwb2xsLiBTZWUge0BsaW5rIGVuc3VyZUJhcnJpZXJTYWZldHlOZXR9IGZvciB3aHlcbiAgICAvLyB0aGUgT1JERVIgb2YgdGhlc2UgcmV0aXJlbWVudHMgaXMgbG9hZC1iZWFyaW5nLlxuICAgIGVuc3VyZUJhcnJpZXJTYWZldHlOZXQoY3R4KTtcbiAgICByZXR1cm4gZW50cnk7XG4gIH07XG5cbiAgbGV0IGVudHJ5ID0gaW5zdGFsbChvcHRpb25zLmFybWVkID8/IHRydWUpO1xuICBsZXQgZGVsaXZlcmVkVG9Xb3JrZmxvdyA9IGZhbHNlO1xuXG4gIHJldHVybiB7XG4gICAgbWFya0RlbGl2ZXJlZDogKCkgPT4ge1xuICAgICAgaWYgKGRlbGl2ZXJlZFRvV29ya2Zsb3cpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZGVsaXZlcmVkVG9Xb3JrZmxvdyA9IHRydWU7XG4gICAgICBlbnRyeS5yZXRpcmUoKTtcbiAgICB9LFxuICAgIGFybTogKCkgPT4ge1xuICAgICAgaWYgKGRlbGl2ZXJlZFRvV29ya2Zsb3cpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGlkbGUgc2FmZXR5IG5ldCBtYXkgcmV0aXJlIGFuIHVuY2xhaW1lZCBidWZmZXJlZCBob29rIHBheWxvYWRcbiAgICAgIC8vIHdoaWxlIGEgcmV0YWluZWQgVk0ga2VlcHMgaXRzIGBjbGFpbSgpYCBjbG9zdXJlIGFsaXZlLiBJZiB3b3JrZmxvd1xuICAgICAgLy8gY29kZSBsYXRlciBjbGFpbXMgdGhhdCBwYXlsb2FkLCByZXBsYWNlIHRoZSBzZXR0bGVkIGVudHJ5IHNvIGRlbGl2ZXJ5XG4gICAgICAvLyByZW1haW5zIG5vbi1pZGxlIHVudGlsIHRoZSBjbGFpbSByZWFjaGVzIHRoZSB3b3JrZmxvdy5cbiAgICAgIGlmIChlbnRyeS5yZXRpcmVkKSB7XG4gICAgICAgIGVudHJ5ID0gaW5zdGFsbCh0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGJhcnJpZXJzLmdldChldmVudEluZGV4KSAhPT0gZW50cnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgIGBEZWxpdmVyeSBiYXJyaWVyIGxvc3Qgb3duZXJzaGlwIG9mIGV2ZW50IGluZGV4ICR7ZXZlbnRJbmRleH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbnRyeS5hcm1lZCA9IHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb250ZXh0cyB3aG9zZSBiYXJyaWVyIHNhZmV0eS1uZXQgZGlzcGVuc2VyIGlzIGN1cnJlbnRseSBhcm1lZC4gTW9kdWxlLWxldmVsXG4gKiBzbyB0aGUgY29udGV4dCBpbnRlcmZhY2UgKGNvbnN0cnVjdGVkIGxpdGVyYWxseSBieSBtYW55IHRlc3QgaGFybmVzc2VzKVxuICogbmVlZHMgbm8gbmV3IGZpZWxkOyBlbnRyaWVzIGRyb3Agd2l0aCB0aGUgY29udGV4dC5cbiAqL1xuLy8gcGVyLWNvcHktb2s6IGtleWVkIG9uIHRoZSBvcmNoZXN0cmF0b3IgY29udGV4dCBvYmplY3QsIGFuZCBhIGNvbnRleHQgaXMgYXJtZWRcbi8vIGFuZCBvYnNlcnZlZCBieSB0aGUgc2FtZSBjb3B5IHRoYXQgY3JlYXRlZCBpdC4gRW50cmllcyBjYW4gbmV2ZXIgYmUgbG9va2VkIHVwXG4vLyBmcm9tIGFub3RoZXIgY29weSBiZWNhdXNlIHRoYXQgY29weSBoYXMgbm8gcmVmZXJlbmNlIHRvIHRoZSBrZXkuXG5jb25zdCBhY3RpdmVCYXJyaWVyU2FmZXR5TmV0cyA9IG5ldyBXZWFrU2V0PFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dD4oKTtcblxuLyoqXG4gKiBUaGUgYmFycmllciByZWdpc3RyeSdzIHNhZmV0eSBuZXQ6IE9ORSBpZGxlLWdhdGVkIGRpc3BlbnNlciBwZXIgY29udGV4dCB0aGF0XG4gKiByZXRpcmVzLCBhdCBlYWNoIG9ic2VydmF0aW9uIG9mIGRlbGl2ZXJ5IGlkbGUsIG9ubHkgdGhlIExPV0VTVC1pbmRleCBlbnRyeVxuICogc3RpbGwgcmVnaXN0ZXJlZCwgdGhlbiB5aWVsZHMgc28gdGhlIGNoYWluIGl0IHJlbGVhc2VkIGNhbiBydW4gYmVmb3JlIHRoZVxuICogbmV4dCByZXRpcmVtZW50IGlzIGNvbnNpZGVyZWQuXG4gKlxuICogV2h5IG9uZSBvcmRlcmVkIGRpc3BlbnNlciBhbmQgbm90IGEgcG9sbCBwZXIgYmFycmllciAod2hpY2ggaXMgd2hhdCB0aGlzXG4gKiByZXBsYWNlZCk6IHRoZSBvcmRlciBvZiBzYWZldHktbmV0IHJldGlyZW1lbnRzIGRlY2lkZXMgdGhlIGRlbGl2ZXJ5IG9yZGVyIG9mXG4gKiBldmVyeSBjaGFpbiBwYXJrZWQgYmVoaW5kIGFuIHVuY2xhaW1lZCBidWZmZXJlZCBob29rIHBheWxvYWQ6IGEgaG9vayB0aGVcbiAqIHdvcmtmbG93IG5ldmVyIHJlYWRzIChhIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9va2ApIHBhcmtzIGV2ZXJ5IGxhdGVyXG4gKiBhcm1lZCB3YWl0L2hvb2sgYmVoaW5kIGEgYmFycmllciB0aGF0IG9ubHkgdGhpcyBuZXQgY2FuIHJldGlyZS4gUGVyLWJhcnJpZXJcbiAqIHBvbGxzIGZpcmUgaW4gd2hhdGV2ZXIgb3JkZXIgdGhlaXIgcmUtYXJtIGN5Y2xlcyBsYW5kLCBhbmQgZWFjaCByZS1hcm1cbiAqIGF0dGFjaGVzIHRvIGEgYHByb21pc2VRdWV1ZWAgdGhhdCBncm93cyBiZXR3ZWVuIGNoZWNrcywgc28gd2l0aCBzZXZlcmFsXG4gKiBwYXJrZWQgc2VnbWVudHMgdGhlIHJlbGVhc2Ugb3JkZXIgZGVjYXlzIHRvIHRpbWluZyBub2lzZS4gRHJhd3MgKGB1c2VTdGVwYFxuICogY29ycmVsYXRpb24gaWRzKSB0aGVuIGRlcGVuZCBvbiB3aGljaCBzZWdtZW50IGhhcHBlbmVkIHRvIHJlbGVhc2UgZmlyc3Q6XG4gKiBjb25jcmV0ZWx5LCBvbiBob3cgTVVDSCBsb2cgdGhlIHJlcGxheSBsb2FkZWQsIHNpbmNlIHRoYXQgZGVjaWRlcyB3aGF0IGlzIGluXG4gKiB0aGUgcmVnaXN0cnkuIFRoYXQgaXMgdGhlIG1lY2hhbmlzbSBiZWhpbmQgc2xvdC1tb2RlIENPUlJVUFRFRF9FVkVOVF9MT0cgb25cbiAqIHN0b3JtLXNoYXBlZCBydW5zIChzZWUgc3Rvcm0tbG9nLXJlcGxheS50ZXN0LnRzLCBidWlsdCBmcm9tIGEgcHJvZHVjdGlvblxuICogbG9nKTogdHdvIHJlcGxheXMgb2YgdGhlIHNhbWUgcnVuIGhvbGRpbmcgZGlmZmVyZW50LWxlbmd0aCBwcmVmaXhlcyBib3VuZFxuICogdGhlIHNhbWUgY29ycmVsYXRpb24gb3JkaW5hbCB0byBkaWZmZXJlbnQgc3RlcHMuXG4gKlxuICogUmV0aXJpbmcgbG93ZXN0LWZpcnN0IGlzIG5vdCBtZXJlbHkgdGlkeSwgaXQgaXMgdGhlIG9ubHkgb3JkZXIgdGhhdCBjYW5ub3RcbiAqIGludmVydCB0aGUgbG9nOiBldmVyeSBnYXRlIHBvaW50cyBmcm9tIGEgaGlnaGVyIGluZGV4IHRvIGEgc3RyaWN0bHkgbG93ZXJcbiAqIG9uZSwgc28gYXQgZGVsaXZlcnkgaWRsZSB0aGUgbG93ZXN0IHVuZGVsaXZlcmVkIGVudHJ5IGdhdGVzIG9uIG5vdGhpbmdcbiAqIHN0aWxsIHJlZ2lzdGVyZWQ6IGl0IGlzIHRoZSBoZWFkIG9mIGV2ZXJ5IHBhcmtlZCBjaGFpbiAoaW4gcHJhY3RpY2UsIHRoZVxuICogdW5jbGFpbWVkIHBheWxvYWQgaXRzZWxmKS4gUmVsZWFzaW5nIGl0IGxldHMgdGhlIGNoYWluIGFib3ZlIGRlbGl2ZXJcbiAqIHRocm91Z2ggdGhlIG9yZGluYXJ5IGJhcnJpZXIgb3JkZXI7IGFueXRoaW5nIHRoZSByZWxlYXNlIHdha2VzIGZsaXBzXG4gKiB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9IGJhY2sgdG8gdHJ1ZSwgd2hpY2ggcmUtYmxvY2tzIHRoaXNcbiAqIGRpc3BlbnNlciB1bnRpbCB0aGUgY2hhaW4gaGFzIGZ1bGx5IGRyYWluZWQuIEEgaGlnaGVyIGVudHJ5IG11c3QgbmV2ZXIgYmVcbiAqIHJldGlyZWQgd2hpbGUgYSBsb3dlciBvbmUgaXMgcmVnaXN0ZXJlZCwgd2hpY2ggaXMgZXhhY3RseSB0aGUgaW52ZXJzaW9uXG4gKiBkZXNjcmliZWQgb24ge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9LlxuICpcbiAqIFRoZSBkaXNwZW5zZXIgZ29lcyBkb3JtYW50IHdoZW4gdGhlIHJlZ2lzdHJ5IGVtcHRpZXMgYW5kIGlzIHJlLWFybWVkIGJ5IHRoZVxuICogbmV4dCByZWdpc3RyYXRpb24sIHNvIGFuIGlkbGUgY29udGV4dCBob2xkcyBubyBsaXZlIHRpbWVyLlxuICovXG5mdW5jdGlvbiBlbnN1cmVCYXJyaWVyU2FmZXR5TmV0KGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KTogdm9pZCB7XG4gIGNvbnN0IGJhcnJpZXJzID0gY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzO1xuICBpZiAoIWJhcnJpZXJzIHx8IGFjdGl2ZUJhcnJpZXJTYWZldHlOZXRzLmhhcyhjdHgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGFjdGl2ZUJhcnJpZXJTYWZldHlOZXRzLmFkZChjdHgpO1xuICBjb25zdCByZWFybSA9ICgpID0+IHtcbiAgICBzZXRUaW1lb3V0KGNoZWNrLCAwKTtcbiAgfTtcbiAgLy8gQSByZWplY3RlZCBwcm9taXNlUXVldWUgc2V0dGxlcyBpbW1lZGlhdGVseSBhbmQgZm9yZXZlciwgc28gcmUtYXJtaW5nXG4gIC8vIHRocm91Z2ggaXQgYXQgdGhlIG5vcm1hbCBjYWRlbmNlIHdvdWxkIGRlZ2VuZXJhdGUgaW50byBhIGJ1c3kgbG9vcCBvbiBhblxuICAvLyBhYmFuZG9uZWQgY29udGV4dC4gQmFjayBvZmYgaW5zdGVhZDogY29ycmVjdG5lc3Mgb25seSBuZWVkcyB0aGUgZGlzcGVuc2VyXG4gIC8vIHRvIHN0aWxsIGV4aXN0LCBzaW5jZSB0aGUgcmVnaXN0cnkgZ2F0ZXMgc3VzcGVuc2lvbiB2aWEgaXNEZWxpdmVyeUlkbGVcbiAgLy8gYW5kIGEgZGVhZCBkaXNwZW5zZXIgd291bGQgd2VkZ2UgdGhlIHJ1bi5cbiAgY29uc3QgcmVhcm1BZnRlclJlamVjdGlvbiA9ICgpID0+IHtcbiAgICBzZXRUaW1lb3V0KGNoZWNrLCA1MCk7XG4gIH07XG4gIGNvbnN0IGNoZWNrID0gKCkgPT4ge1xuICAgIGlmIChiYXJyaWVycy5zaXplID09PSAwKSB7XG4gICAgICAvLyBEb3JtYW50LiBUaGUgbmV4dCByZWdpc3RlckRlbGl2ZXJ5QmFycmllciByZS1hcm1zLlxuICAgICAgYWN0aXZlQmFycmllclNhZmV0eU5ldHMuZGVsZXRlKGN0eCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghY2FuUmV0aXJlQWJhbmRvbmVkQmFycmllcnMoY3R4KSkge1xuICAgICAgLy8gQSBkZWxpdmVyeSBpcyBoeWRyYXRpbmcgb3IgY29tbWl0dGVkLWJ1dC1wYXJrZWQgb24gaXRzIGRlZmVycmFsOyBsZXRcbiAgICAgIC8vIHRoZSBxdWV1ZSBkcmFpbiBhbmQgcmUtY2hlY2sgYSB0aWNrIGxhdGVyIChzYW1lIGNhZGVuY2UgYXNcbiAgICAgIC8vIHNjaGVkdWxlV2hlbklkbGUpLlxuICAgICAgY3R4LnByb21pc2VRdWV1ZS50aGVuKHJlYXJtLCByZWFybUFmdGVyUmVqZWN0aW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSWRsZSB3aXRoIGVudHJpZXMgbGVmdDogbm90aGluZyByZW1haW5pbmcgZGVsaXZlcnMgb24gaXRzIG93biwgc29cbiAgICAvLyByZWxlYXNlIHBhcmtlZCBjaGFpbnMgZnJvbSB0aGUgaGVhZDogbG93ZXN0IGluZGV4IGZpcnN0LCBvbmUgYXQgYVxuICAgIC8vIHRpbWUsIHJlLXJlYWRpbmcgaWRsZSBiZXR3ZWVuIHJldGlyZW1lbnRzLiBBIHJldGlyZW1lbnQgdGhhdCB3YWtlcyBhXG4gICAgLy8gY2hhaW4gZmxpcHMge0BsaW5rIGhhc1BhcmtlZENvbW1pdHRlZERlbGl2ZXJ5fSBzeW5jaHJvbm91c2x5IChpdCBpc1xuICAgIC8vIGNvbXB1dGVkIGZyb20gdGhlIHJlZ2lzdHJ5IHRoaXMgbG9vcCBqdXN0IG11dGF0ZWQpLCB3aGljaCBzdG9wcyB0aGVcbiAgICAvLyBzd2VlcCBzbyB0aGUgY2hhaW4gZGVsaXZlcnMgYmVmb3JlIGFueXRoaW5nIGFib3ZlIGl0IGlzIHJlbGVhc2VkLiBBXG4gICAgLy8gcmV0aXJlbWVudCB0aGF0IHdha2VzIG5vdGhpbmcgKGEgc3RhbGUgcGF5bG9hZCBubyBkZWxpdmVyeSBnYXRlcyBvbilcbiAgICAvLyBrZWVwcyB0aGUgc3dlZXAgZ29pbmcsIHNvIGEgYmFja2xvZyBvZiB0aG9zZSBkcmFpbnMgaW4gT05FIGlkbGVcbiAgICAvLyBvYnNlcnZhdGlvbiwgc2luY2UgcGFjaW5nIHRoZW0gb25lIHBlciB0aW1lciB0aWNrIHdvdWxkIGhvbGRcbiAgICAvLyBjb25zdW1lZC1idXQtdW5kZWxpdmVyZWQgZXZlbnRzIGhvc3RhZ2UgbG9uZyBlbm91Z2ggdG8gdHJpcCB0aGUgZXZlbnRzXG4gICAgLy8gY29uc3VtZXIncyB1bmNvbnN1bWVkLWV2ZW50IGRlYWRsaW5lIGFuZCBmYWlsIGhlYWx0aHkgcmVwbGF5cy5cbiAgICB3aGlsZSAoYmFycmllcnMuc2l6ZSA+IDAgJiYgY2FuUmV0aXJlQWJhbmRvbmVkQmFycmllcnMoY3R4KSkge1xuICAgICAgbGV0IGxvd2VzdEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgbG93ZXN0RW50cnk6IERlbGl2ZXJ5QmFycmllckVudHJ5IHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGVudHJ5XSBvZiBiYXJyaWVycykge1xuICAgICAgICBpZiAobG93ZXN0SW5kZXggPT09IHVuZGVmaW5lZCB8fCBpbmRleCA8IGxvd2VzdEluZGV4KSB7XG4gICAgICAgICAgbG93ZXN0SW5kZXggPSBpbmRleDtcbiAgICAgICAgICBsb3dlc3RFbnRyeSA9IGVudHJ5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsb3dlc3RFbnRyeT8ucmV0aXJlKCk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoY2hlY2ssIDApO1xuICB9O1xuICBzZXRUaW1lb3V0KGNoZWNrLCAwKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBzYWZldHktbmV0IGRpc3BlbnNlciBtYXkgcmV0aXJlIGFiYW5kb25lZCBiYXJyaWVycyByaWdodCBub3c6XG4gKiBubyBoeWRyYXRpb24gaW4gZmxpZ2h0IGFuZCBubyBjb21taXR0ZWQgZGVsaXZlcnkgc3RpbGwgd29ya2luZyB0aHJvdWdoIGl0c1xuICogZGV0YWNoZWQgZGVmZXJyYWwuIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IFdFQUtFUiB0aGFuIHtAbGluayBpc0RlbGl2ZXJ5SWRsZX06XG4gKiB0aGUgZGlzcGVuc2VyIGlzIHdoYXQgZW1wdGllcyB0aGUgcmVnaXN0cnksIHNvIGdhdGluZyBpdCBvbiByZWdpc3RyeVxuICogZW1wdGluZXNzIHdvdWxkIGdhdGUgaXRzIG93biB3b3JrLlxuICovXG5mdW5jdGlvbiBjYW5SZXRpcmVBYmFuZG9uZWRCYXJyaWVycyhjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY3R4LnBlbmRpbmdEZWxpdmVyaWVzID09PSAwICYmICFoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeShjdHgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgc29tZSByZWdpc3RlcmVkIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBpcyBnb2luZyB0byByZWFjaCB0aGVcbiAqIHdvcmtmbG93IHdpdGhvdXQgYW55IGZ1cnRoZXIgaGVscCAoaXQgaXMgYXJtZWQgYW5kIG5vdCB0cmFuc2l0aXZlbHkgcGFya2VkXG4gKiBiZWhpbmQgYW4gdW5jbGFpbWVkIGJ1ZmZlcmVkIHBheWxvYWQsIHNlZSB7QGxpbmsgcmVzb2x2ZXNPbkl0c093bn0pIGJ1dFxuICogaGFzIG5vdCBiZWVuIGhhbmRlZCBvdmVyIHlldC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBkZWxpdmVyeSBzdGF0ZSBgcGVuZGluZ0RlbGl2ZXJpZXNgIGNhbm5vdCBzZWUuIFRoYXQgY291bnRlclxuICogY292ZXJzIHRoZSBoeWRyYXRpb24gd2luZG93IGluc2lkZSBhIHNlcmlhbCBgcHJvbWlzZVF1ZXVlYCBzbG90IGFuZCBpc1xuICogcmVsZWFzZWQgdGhlcmUsIHdoaWxlIHRoZSBkZWxpdmVyeSdzIGByZXNvbHZlKClgIHJ1bnMgbGF0ZXIsIGZyb20gYVxuICogZGV0YWNoZWQgY29udGludWF0aW9uIGJlaGluZCB7QGxpbmsgYXdhaXRFYXJsaWVyRGVsaXZlcmllc30sIGluY2x1ZGluZyBpdHNcbiAqIG1hY3JvdGFzayB5aWVsZCB3aGVuZXZlciB0aGUgZGVsaXZlcnkgaGFkIHRvIGRlZmVyLiBSZXBsYXlpbmcgYSBiYXRjaCBvZiBOXG4gKiBwYXJhbGxlbCBzdGVwIHJlc3VsdHMgY29uc3VtZWQgaW4gb25lIGRyYWluIHdpbmRvdyBsZWF2ZXMgTi0xIG9mIHRoZW1cbiAqIHBhcmtlZCBvbiB0aGF0IHlpZWxkIHdpdGggYHBlbmRpbmdEZWxpdmVyaWVzYCBhbHJlYWR5IGF0IDAuIEFuIGlkbGUgY2hlY2tcbiAqIGFybWVkIGR1cmluZyB0aGUgc2FtZSB3aW5kb3cgKGEgcGVuZGluZyBgc2xlZXAoKWAgYXJtcyBvbmUgb24gZXZlcnkgcmVwbGF5KVxuICogY291bGQgdGhlbiBvYnNlcnZlIFwiaWRsZVwiIG1pZC1kZWZlcnJhbCBhbmQgcmFpc2UgYSBgV29ya2Zsb3dTdXNwZW5zaW9uYFxuICogQkVGT1JFIHRoZSB3b3JrZmxvdydzIG93biBjb250aW51YXRpb25zIHJhbjogYSBzdXNwZW5zaW9uIGNhcnJ5aW5nIG5vbmUgb2ZcbiAqIHRoZSBmb2xsb3ctdXAgd29yayB0aGUgYmF0Y2ggd2FzIGFib3V0IHRvIGNyZWF0ZSwgd2hpY2ggdGhlIHJ1bnRpbWVcbiAqIGR1dGlmdWxseSBzY2hlZHVsZXMgYXMgbm90aGluZywgbGVhdmluZyB0aGUgcnVuIGRvcm1hbnQgdW50aWwgYW4gdW5yZWxhdGVkXG4gKiB0aW1lciBmaXJlcyAodmVyY2VsL3dvcmtmbG93IzMxODMpLlxuICpcbiAqIERlbGl2ZXJpZXMgdGhhdCBkbyBOT1QgcmVzb2x2ZSBvbiB0aGVpciBvd24gbXVzdCBiZSBleGNsdWRlZCwgbm90IGZvclxuICogYWNjdXJhY3kgYnV0IGZvciB0ZXJtaW5hdGlvbjogYW4gdW5jbGFpbWVkIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCBpcyByZXRpcmVkXG4gKiBCWSB0aGUgaWRsZSBzYWZldHkgbmV0IGluIHtAbGluayByZWdpc3RlckRlbGl2ZXJ5QmFycmllcn0sIHNvIGNvdW50aW5nIGl0XG4gKiBoZXJlIHdvdWxkIGdhdGUgaXRzIG93biByZXRpcmVtZW50LiBUaGF0IHJlYXNvbmluZyBleHRlbmRzIHRvIHdoYXRldmVyIGlzXG4gKiBwYXJrZWQgYmVoaW5kIHN1Y2ggYSBwYXlsb2FkIChhIHdhaXQsIGFuZCBhIHN0ZXAgZ2F0aW5nIG9uIHRoYXQgd2FpdCkgZm9yXG4gKiB0aGUgc2FtZSByZWFzb246IHRoZSB3aG9sZSBjaGFpbiBtb3ZlcyBvbmx5IG9uY2UgdGhlIG5ldCBmaXJlcywgYW5kIGl0XG4gKiBjYW5ub3QgZmlyZSB3aGlsZSB0aGUgY2hhaW4gaXMgY291bnRlZC4gU2VsZi1yZXNvbHZpbmcgZGVsaXZlcmllcyBhbHdheXNcbiAqIGRlbGl2ZXIgZnJvbSB0aGVpciBvd24gY2hhaW5zIChzZWUgdGhlIElOVkFSSUFOVCBvblxuICoge0BsaW5rIHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyfSkgYW5kIG5ldmVyIG5lZWQgdGhhdCBuZXQsIHNvIHdhaXRpbmcgb25cbiAqIHRoZW0gaXMgZGVhZGxvY2stZnJlZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1BhcmtlZENvbW1pdHRlZERlbGl2ZXJ5KFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJhcnJpZXJzID0gY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzO1xuICBpZiAoIWJhcnJpZXJzIHx8IGJhcnJpZXJzLnNpemUgPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gU2hhcmVkIGFjcm9zcyB0aGlzIGNhbGwgb25seS4gU2VlIGByZXNvbHZlc09uSXRzT3duYC5cbiAgY29uc3Qgc2VsZlJlc29sdmluZyA9IG5ldyBNYXA8bnVtYmVyLCBib29sZWFuPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgZW50cnldIG9mIGJhcnJpZXJzKSB7XG4gICAgaWYgKHJlc29sdmVzT25JdHNPd24oYmFycmllcnMsIGluZGV4LCBlbnRyeSwgc2VsZlJlc29sdmluZykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciBubyBkYXRhIGRlbGl2ZXJ5IChzdGVwIHJlc3VsdCwgaG9vayBwYXlsb2FkKSBpcyBpbiBmbGlnaHQgcmlnaHQgbm93LlxuICpcbiAqIFwiSW4gZmxpZ2h0XCIgaXMgdHdvIGRpc3RpbmN0IHdpbmRvd3MsIGVhY2ggd2l0aCBpdHMgb3duIGd1YXJkOlxuICogYHBlbmRpbmdEZWxpdmVyaWVzID4gMGAgY292ZXJzIGh5ZHJhdGlvbiBpbnNpZGUgdGhlIHNlcmlhbCBxdWV1ZSBzbG90cywgYW5kXG4gKiB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9IGNvdmVycyB0aGUgZGV0YWNoZWQgZ2FwIGJldHdlZW4gYSBzbG90XG4gKiByZWxlYXNpbmcgdGhhdCBjb3VudGVyIGFuZCB0aGUgZGVsaXZlcnkncyBgcmVzb2x2ZSgpYCBhY3R1YWxseSBydW5uaW5nLFxuICogZGVsaWJlcmF0ZWx5IG91dHNpZGUgYHBlbmRpbmdEZWxpdmVyaWVzYCAoc2VlIHN0ZXAudHMpLCBhbmQgaW52aXNpYmxlIHRvIGl0LlxuICpcbiAqIEFueXRoaW5nIHRoYXQgZGVjaWRlcyBhIHJlcGxheSBpcyBvdmVyLCBvciB0aGF0IGEgcmVwbGF5IHdlbnQgd3JvbmcsIGhhcyB0b1xuICogY29uc3VsdCB0aGlzIGZpcnN0OiB3aGlsZSBpdCBpcyBmYWxzZSB0aGUgd29ya2Zsb3cgVk0gaXMgbWlkLXJlYWN0aW9uLCBzb1xuICogd2hhdCBpdCBoYXMgYW5kIGhhcyBub3QgZG9uZSB5ZXQgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBydW4uIFR3byBjYWxsZXJzXG4gKiByZWFkIGl0LCBmb3IgdGhlIHR3byBzdWNoIGRlY2lzaW9uczoge0BsaW5rIHNjaGVkdWxlV2hlbklkbGV9IGZvciB0aGVcbiAqIHN1c3BlbnNpb24sIGFuZCB0aGUgZXZlbnRzIGNvbnN1bWVyJ3MgdW5jb25zdW1lZC1ldmVudCBjaGVjayBmb3IgZGl2ZXJnZW5jZS5cbiAqXG4gKiBBIG5vbi1lbXB0eSBiYXJyaWVyIHJlZ2lzdHJ5IGNvdW50cyBhcyBpbiBmbGlnaHQsIGV2ZW4gd2hlbiBldmVyeSByZW1haW5pbmdcbiAqIGVudHJ5IGlzIHBhcmtlZCBiZWhpbmQgYW4gdW5jbGFpbWVkIGJ1ZmZlcmVkIHBheWxvYWQuIFRob3NlIGVudHJpZXMgb25seVxuICogbW92ZSB3aGVuIHRoZSBzYWZldHktbmV0IGRpc3BlbnNlciByZXRpcmVzIHRoZW0gKGxvd2VzdC1maXJzdCwgc2VlXG4gKiB7QGxpbmsgZW5zdXJlQmFycmllclNhZmV0eU5ldH0pLCBhbmQgdGhlIGRlbGl2ZXJpZXMgdGhleSByZWxlYXNlIGFyZSByZWFsXG4gKiB3b3JrZmxvdyByZWFjdGlvbnM6IGEgc3VzcGVuc2lvbiByYWlzZWQgYmVmb3JlIHRoZXkgcnVuIHdvdWxkIGJlIGNvbXB1dGVkXG4gKiBmcm9tIGEgVk0gdGhhdCBoYXMgbm90IHNlZW4gdGhlbSwgc2NoZWR1bGluZyBub25lIG9mIHRoZWlyIGZvbGxvdy11cCB3b3JrXG4gKiBhbmQgbGVhdmluZyB0aGUgcnVuIGRvcm1hbnQgKHRoZSB2ZXJjZWwvd29ya2Zsb3cjMzE4MyBzaGFwZSkuIFRoZSBkaXNwZW5zZXJcbiAqIGl0c2VsZiBpcyBnYXRlZCBvbiB7QGxpbmsgY2FuUmV0aXJlQWJhbmRvbmVkQmFycmllcnN9LCB0aGUgd2Vha2VyIHByZWRpY2F0ZVxuICogd2l0aG91dCB0aGUgcmVnaXN0cnkgdGVybSwgcHJlY2lzZWx5IHNvIGl0IGNhbiBkbyB0aGUgZHJhaW5pbmcgdGhhdCB0aGlzXG4gKiBwcmVkaWNhdGUgd2FpdHMgZm9yOyByZWdpc3RyeSBzaXplIHN0cmljdGx5IGRlY3JlYXNlcyBhdCBlYWNoIHJldGlyZW1lbnQsXG4gKiBzbyBpZGxlIGlzIGFsd2F5cyByZWFjaGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZWxpdmVyeUlkbGUoY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMgPT09IDAgJiZcbiAgICAoIWN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycyB8fCBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnMuc2l6ZSA9PT0gMClcbiAgKTtcbn1cblxuLyoqXG4gKiBTY2hlZHVsZSBhIGNhbGxiYWNrIHRvIGZpcmUgb25seSBhZnRlciBhbGwgcGVuZGluZyBkYXRhIGRlbGl2ZXJpZXNcbiAqIChzdGVwIHJlc3VsdHMsIGhvb2sgcGF5bG9hZHMpIGFuZCBhc3luYyBkZXNlcmlhbGl6YXRpb24gaGF2ZSBjb21wbGV0ZWQuXG4gKiBVc2VzIGEgcG9sbGluZyBsb29wOiBzZXRUaW1lb3V0KDApIOKGkiBjaGVjayBwZW5kaW5nRGVsaXZlcmllcyBhbmQgdGhlXG4gKiBiYXJyaWVyIHJlZ2lzdHJ5IOKGkiBpZiBhbnl0aGluZyBpcyBzdGlsbCBpbiBmbGlnaHQsIHdhaXQgZm9yIHByb21pc2VRdWV1ZSDihpJcbiAqIHJlcGVhdC4gVGhpcyBoYW5kbGVzIHRoZSBtdWx0aS1yb3VuZCBkZWxpdmVyeSBwYXR0ZXJuIHdoZXJlIGVhY2ggaG9va1xuICogcGF5bG9hZCBkZWxpdmVyeSBjeWNsZSBhcHBlbmRzIG5ldyBhc3luYyB3b3JrIHRvIHRoZSBwcm9taXNlUXVldWUuIFdoYXRcbiAqIGNvdW50cyBhcyBpbiBmbGlnaHQgaXMge0BsaW5rIGlzRGVsaXZlcnlJZGxlfS5cbiAqXG4gKiBUaGUgaW5pdGlhbCBgc2V0VGltZW91dCgwKWAgbWFjcm90YXNrIGlzIGxvYWQtYmVhcmluZyBhbmQgbXVzdCBOT1QgYmVcbiAqIGRvd25ncmFkZWQgdG8gYSBtaWNyb3Rhc2sgKGBxdWV1ZU1pY3JvdGFza2AvYFByb21pc2UucmVzb2x2ZSgpLnRoZW5gKS5cbiAqIGBwZW5kaW5nRGVsaXZlcmllc2Agb25seSBndWFyZHMgdGhlIGhvc3Qtc2lkZSBoeWRyYXRpb24gd2luZG93OyBiZXR3ZWVuIGFcbiAqIGRlbGl2ZXJ5J3MgYHJlc29sdmUoKWAgYW5kIHRoZSB3b3JrZmxvdyBWTSBib2R5IHJ1bm5pbmcgaXRzIGNvbnRpbnVhdGlvbiB0b1xuICogcmVnaXN0ZXIgdGhlIG5leHQgc3Vic2NyaWJlciwgYHBlbmRpbmdEZWxpdmVyaWVzYCBpcyBhbHJlYWR5IDAgZXZlbiB0aG91Z2hcbiAqIHRoZSBWTSBpcyBtaWQtcmVhY3Rpb24uIE5vZGUgZG9lcyBub3QgZ3VhcmFudGVlIGEgbWljcm90YXNrIHNjaGVkdWxlZCBpblxuICogdGhlIGhvc3QgY29udGV4dCBzZXR0bGVzIGFmdGVyIHRoZSBjcm9zcy1WTSBwcm9taXNlIGNoYWluIChyZXNvbHZlIGluIGhvc3RcbiAqIOKGkiB3b3JrZmxvdyBjb2RlIGluIFZNIOKGkiBzdWJzY3JpYmUgYmFjayBpbiBob3N0KTsgdGhlIG1hY3JvdGFzayBib3VuZGFyeVxuICogZ2l2ZXMgdGhhdCBjaGFpbiB0aW1lIHRvIHJ1biwgc28gdGhlIHN1c3BlbnNpb24gZG9lcyBub3QgcHJlZW1wdCBhIHNpYmxpbmdcbiAqIGRlbGl2ZXJ5IHN0aWxsIGluIGZsaWdodC4gRW1waXJpY2FsbHksIHJlcGxhY2luZyBpdCB3aXRoIGBxdWV1ZU1pY3JvdGFza2BcbiAqIGJyZWFrcyBob29rL3NsZWVwIGBQcm9taXNlLnJhY2VgIG9yZGVyaW5nIChDb3JydXB0ZWRFdmVudExvZ0Vycm9yKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlV2hlbklkbGUoXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBmbjogKCkgPT4gdm9pZFxuKTogdm9pZCB7XG4gIGNvbnN0IGNoZWNrID0gKCkgPT4ge1xuICAgIGlmICghaXNEZWxpdmVyeUlkbGUoY3R4KSkge1xuICAgICAgLy8gQSBkZWxpdmVyeSBpcyBzdGlsbCBoeWRyYXRpbmcsIG9yIGlzIGNvbW1pdHRlZCBidXQgcGFya2VkIGJlaGluZCBpdHNcbiAgICAgIC8vIGRlZmVycmFsICh3aG9zZSByZXNvbHZlIHJ1bnMgb24gYSBkZXRhY2hlZCB0aW1lciwgbm90IHRoaXMgcXVldWUpLlxuICAgICAgLy8gRWl0aGVyIHdheTogbGV0IHRoZSBxdWV1ZSBkcmFpbiwgdGhlbiByZS1jaGVjayBhIHRpbWVyIHRpY2sgbGF0ZXIuXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KGNoZWNrLCAwKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbigpO1xuICAgIH1cbiAgfTtcbiAgc2V0VGltZW91dChjaGVjaywgMCk7XG59XG5cbi8qKiBTY2hlZHVsZSBhIGdlbmVyYXRpb24tZ3VhcmRlZCBzdXNwZW5zaW9uIGFmdGVyIGRlbGl2ZXJpZXMgc2V0dGxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlV29ya2Zsb3dTdXNwZW5zaW9uKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dFxuKTogdm9pZCB7XG4gIGNvbnN0IGdlbmVyYXRpb24gPSBjdHguc3VzcGVuc2lvbkdlbmVyYXRpb247XG4gIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgaWYgKGdlbmVyYXRpb24gIT09IGN0eC5zdXNwZW5zaW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICApO1xuICB9KTtcbn1cbiJdfQ==
|
|
729
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcml2YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR2hELE9BQU8sRUFBa0Isa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFhakUsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFFekUsTUFBTSxhQUFhLEdBRWYsVUFBVSxDQUFDO0FBRWYsd0RBQXdEO0FBQ3hELE1BQU0sZUFBZSxHQUFHLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLEtBQUssSUFBSSxHQUFHLEVBR25FLENBQUMsQ0FBQztBQUVMLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDMUMsaUNBQWlDO0lBQ2pDLHlCQUF5QjtJQUN6Qix5QkFBeUI7Q0FDMUIsQ0FBQyxDQUFDO0FBRUgsU0FBUyx3QkFBd0IsQ0FBQyxNQUFjO0lBQzlDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDOUMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFNUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxlQUF1QixFQUFFLEVBQUU7UUFDM0MsSUFB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QyxHQUFHLENBQUMsdUJBQXVCLElBQUksR0FBRyxDQUFDLHVCQUF1QixDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FDekUsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLEdBQWdDLEVBQ2hDLEVBQWM7SUFFZCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUU7UUFDakIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLHVFQUF1RTtZQUN2RSxxRUFBcUU7WUFDckUscUVBQXFFO1lBQ3JFLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDekIsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sRUFBRSxFQUFFLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLE1BQU0sVUFBVSwwQkFBMEIsQ0FDeEMsR0FBZ0M7SUFFaEMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLG9CQUFvQixDQUFDO0lBQzVDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7UUFDekIsSUFBSSxVQUFVLEtBQUssR0FBRyxDQUFDLG9CQUFvQjtZQUFFLE9BQU87UUFDcEQsR0FBRyxDQUFDLGVBQWUsQ0FDakIsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUM3RCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVdGlscyB1c2VkIGJ5IHRoZSBidW5kbGVyIHdoZW4gdHJhbnNmb3JtaW5nIGNvZGVcbiAqL1xuXG5pbXBvcnQgeyBXb3JrZmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgd2l0aFJlc29sdmVycyB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFdvcmxkQ2FwYWJpbGl0aWVzIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgRXZlbnRzQ29uc3VtZXIgfSBmcm9tICcuL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgeyB0eXBlIFF1ZXVlSXRlbSwgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXBsYXlQYXlsb2FkQ2FjaGUgfSBmcm9tICcuL3JlcGxheS1wYXlsb2FkLWNhY2hlLmpzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi9zY2hlbWFzLmpzJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZEtleSB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFxuICBBcmdzIGV4dGVuZHMgU2VyaWFsaXphYmxlW10gPSBhbnlbXSxcbiAgUmVzdWx0IGV4dGVuZHMgU2VyaWFsaXphYmxlIHwgdW5rbm93biA9IHVua25vd24sXG4+ID0gKCguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPFJlc3VsdD4pICYge1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICBzdGVwSWQ/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBSZWdpc3RlcmVkU3RlcHNLZXkgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvY29yZS8vcmVnaXN0ZXJlZFN0ZXBzJyk7XG5cbmNvbnN0IGdsb2JhbFN5bWJvbHM6IHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICBbUmVnaXN0ZXJlZFN0ZXBzS2V5XT86IE1hcDxzdHJpbmcsIFN0ZXBGdW5jdGlvbj47XG59ID0gZ2xvYmFsVGhpcztcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IC9cbmNvbnN0IHJlZ2lzdGVyZWRTdGVwcyA9IChnbG9iYWxTeW1ib2xzW1JlZ2lzdGVyZWRTdGVwc0tleV0gPz89IG5ldyBNYXA8XG4gIHN0cmluZyxcbiAgU3RlcEZ1bmN0aW9uXG4+KCkpO1xuXG5jb25zdCBCVUlMVElOX1JFU1BPTlNFX1NURVBfTkFNRVMgPSBuZXcgU2V0KFtcbiAgJ19fYnVpbHRpbl9yZXNwb25zZV9hcnJheV9idWZmZXInLFxuICAnX19idWlsdGluX3Jlc3BvbnNlX2pzb24nLFxuICAnX19idWlsdGluX3Jlc3BvbnNlX3RleHQnLFxuXSk7XG5cbmZ1bmN0aW9uIGdldFN0ZXBJZEFsaWFzQ2FuZGlkYXRlcyhzdGVwSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGFydHMgPSBzdGVwSWQuc3BsaXQoJy8vJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgcGFydHNbMF0gIT09ICdzdGVwJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZVBhdGggPSBwYXJ0c1sxXTtcbiAgY29uc3QgZm5OYW1lID0gcGFydHNbMl07XG4gIGNvbnN0IG1vZHVsZVBhdGhBbGlhc2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3QgYWRkQWxpYXMgPSAoYWxpYXNNb2R1bGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoYWxpYXNNb2R1bGVQYXRoICE9PSBtb2R1bGVQYXRoKSB7XG4gICAgICBtb2R1bGVQYXRoQWxpYXNlcy5hZGQoYWxpYXNNb2R1bGVQYXRoKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKG1vZHVsZVBhdGguc3RhcnRzV2l0aCgnLi93b3JrZmxvd3MvJykpIHtcbiAgICBjb25zdCB3b3JrZmxvd1JlbGF0aXZlUGF0aCA9IG1vZHVsZVBhdGguc2xpY2UoJy4vJy5sZW5ndGgpO1xuICAgIGFkZEFsaWFzKGAuL2V4YW1wbGUvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9zcmMvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgfSBlbHNlIGlmIChtb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJy4vZXhhbXBsZS93b3JrZmxvd3MvJykpIHtcbiAgICBjb25zdCB3b3JrZmxvd1JlbGF0aXZlUGF0aCA9IG1vZHVsZVBhdGguc2xpY2UoJy4vZXhhbXBsZS8nLmxlbmd0aCk7XG4gICAgYWRkQWxpYXMoYC4vJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9zcmMvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgfSBlbHNlIGlmIChtb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJy4vc3JjL3dvcmtmbG93cy8nKSkge1xuICAgIGNvbnN0IHdvcmtmbG93UmVsYXRpdmVQYXRoID0gbW9kdWxlUGF0aC5zbGljZSgnLi9zcmMvJy5sZW5ndGgpO1xuICAgIGFkZEFsaWFzKGAuLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gICAgYWRkQWxpYXMoYC4vZXhhbXBsZS8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgbW9kdWxlUGF0aEFsaWFzZXMsXG4gICAgKGFsaWFzTW9kdWxlUGF0aCkgPT4gYHN0ZXAvLyR7YWxpYXNNb2R1bGVQYXRofS8vJHtmbk5hbWV9YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRCdWlsdGluUmVzcG9uc2VTdGVwQWxpYXMoc3RlcElkOiBzdHJpbmcpOiBTdGVwRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICBpZiAoIUJVSUxUSU5fUkVTUE9OU0VfU1RFUF9OQU1FUy5oYXMoc3RlcElkKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtyZWdpc3RlcmVkU3RlcElkLCBzdGVwRm5dIG9mIHJlZ2lzdGVyZWRTdGVwcy5lbnRyaWVzKCkpIHtcbiAgICBpZiAocmVnaXN0ZXJlZFN0ZXBJZC5lbmRzV2l0aChgLy8ke3N0ZXBJZH1gKSkge1xuICAgICAgcmV0dXJuIHN0ZXBGbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgc3RlcCBmdW5jdGlvbiB0byBiZSBzZXJ2ZWQgaW4gdGhlIHNlcnZlciBidW5kbGUuXG4gKiBBbHNvIHNldHMgdGhlIHN0ZXBJZCBwcm9wZXJ0eSBvbiB0aGUgZnVuY3Rpb24gZm9yIHNlcmlhbGl6YXRpb24gc3VwcG9ydC5cbiAqXG4gKiBOb3RlOiBUaGUgU1dDIGNvbXBpbGVyIHBsdWdpbiBubyBsb25nZXIgZ2VuZXJhdGVzIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uXG4gKiBTdGVwIHJlZ2lzdHJhdGlvbiBpcyBub3cgaW5saW5lZCBhcyBhIHNlbGYtY29udGFpbmVkIElJRkUgdGhhdCB3cml0ZXNcbiAqIGRpcmVjdGx5IHRvIHRoZSBnbG9iYWwgTWFwIGF0IFN5bWJvbC5mb3IoXCJAd29ya2Zsb3cvY29yZS8vcmVnaXN0ZXJlZFN0ZXBzXCIpLlxuICogVGhpcyBmdW5jdGlvbiBpcyBrZXB0IGZvciBpbnRlcm5hbC90ZXN0IHVzZSBvbmx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTdGVwRnVuY3Rpb24oc3RlcElkOiBzdHJpbmcsIHN0ZXBGbjogU3RlcEZ1bmN0aW9uKSB7XG4gIHJlZ2lzdGVyZWRTdGVwcy5zZXQoc3RlcElkLCBzdGVwRm4pO1xuICBzdGVwRm4uc3RlcElkID0gc3RlcElkO1xufVxuXG4vKipcbiAqIEZpbmQgYSByZWdpc3RlcmVkIHN0ZXAgZnVuY3Rpb24gYnkgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RlcEZ1bmN0aW9uKHN0ZXBJZDogc3RyaW5nKTogU3RlcEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGlyZWN0TWF0Y2ggPSByZWdpc3RlcmVkU3RlcHMuZ2V0KHN0ZXBJZCk7XG4gIGlmIChkaXJlY3RNYXRjaCkge1xuICAgIHJldHVybiBkaXJlY3RNYXRjaDtcbiAgfVxuXG4gIC8vIFN1cHBvcnQgZXF1aXZhbGVudCB3b3JrZmxvdyBwYXRoIGFsaWFzZXMgaW4gbWl4ZWQgc3ltbGluayBlbnZpcm9ubWVudHMuXG4gIGZvciAoY29uc3QgYWxpYXNTdGVwSWQgb2YgZ2V0U3RlcElkQWxpYXNDYW5kaWRhdGVzKHN0ZXBJZCkpIHtcbiAgICBjb25zdCBhbGlhc01hdGNoID0gcmVnaXN0ZXJlZFN0ZXBzLmdldChhbGlhc1N0ZXBJZCk7XG4gICAgaWYgKGFsaWFzTWF0Y2gpIHtcbiAgICAgIHJldHVybiBhbGlhc01hdGNoO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJ1aWx0aW5BbGlhc01hdGNoID0gZ2V0QnVpbHRpblJlc3BvbnNlU3RlcEFsaWFzKHN0ZXBJZCk7XG4gIGlmIChidWlsdGluQWxpYXNNYXRjaCkge1xuICAgIHJldHVybiBidWlsdGluQWxpYXNNYXRjaDtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8vIE5vdGU6IF9fcHJpdmF0ZV9nZXRDbG9zdXJlVmFycyBpcyBubyBsb25nZXIgcmUtZXhwb3J0ZWQgaGVyZS5cbi8vIFRoZSBTV0MgY29tcGlsZXIgcGx1Z2luIG5vdyBpbmxpbmVzIGNsb3N1cmUgdmFyaWFibGUgYWNjZXNzIGFzIGFcbi8vIHNlbGYtY29udGFpbmVkIElJRkUgdGhhdCByZWFkcyBkaXJlY3RseSBmcm9tIHRoZSBnbG9iYWwgQXN5bmNMb2NhbFN0b3JhZ2Vcbi8vIGF0IFN5bWJvbC5mb3IoXCJXT1JLRkxPV19TVEVQX0NPTlRFWFRfU1RPUkFHRVwiKS5cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQge1xuICBydW5JZDogc3RyaW5nO1xuICBlbmNyeXB0aW9uS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkO1xuICB3b3JsZENhcGFiaWxpdGllcz86IFdvcmxkQ2FwYWJpbGl0aWVzO1xuICBnbG9iYWxUaGlzOiB0eXBlb2YgZ2xvYmFsVGhpcztcbiAgLyoqXG4gICAqIEluY3JlbWVudHMgd2hlbiBhIHN1c3BlbnNpb24gaXMgYWNjZXB0ZWQgYW5kIG9uIGV2ZXJ5IHJldGFpbmVkLXNlc3Npb25cbiAgICogcmVzdW1lLiBTdGVwLCBob29rLCB3YWl0LCBhbmQgYXR0cmlidXRlIHN1c3BlbnNpb24gc2lnbmFscyBjYXB0dXJlIGl0IHdoZW5cbiAgICogc2NoZWR1bGVkIGFuZCBuby1vcCBpZiBpdCBtb3ZlZCwgd2hpY2ggZHJvcHMgc2FtZS1ib3VuZGFyeSBzaWJsaW5nIHNpZ25hbHNcbiAgICogYW5kIHRpbWVycyBxdWV1ZWQgYXQgYm91bmRhcnkgTiB0aGF0IHdvdWxkIGZpcmUgYWZ0ZXIgdGhlIHNlc3Npb24gcmVzdW1lZFxuICAgKiBpbnRvIGJvdW5kYXJ5IE4rMS5cbiAgICovXG4gIHN1c3BlbnNpb25HZW5lcmF0aW9uOiBudW1iZXI7XG4gIGV2ZW50c0NvbnN1bWVyOiBFdmVudHNDb25zdW1lcjtcbiAgLyoqXG4gICAqIE1hcCBvZiBwZW5kaW5nIGludm9jYXRpb25zIGtleWVkIGJ5IGNvcnJlbGF0aW9uSWQuXG4gICAqIFVzaW5nIE1hcCBpbnN0ZWFkIG9mIEFycmF5IGZvciBPKDEpIGxvb2t1cC9kZWxldGUgb3BlcmF0aW9ucy5cbiAgICovXG4gIGludm9jYXRpb25zUXVldWU6IE1hcDxzdHJpbmcsIFF1ZXVlSXRlbT47XG4gIG9uV29ya2Zsb3dFcnJvcjogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIE1pbnRzIHRoZSBVTElEIGJvZHkgb2YgYSBjb3JyZWxhdGlvbiBpZC4gRXZlcnkgZW50aXR5IGEgcmVwbGF5IGNyZWF0ZXNcbiAgICogZHJhd3MgZnJvbSB0aGlzIG9uZSBtb25vdG9uaWMgc2VxdWVuY2UsIHNvIGFuIGlkIGlzIGFuIG9yZGluYWwgb3ZlciB0aGVcbiAgICogd2hvbGUgcnVuIGFuZCBib3RoIHJlcGxheXMgb2YgYSBydW4gbXVzdCBkcmF3IGluIHRoZSBzYW1lIG9yZGVyLlxuICAgKi9cbiAgZ2VuZXJhdGVVbGlkOiAoKSA9PiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNb25vdG9uZSBjb3VudCBvZiBjb3JyZWxhdGlvbi1pZCBkcmF3cyB0aGlzIHJlcGxheSBoYXMgbWFkZS4gUHJvZ3Jlc3NcbiAgICogbWV0cmljIGZvciB7QGxpbmsgcXVpZXNjZUVhcmxpZXJDYXNjYWRlc306IGEgbWFjcm90YXNrIHR1cm4gaW4gd2hpY2ggaXRcbiAgICogZG9lcyBub3QgbW92ZSAoYW5kIG5vIGh5ZHJhdGlvbiBpcyBpbiBmbGlnaHQpIG1lYW5zIGV2ZXJ5IHdva2VuIGJyYW5jaCBoYXNcbiAgICogcnVuIGFzIGZhciBhcyBpdCBjYW4gd2l0aG91dCBhbm90aGVyIGRlbGl2ZXJ5LiBPcHRpb25hbCBzbyBsaWdodHdlaWdodFxuICAgKiB0ZXN0IGNvbnRleHRzIGRlZ3JhZGUgdG8gdGhlIHNpbmdsZS15aWVsZCBiZWhhdmlvci5cbiAgICovXG4gIHJlYWRvbmx5IG1pbnRDb3VudD86IG51bWJlcjtcbiAgZ2VuZXJhdGVOYW5vaWQ6ICgpID0+IHN0cmluZztcbiAgLyoqXG4gICAqIFNlcXVlbnRpYWwgcHJvbWlzZSBxdWV1ZSB0aGF0IGVuc3VyZXMgYWxsIGV2ZW50LWRyaXZlbiBwcm9taXNlIHJlc29sdXRpb25zXG4gICAqIChzdGVwIHJlc3VsdHMsIGhvb2sgcGF5bG9hZHMsIGZhaWx1cmVzLCBzdXNwZW5zaW9ucykgaGFwcGVuIGluIGV2ZW50IGxvZ1xuICAgKiBvcmRlci4gRXZlcnkgcmVzb2x2ZSwgcmVqZWN0LCBvciB3b3JrZmxvdyBlcnJvciBpcyBjaGFpbmVkIHRocm91Z2ggdGhpc1xuICAgKiBxdWV1ZSBzbyB0aGF0IGV2ZW4gaWYgaW5kaXZpZHVhbCBvcGVyYXRpb25zIHRha2UgdmFyaWFibGUgdGltZSAoZS5nLixcbiAgICogYXN5bmMgZGVjcnlwdGlvbiksIHByb21pc2VzIHJlc29sdmUgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gICAqL1xuICBwcm9taXNlUXVldWU6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBDb3VudGVyIG9mIGluLWZsaWdodCBhc3luYyBkYXRhIGRlbGl2ZXJ5IG9wZXJhdGlvbnMgKHN0ZXAgcmVzdWx0XG4gICAqIGh5ZHJhdGlvbiwgaG9vayBwYXlsb2FkIGh5ZHJhdGlvbiwgYWJvcnQgc2lnbmFsIGh5ZHJhdGlvbikuIFN1c3BlbnNpb25zXG4gICAqIG11c3Qgd2FpdCBmb3IgdGhpcyB0byByZWFjaCAwIGJlZm9yZSBmaXJpbmcsIHRvIGF2b2lkIHByZWVtcHRpbmcgZGF0YVxuICAgKiBkZWxpdmVyeSwgZS5nLiBkZWh5ZHJhdGluZyBhIHN0ZXAncyBhcmd1bWVudHMgd2hpbGUgYW4gYWJvcnQgdGhhdCBzaG91bGRcbiAgICogYmUgcmVmbGVjdGVkIGluIHRob3NlIGFyZ3VtZW50cyBpcyBzdGlsbCBoeWRyYXRpbmcgaXRzIHJlYXNvbi5cbiAgICovXG4gIHBlbmRpbmdEZWxpdmVyaWVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBPcmRlcmVkIHJlZ2lzdHJ5IG9mIGluLWZsaWdodCBcImJyYW5jaC1kZWNpZGluZ1wiIGRlbGl2ZXJpZXM6IHRoZVxuICAgKiByZXNvbHV0aW9ucyBhIHdvcmtmbG93IHR5cGljYWxseSBgUHJvbWlzZS5yYWNlYHMgb24sIG9yIGF3YWl0cyBmcm9tXG4gICAqIGluZGVwZW5kZW50IGNvbmN1cnJlbnQgYnJhbmNoZXM6IGhvb2sgcGF5bG9hZHMgKGBob29rX3JlY2VpdmVkYCksIHdhaXRcbiAgICogY29tcGxldGlvbnMgKGB3YWl0X2NvbXBsZXRlZGApLCBhbmQgc3RlcCByZXN1bHRzIChgc3RlcF9jb21wbGV0ZWRgIC9cbiAgICogYHN0ZXBfZmFpbGVkYCkuIEtleWVkIGJ5IHRoZSBkZWxpdmVyeSdzIHBvc2l0aW9uIChpbmRleCkgaW4gdGhlIGNvbnN1bWVkXG4gICAqIGV2ZW50IGxvZy5cbiAgICpcbiAgICogVGhlIHByb2JsZW06IGVhY2ggb2YgdGhlc2UgcmVzb2x1dGlvbnMgcmVhY2hlcyB3b3JrZmxvdyBjb2RlIGFmdGVyIGFcbiAgICogZGlmZmVyZW50LCB3b3JrbG9hZC1kZXBlbmRlbnQgbnVtYmVyIG9mIG1pY3JvdGFzayBob3BzLiBBIGJ1ZmZlcmVkIGhvb2tcbiAgICogcGF5bG9hZCBpcyBvYnNlcnZlZCB2aWEgdGhlIGFzeW5jIGhvb2sgaXRlcmF0b3IgKGB5aWVsZCBhd2FpdCB0aGlzYCksXG4gICAqIGNvc3RpbmcgZXh0cmEgaG9wczsgYSBgd2FpdF9jb21wbGV0ZWRgIHJlc29sdmVzIHdpdGggZmV3ZXIsIGFuZCBhIHJldXNlZFxuICAgKiBzbGVlcCBjYW4gcmVzb2x2ZSBpbiBhbiBlbnRpcmVseSBlYXJsaWVyIGxvb3AgaXRlcmF0aW9uOyBhIHN0ZXAgcmVzdWx0IGlzXG4gICAqIGdhdGVkIG9uIGh5ZHJhdGlvbiB3aG9zZSBjb3N0IHZhcmllcyBiZXR3ZWVuIHJlcGxheXMgb2YgdGhlIFNBTUVcbiAgICogaW52b2NhdGlvbjogdGhlIGZpcnN0IHJlcGxheSBwYXlzIHRoZSBmdWxsIGRlY3J5cHQvZGVjb21wcmVzcy9yZXZpdmUsXG4gICAqIHdoaWxlIGxhdGVyIHJlcGxheXMgc2hhcmluZyB0aGUgaW52b2NhdGlvbidzIGBSZXBsYXlQYXlsb2FkQ2FjaGVgXG4gICAqIG1lbW8taGl0IHNtYWxsIHByaW1pdGl2ZSByZXN1bHRzIGFuZCByZXNvbHZlIGluIG9uZSBvciB0d28gaG9wcy4gRWl0aGVyXG4gICAqIHdheSwgdGhlIHJlc29sdXRpb24gdGhhdCB0aGUgY29tbWl0dGVkIGV2ZW50IGxvZyBvcmRlcmVkIGZpcnN0IGNhbiBsb3NlIGFcbiAgICogYFByb21pc2UucmFjZWAgKG9yIGEgYHVzZVN0ZXBgIFVMSUQgYWxsb2NhdGlvbikgdG8gYSBmYXN0ZXItIG9yXG4gICAqIGFscmVhZHktcmVzb2x2ZWQgY29tcGV0aXRvciwgZGl2ZXJnaW5nIGZyb20gdGhlIGxvZyBhbmQgc3VyZmFjaW5nIGFzXG4gICAqIGBDb3JydXB0ZWRFdmVudExvZ0Vycm9yYC5cbiAgICpcbiAgICogVGhlIGZpeCBpcyBhIHN0cmljdCwgZGV0ZXJtaW5pc3RpYyBkZWxpdmVyeSBvcmRlciBhbmNob3JlZCBvblxuICAgKiBldmVudC1sb2cgcG9zaXRpb246IGEgZGVsaXZlcnkgZG9lcyBub3QgcmVzb2x2ZSB0byB0aGUgd29ya2Zsb3cgdW50aWxcbiAgICogZXZlcnkgcmVsZXZhbnQgZWFybGllci1pbi1sb2cgZGVsaXZlcnkgaGFzIGJlZW4gZGVsaXZlcmVkLiBCZWNhdXNlIHRoZVxuICAgKiBnYXRlIGlzIFwidGhlIGVhcmxpZXIgZGVsaXZlcnkgcmVzb2x2ZWRcIiwgbm90IFwid29uIGEgdGltaW5nIHJhY2VcIiwgdGhlXG4gICAqIG91dGNvbWUgaXMgaW5kZXBlbmRlbnQgb2YgbWljcm90YXNrIGhvcHMsIGh5ZHJhdGlvbi9kZWNyeXB0aW9uIHRpbWUsXG4gICAqIGFuZCBgUHJvbWlzZS5yYWNlYCBhcmd1bWVudCBvcmRlci4gV2hpY2ggZWFybGllciBraW5kcyBhIGRlbGl2ZXJ5IGRlZmVyc1xuICAgKiBiZWhpbmQgaXMgc3BlbGxlZCBvdXQgb24ge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9LlxuICAgKlxuICAgKiBJbmRleCBpcyB1c2VkIHJhdGhlciB0aGFuIHRoZSBgZXZlbnRJZGAgc3RyaW5nIGJlY2F1c2UgYGV2ZW50SWRgIGlzIGFuXG4gICAqIG9wYXF1ZSwgd29ybGQtYXNzaWduZWQgdmFsdWUgbm90IGd1YXJhbnRlZWQgdG8gc29ydCBpbiBjcmVhdGlvbiBvcmRlclxuICAgKiAob25seSB0aGUgYnVuZGxlZCBVTElEIHdvcmxkcyBoYXBwZW4gdG8pLlxuICAgKlxuICAgKiBPcHRpb25hbCBzbyBvbGRlci9vdXQtb2YtdHJlZSBjb250ZXh0cyAoYW5kIGxpZ2h0d2VpZ2h0IHRlc3QgaGFybmVzc2VzKVxuICAgKiB0aGF0IGRvIG5vdCBpbml0aWFsaXplIGl0IGRlZ3JhZGUgZ3JhY2VmdWxseSB0byB0aGUgcHJldmlvdXMgYmVoYXZpb3IuXG4gICAqL1xuICBwZW5kaW5nRGVsaXZlcnlCYXJyaWVycz86IE1hcDxudW1iZXIsIERlbGl2ZXJ5QmFycmllckVudHJ5PjtcbiAgLyoqXG4gICAqIEludm9jYXRpb24tc2NvcGVkIGNhY2hlIG9mIHByZXBhcmVkIHNlcmlhbGl6ZWQgcGF5bG9hZHMgYW5kIGltbXV0YWJsZSBmaW5hbFxuICAgKiB2YWx1ZXMuIFByZXBhcmVkIGJ5dGVzIHN1cnZpdmUgZnJlc2ggcmVwbGF5IFZNczsgb2JqZWN0IGdyYXBocyBkbyBub3QuXG4gICAqL1xuICByZXBsYXlQYXlsb2FkQ2FjaGU6IFJlcGxheVBheWxvYWRDYWNoZTtcbn1cblxuLyoqIFRoZSBraW5kIG9mIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBhIGJhcnJpZXIgcmVwcmVzZW50cy4gKi9cbmV4cG9ydCB0eXBlIERlbGl2ZXJ5S2luZCA9ICdob29rJyB8ICd3YWl0JyB8ICdzdGVwJztcblxuaW50ZXJmYWNlIERlbGl2ZXJ5QmFycmllckVudHJ5IHtcbiAga2luZDogRGVsaXZlcnlLaW5kO1xuICAvKiogUmVzb2x2ZXMgb25jZSB0aGlzIGRlbGl2ZXJ5IGlzIGhhbmRlZCB0byB0aGUgd29ya2Zsb3cgb3IgcmV0aXJlZC4gKi9cbiAgcmVsZWFzZWQ6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZGVsaXZlcnkgaXMgY29tbWl0dGVkIHRvIHJlYWNoaW5nIHRoZSB3b3JrZmxvdyB3aXRob3V0IGFueVxuICAgKiBmdXJ0aGVyIGFjdGlvbiBieSB3b3JrZmxvdyBjb2RlLiBUcnVlIGZvciB3YWl0IGNvbXBsZXRpb25zIGFuZCBzdGVwXG4gICAqIHJlc3VsdHMsIHdoaWNoIGFsd2F5cyByZXNvbHZlIGZyb20gdGhlaXIgb3duIGNoYWluLCBhbmQgZm9yIGEgaG9vayBwYXlsb2FkXG4gICAqIHRoYXQgYWxyZWFkeSBoYWQgYSB3YWl0aW5nIGNvbnN1bWVyIHdoZW4gaXQgd2FzIGNvbnN1bWVkLlxuICAgKlxuICAgKiBGYWxzZSBmb3IgYSBCVUZGRVJFRCBob29rIHBheWxvYWQgbm8gY29uc3VtZXIgaGFzIGNsYWltZWQgeWV0OiBpdCBpc1xuICAgKiBkZWxpdmVyZWQgYnkgYGNsYWltKClgLCBpLmUuIHdoZW5ldmVyIHRoZSB3b3JrZmxvdyBuZXh0IHJlYWRzIHRoZSBob29rLFxuICAgKiB3aGljaCBtYXkgYmUgY2F1c2FsbHkgKmFmdGVyKiBhIGxhdGVyLWluLWxvZyBkZWxpdmVyeS4gYGFybSgpYCBmbGlwcyBpdFxuICAgKiBvbmNlIGEgY29uc3VtZXIgdGFrZXMgdGhlIHBheWxvYWQuXG4gICAqL1xuICBhcm1lZDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhpcyBlbnRyeSBoYXMgYmVlbiByZW1vdmVkIGFuZCBpdHMgYHJlbGVhc2VkYCBwcm9taXNlIHNldHRsZWQuICovXG4gIHJldGlyZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSZXRpcmUgdGhpcyBlbnRyeTogcmVzb2x2ZSBgcmVsZWFzZWRgIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgcmVnaXN0cnksXG4gICAqIHdpdGhvdXQgbWFya2luZyB0aGUgaGFuZGxlIGRlbGl2ZXJlZCB0byB0aGUgd29ya2Zsb3cuIEEgc2FmZXR5LXJldGlyZWRcbiAgICogYnVmZmVyZWQgcGF5bG9hZCBtYXkgdGhlcmVmb3JlIGluc3RhbGwgYSBmcmVzaCBlbnRyeSBpZiBpdCBpcyBjbGFpbWVkIGJ5XG4gICAqIGEgcmV0YWluZWQgVk0gbGF0ZXIuIENhbGxlZCBvbmx5IGJ5IHRoZSBjb250ZXh0J3Mgc2FmZXR5LW5ldCBkaXNwZW5zZXJcbiAgICogKHtAbGluayBlbnN1cmVCYXJyaWVyU2FmZXR5TmV0fSksIGFuZCBvbmx5IG9uIHRoZSBsb3dlc3QtaW5kZXggZW50cnkgYXRcbiAgICogZGVsaXZlcnkgaWRsZS4gSWRlbXBvdGVudC5cbiAgICovXG4gIHJldGlyZTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBXaGljaCBlYXJsaWVyIGtpbmRzIGVhY2ggZGVsaXZlcnkga2luZCBkZWZlcnMgYmVoaW5kLiBDaG9zZW4gc28gdGhhdCBubyBraW5kXG4gKiBibG9ja3Mgb24gYSBwZWVyIGl0IGRvZXMgbm90IG5lZWQgdG86XG4gKlxuICogIC0gYSBob29rIGRlZmVycyBiZWhpbmQgZWFybGllciBIT09LUywgV0FJVFMgYW5kIFNURVBTO1xuICogIC0gYSB3YWl0IGRlZmVycyBiZWhpbmQgZWFybGllciBIT09LUyBhbmQgU1RFUFMgKG5vdCBlYXJsaWVyIHdhaXRzLCBzaW5jZSBhXG4gKiAgICB3YWl0IG5ldmVyIG5lZWRzIHRvIHF1ZXVlIGJlaGluZCBhbm90aGVyIHdhaXQpO1xuICogIC0gYSBzdGVwIGRlZmVycyBiZWhpbmQgZWFybGllciBXQUlUUywgSE9PS1MgYW5kIFNURVBTLlxuICpcbiAqIFRoZSBzdGVwLWJlaGluZC1zdGVwIGVkZ2UgaXMgbm90IHJlZHVuZGFudCB3aXRoIHRoZSBzZXJpYWwgYHByb21pc2VRdWV1ZWAuXG4gKiBUaGUgcXVldWUgZml4ZXMgdGhlIG9yZGVyIGluIHdoaWNoIHN0ZXAgcmVzdWx0cyBhcmUgSFlEUkFURUQsIGJ1dCBhIHN0ZXAgbm9cbiAqIGxvbmdlciByZXNvbHZlcyBpbnNpZGUgaXRzIHF1ZXVlIHNsb3Q6IGl0IGNhcHR1cmVzIHRoZSBvdXRjb21lIHRoZXJlIGFuZFxuICogcmVzb2x2ZXMgZnJvbSBhIGRldGFjaGVkIGNvbnRpbnVhdGlvbiBvbmNlIGl0cyBiYXJyaWVyIGNsZWFycy4gVHdvIHN0ZXBzXG4gKiBhZ3JlZSBvbiB0aGF0IGNvbnRpbnVhdGlvbidzIG9yZGVyaW5nIG9ubHkgd2hpbGUgdGhleSBkZWZlciBiZWhpbmQgdGhlIHNhbWVcbiAqIHNldCwgd2hpY2ggaG9sZHMgd2hlbiB0aGV5IGFyZSBjb25zdW1lZCBpbiB0aGUgc2FtZSBkcmFpbiB3aW5kb3cgYnV0IG5vdFxuICogYWNyb3NzIHdpbmRvd3M6IGEgc3RlcCBjb25zdW1lZCBsYXRlciBjYW4gbWlzcyBhIHdhaXQvaG9vayBiYXJyaWVyIHRoYXQgYW5cbiAqIGVhcmxpZXIgc3RlcCBpcyBzdGlsbCBwYXJrZWQgb24sIGJlY2F1c2UgdGhlIGJhcnJpZXIgcmV0aXJlZCBpbiBiZXR3ZWVuLiBUaGVcbiAqIGVhcmxpZXIgc3RlcCBpcyB0aGVuIHdhaXRpbmcgb3V0IHRoZSBtYWNyb3Rhc2sgeWllbGQgYmVsb3cgd2hpbGUgdGhlIGxhdGVyXG4gKiBvbmUgcmVzb2x2ZXMgb24gbWljcm90YXNrcywgYW5kIG92ZXJ0YWtlcyBpdC4gU2VlXG4gKiBgZGVsaXZlcnktYmFycmllci1jb3ZlcmFnZS50ZXN0LnRzYC4gRGVmZXJyaW5nIGJlaGluZCBlYXJsaWVyIHN0ZXBzXG4gKiBjbG9zZXMgdGhhdCB3aW5kb3cgc3RydWN0dXJhbGx5OiB0aGUgZWFybGllciBzdGVwJ3MgYmFycmllciBpcyBzdGlsbFxuICogcmVnaXN0ZXJlZCBwcmVjaXNlbHkgYmVjYXVzZSBpdCBoYXMgbm90IGRlbGl2ZXJlZCB5ZXQuXG4gKlxuICogRXZlcnkgZWRnZSBwb2ludHMgZnJvbSBhIGxhdGVyIGxvZyBpbmRleCB0byBhIHN0cmljdGx5IGVhcmxpZXIgb25lLCBzbyB0aGVcbiAqIHdhaXQtZm9yIGdyYXBoIGNhbiBuZXZlciBjb250YWluIGEgY3ljbGUuXG4gKi9cbmNvbnN0IERFRkVSX0JFSElORDogUmVjb3JkPERlbGl2ZXJ5S2luZCwgcmVhZG9ubHkgRGVsaXZlcnlLaW5kW10+ID0ge1xuICBob29rOiBbJ2hvb2snLCAnd2FpdCcsICdzdGVwJ10sXG4gIHdhaXQ6IFsnaG9vaycsICdzdGVwJ10sXG4gIHN0ZXA6IFsnd2FpdCcsICdob29rJywgJ3N0ZXAnXSxcbn07XG5cbi8qKlxuICogV2hldGhlciBhIGRlbGl2ZXJ5IG9mIGBraW5kYCBhdCBsb2cgaW5kZXggYGluZGV4YCBnYXRlcyBvbiB0aGUgZWFybGllclxuICogcmVnaXN0cnkgZW50cnkgYG90aGVyYCAoYXQgYG90aGVySW5kZXhgKS5cbiAqXG4gKiBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGF0IHF1ZXN0aW9uLCBjYWxsZWQgYnkgYm90aFxuICoge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9ICh3aGljaCBhd2FpdHMgd2hhdCBpdCBnYXRlcyBvbikgYW5kXG4gKiB7QGxpbmsgY29tcHV0ZVJlc29sdmVzT25JdHNPd259ICh3aGljaCByZWN1cnNlcyBpbnRvIHdoYXQgaXQgZ2F0ZXMgb24pLlxuICogVGhvc2UgdHdvIE1VU1QgYWdyZWUgZXhhY3RseSwgYW5kIHRoZSBkb2MgYmxvY2sgb25cbiAqIHtAbGluayBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzfSBzdGFrZXMgZGVhZGxvY2stZnJlZWRvbSBvbiBpdCwgc28gdGhlXG4gKiBjb25kaXRpb24gbGl2ZXMgaGVyZSByYXRoZXIgdGhhbiBiZWluZyBzcGVsbGVkIG91dCB0d2ljZS5cbiAqXG4gKiBPbmUgZGVsaWJlcmF0ZSBleGNlcHRpb246IHRoZSBsb2ctb3JkZXItZHJhd3MgdHVybnN0aWxlIGluXG4gKiB7QGxpbmsgcXVpZXNjZUVhcmxpZXJDYXNjYWRlc30gd2FpdHMgb24gQU5ZIGxvd2VyIGFybWVkIGVudHJ5LCBhIHN0cmljdGx5XG4gKiB3aWRlciByZWxhdGlvbiB0aGFuIHRoaXMgb25lLiBXaHkgdGhhdCB3aWR0aCBjYW5ub3QgZGVhZGxvY2sgdGhlXG4gKiBzYWZldHktbmV0IGRpc3BlbnNlciBpcyBhcmd1ZWQgYXQgdGhlIHR1cm5zdGlsZSBpdHNlbGYuXG4gKi9cbmZ1bmN0aW9uIGdhdGVzT24oXG4gIGtpbmQ6IERlbGl2ZXJ5S2luZCxcbiAgaW5kZXg6IG51bWJlcixcbiAgb3RoZXJJbmRleDogbnVtYmVyLFxuICBvdGhlcjogRGVsaXZlcnlCYXJyaWVyRW50cnlcbik6IGJvb2xlYW4ge1xuICBpZiAob3RoZXJJbmRleCA+PSBpbmRleCB8fCAhREVGRVJfQkVISU5EW2tpbmRdLmluY2x1ZGVzKG90aGVyLmtpbmQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEEgc3RlcCBza2lwcyBhbiBVTkFSTUVEIGVhcmxpZXIgZW50cnkgKGFuIHVuY2xhaW1lZCBidWZmZXJlZCBob29rXG4gIC8vIHBheWxvYWQpLiBTZWUgdGhlIGFzeW1tZXRyeSBkZXNjcmliZWQgb24gYGF3YWl0RWFybGllckRlbGl2ZXJpZXNgLiBUaGVcbiAgLy8gc2tpcCBpcyBkaXJlY3QsIG5ldmVyIHRyYW5zaXRpdmU6IGFybWVkIGVudHJpZXMgYXJlIHN0aWxsIGdhdGVkIG9uLCBldmVuXG4gIC8vIHdoZW4gdGhleSBhcmUgdGhlbXNlbHZlcyBwYXJrZWQgYmVoaW5kIHN1Y2ggYSBwYXlsb2FkLlxuICByZXR1cm4gIShraW5kID09PSAnc3RlcCcgJiYgIW90aGVyLmFybWVkKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBlbnRyeWAgd2lsbCByZXNvbHZlIG9uIGl0cyBvd246IGl0IGlzIGFybWVkLCBhbmQgZXZlcnkgZWFybGllclxuICogZGVsaXZlcnkgaXQgYWN0dWFsbHkgZ2F0ZXMgb24gKHtAbGluayBnYXRlc09ufSkgd2lsbCBsaWtld2lzZSByZXNvbHZlIG9uIGl0c1xuICogb3duLlxuICpcbiAqIEEgc3RlcCBkb2VzIG5vdCBnYXRlIG9uIGFuIHVuY2xhaW1lZCBidWZmZXJlZCBwYXlsb2FkLCBzbyBzdWNoIGEgcGF5bG9hZFxuICogY2Fubm90IGtlZXAgaXQgZnJvbSByZXNvbHZpbmcuIEEgc3RlcCBET0VTIGdhdGUgb24gZWFybGllciBhcm1lZCB3YWl0cyBhbmRcbiAqIGhvb2tzLCBzbyBvbmUgcGFya2VkIGJlaGluZCBhbiB1bmNsYWltZWQgcGF5bG9hZCBtYWtlcyB0aGUgc3RlcFxuICogbm9uLXNlbGYtcmVzb2x2aW5nIGluIHR1cm4uIERpc2FncmVlaW5nIHdpdGgge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9XG4gKiBoZXJlIHdvdWxkIG5vdCBiZSBhIGNvc21ldGljIHByb2JsZW06IHRoaXMgcHJlZGljYXRlIGlzIHdoYXRcbiAqIHtAbGluayBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeX0gdXNlcyB0byBkZWNpZGUgd2hldGhlciBpZGxlIGlzIHJlYWNoYWJsZSxcbiAqIGFuZCBhbiBlbnRyeSByZXBvcnRlZCBzZWxmLXJlc29sdmluZyB3aGlsZSBpdCBpcyBpbiBmYWN0IHBhcmtlZCBiZWhpbmQgYVxuICogcGF5bG9hZCB0aGF0IG9ubHkgdGhlIGlkbGUgc2FmZXR5IG5ldCBjYW4gcmV0aXJlIHdvdWxkIGdhdGUgaXRzIG93blxuICogcmV0aXJlbWVudC5cbiAqXG4gKiBSZWN1cnNpb24gdGVybWluYXRlcyBiZWNhdXNlIGV2ZXJ5IGVkZ2UgcG9pbnRzIHRvIGEgc3RyaWN0bHkgc21hbGxlciBpbmRleC5cbiAqIGBtZW1vYCBrZWVwcyB0aGUgd2FsayBsaW5lYXIgaW4gcmVnaXN0cnkgc2l6ZSwgYW5kIHRoZSByZWdpc3RyeSBpcyBub3Qgc21hbGxcbiAqIGJ5IGNvbnN0cnVjdGlvbjogYEV2ZW50c0NvbnN1bWVyYCBkcmFpbnMgY29uc2VjdXRpdmVseSBjb25zdW1hYmxlIGV2ZW50c1xuICogc3luY2hyb25vdXNseSB3aGlsZSBiYXJyaWVycyBvbmx5IHJldGlyZSBvbiBtaWNyb3Rhc2stZHJpdmVuIGRlbGl2ZXJpZXMsIHNvXG4gKiBhIGZhbi1vdXQgb2YgYFByb21pc2UucmFjZShbaG9vaywgc2xlZXBdKWAgYnJhbmNoZXMgYWNjdW11bGF0ZXMgb25lIGJhcnJpZXJcbiAqIHBlciBicmFuY2ggcGVyIGtpbmQuIFRoZSBtZW1vIE1VU1QgYmUgcGVyLWNhbGw6IGBhcm1lZGAgbXV0YXRlcyBiZXR3ZWVuXG4gKiBjYWxscyBhcyBidWZmZXJlZCBwYXlsb2FkcyBhcmUgY2xhaW1lZC5cbiAqXG4gKiBUaGUgbWVtbyBpcyBhbiBvcHRpbWl6YXRpb24sIG5vdCBhIGNvcnJlY3RuZXNzIHJlcXVpcmVtZW50LiBJdCBvbmNlIHdhcyBvbmU6XG4gKiBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2AgdXNlZCB0byBydW4gdGhpcyB3YWxrIGZvciBldmVyeSBlYXJsaWVyIGVudHJ5IG9mIGFcbiAqIHN0ZXAgZGVsaXZlcnksIHdpdGggbm8gZWFybHkgZXhpdCwgd2hpY2ggdW5tZW1vaXplZCBpcyBUKG4pID0gzqMgVChqKSxcbiAqIG1lYXN1cmVkIGF0IDQuM2U4IHJlY3Vyc2l2ZSBjYWxscyAoODRzKSBmb3IgNDAgYWx0ZXJuYXRpbmcgYXJtZWQgaG9vay93YWl0XG4gKiBiYXJyaWVycy4gVGhhdCBjYWxsIHNpdGUgaXMgZ29uZTsgYSBzdGVwIG5vdyB0ZXN0cyBgYXJtZWRgIGRpcmVjdGx5LiBUaGUgb25lXG4gKiBzdXJ2aXZpbmcgY2FsbGVyLCB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9LCBjYW5ub3QgcmVhY2ggdGhhdFxuICogc2hhcGU6IGl0IHJldHVybnMgYXQgdGhlIEZJUlNUIHNlbGYtcmVzb2x2aW5nIGVudHJ5LCBzbyBpdCBvbmx5IGV2ZXJcbiAqIGFkdmFuY2VzIHBhc3QgZW50cmllcyB0aGF0IGFyZSBub24tc2VsZi1yZXNvbHZpbmcsIGFuZCB0aG9zZSBzaG9ydC1jaXJjdWl0XG4gKiBvbiB0aGVpciBmaXJzdCBmYWxzZSBjaGlsZC4gRXZlcnkgZW50cnkgaXQgZXZhbHVhdGVzIHRoZXJlZm9yZSBoYXNcbiAqIGFsbC1mYWxzZSBwcmVkZWNlc3NvcnMgYW5kIHJldHVybnMgYWZ0ZXIgb25lIGNoaWxkLCBkZWdlbmVyYXRpbmcgdGhlIHdhbGsgdG9cbiAqIGEgY2hhaW4gKG1lYXN1cmVkOiA5OCBjYWxscyB1bm1lbW9pemVkIGZvciB0aGUgd29yc3QgNDAtYmFycmllciBzaGFwZSwgMVxuICogY2FsbCBmb3IgdGhlIHJlZ2lzdHJ5IGFib3ZlKS4gRG8gbm90IHJlc3RvcmUgYW4gZXhwb25lbnRpYWwgY2xhaW0gaGVyZVxuICogd2l0aG91dCByZXN0b3JpbmcgYSBjYWxsZXIgdGhhdCBjYW4gcHJvZHVjZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZXNPbkl0c093bihcbiAgYmFycmllcnM6IE1hcDxudW1iZXIsIERlbGl2ZXJ5QmFycmllckVudHJ5PixcbiAgaW5kZXg6IG51bWJlcixcbiAgZW50cnk6IERlbGl2ZXJ5QmFycmllckVudHJ5LFxuICBtZW1vOiBNYXA8bnVtYmVyLCBib29sZWFuPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNhY2hlZCA9IG1lbW8uZ2V0KGluZGV4KTtcbiAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjb21wdXRlUmVzb2x2ZXNPbkl0c093bihiYXJyaWVycywgaW5kZXgsIGVudHJ5LCBtZW1vKTtcbiAgbWVtby5zZXQoaW5kZXgsIHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVSZXNvbHZlc09uSXRzT3duKFxuICBiYXJyaWVyczogTWFwPG51bWJlciwgRGVsaXZlcnlCYXJyaWVyRW50cnk+LFxuICBpbmRleDogbnVtYmVyLFxuICBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnksXG4gIG1lbW86IE1hcDxudW1iZXIsIGJvb2xlYW4+XG4pOiBib29sZWFuIHtcbiAgaWYgKCFlbnRyeS5hcm1lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtvdGhlckluZGV4LCBvdGhlcl0gb2YgYmFycmllcnMpIHtcbiAgICBpZiAoIWdhdGVzT24oZW50cnkua2luZCwgaW5kZXgsIG90aGVySW5kZXgsIG90aGVyKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghcmVzb2x2ZXNPbkl0c093bihiYXJyaWVycywgb3RoZXJJbmRleCwgb3RoZXIsIG1lbW8pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEF3YWl0cywgaW4gc3RyaWN0IGV2ZW50LWxvZyBvcmRlciwgZXZlcnkgc3RpbGwtcmVnaXN0ZXJlZCBkZWxpdmVyeSB0aGF0IGlzXG4gKiBlYXJsaWVyIGluIHRoZSBsb2cgdGhhbiBgZXZlbnRJbmRleGAgYW5kIHRoYXQgYSBkZWxpdmVyeSBvZiBga2luZGAgZGVmZXJzXG4gKiBiZWhpbmQgKHNlZSB7QGxpbmsgREVGRVJfQkVISU5EfSksIHNvIHRoYXQgdGhpcyByZXNvbHV0aW9uIGlzIGhhbmRlZCB0byB0aGVcbiAqIHdvcmtmbG93IG9ubHkgYWZ0ZXIgYWxsIHJlbGV2YW50IGVhcmxpZXItaW4tbG9nIGRlbGl2ZXJpZXMgaGF2ZSBiZWVuLiBUaGlzXG4gKiBpcyB3aGF0IGtlZXBzIGEgYFByb21pc2UucmFjZWAgKG9yIHRoZSBVTElEIGEgZm9sbG93LXVwIGB1c2VTdGVwYCBkcmF3cyBvblxuICogYSBjb25jdXJyZW50IGJyYW5jaCkgZGV0ZXJtaW5pc3RpYyBhbmQgYWxpZ25lZCB3aXRoIHRoZSBjb21taXR0ZWQgZXZlbnRcbiAqIGxvZywgaW5kZXBlbmRlbnQgb2YgbWljcm90YXNrLWhvcCBjb3VudHMsIGh5ZHJhdGlvbiB0aW1lLCBvciByYWNlLWFyZ3VtZW50XG4gKiBvcmRlci4gV2hlbiB0aGlzIGRlbGl2ZXJ5IGRvZXMgaGF2ZSB0byB3YWl0LCBpdCBhbHNvIHlpZWxkcyBhIG1hY3JvdGFza1xuICogYWZ0ZXJ3YXJkcyBzbyB0aGUgZWFybGllciBkZWxpdmVyeSdzIGNvbnN1bWVyIGNhbiBydW4gdG8gaXRzIG93biBuZXh0XG4gKiBzdXNwZW5zaW9uIHBvaW50IGZpcnN0OyBzZWUgdGhlIGNvbW1lbnQgYXQgdGhhdCBgYXdhaXRgIGZvciB3aHkgb3JkZXJpbmcgdGhlXG4gKiBgcmVzb2x2ZSgpYCBjYWxscyBhbG9uZSBpcyBub3QgZW5vdWdoLlxuICpcbiAqIFdoYXQgY291bnRzIGFzIFwiZGVmZXJzIGJlaGluZFwiIGlzIHtAbGluayBnYXRlc09ufSwgc2hhcmVkIHdpdGhcbiAqIHtAbGluayBjb21wdXRlUmVzb2x2ZXNPbkl0c093bn0gc28gdGhlIHR3byBjYW5ub3QgZHJpZnQuXG4gKlxuICogT25lIGFzeW1tZXRyeTogYSBTVEVQIHJlc3VsdCBza2lwcyBhbnkgZWFybGllciBkZWxpdmVyeSB0aGF0IGlzIFVOQVJNRUQsXG4gKiBpLmUuIGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkIG5vIGNvbnN1bWVyIGhhcyBjbGFpbWVkLiBTdWNoIGEgcGF5bG9hZCBpc1xuICogZGVsaXZlcmVkIG9ubHkgd2hlbiB0aGUgd29ya2Zsb3cgbmV4dCByZWFkcyB0aGUgaG9vaywgYW5kIHJlYWNoaW5nIHRoYXQgcmVhZFxuICogb2Z0ZW4gcmVxdWlyZXMgdGhlIHN0ZXAgcmVzdWx0IGl0c2VsZiAoYGF3YWl0IHN0ZXBYKClgIGJlZm9yZSB0aGVcbiAqIHJlYWQpLiBHYXRpbmcgdGhlIHN0ZXAgb24gaXQgd291bGQgc3RhbGwgdGhlIHdvcmtmbG93IHVudGlsIHRoZSBiYXJyaWVyJ3NcbiAqIGlkbGUgc2FmZXR5IG5ldCBmaXJlcywgd2hpY2ggdGhlbiByZWxlYXNlcyBldmVyeSBkZWxpdmVyeSBxdWV1ZWQgYmVoaW5kIHRoYXRcbiAqIHBheWxvYWQgYXQgb25jZSwgbG9zaW5nIGV4YWN0bHkgdGhlIHJhY2UgdGhpcyBvcmRlcmluZyBleGlzdHMgdG8gcHJvdGVjdC5cbiAqIFdhaXRzIGFuZCBob29rcyBrZWVwIGdhdGluZyBvbiB1bmNsYWltZWQgcGF5bG9hZHM6IGZvciB0aGVtLCB3YWl0aW5nIGZvciB0aGVcbiAqIGNsYWltIElTIHRoZSBvcmRlcmluZyBndWFyYW50ZWUgKGEgYHdhaXRfY29tcGxldGVkYCBtdXN0IG5vdCBwcmVlbXB0IGFcbiAqIHBheWxvYWQgdGhlIGxvZyBvcmRlcmVkIGZpcnN0KS5cbiAqXG4gKiBUaGUgc2tpcCBpcyBkaXJlY3QsIG5ldmVyIHRyYW5zaXRpdmUuIEEgc3RlcCBzdGlsbCBnYXRlcyBvbiBhbiBlYXJsaWVyIEFSTUVEXG4gKiB3YWl0IG9yIGhvb2ssIGluY2x1ZGluZyBvbmUgdGhhdCBpcyBpdHNlbGYgcGFya2VkIGJlaGluZCBhbiB1bmNsYWltZWRcbiAqIHBheWxvYWQuIFNraXBwaW5nIHRob3NlIHRvbyB3b3VsZCBpbnZlcnQgbG9nIG9yZGVyIGZvciB0aGUgY29tbW9uZXN0IHNoYXBlXG4gKiB0aGVyZSBpczogYSB3b3JrZmxvdyB0aGF0IGNyZWF0ZXMgYSBob29rIGl0IGRvZXMgbm90IHJlYWQgb24gdGhpcyBicmFuY2gsXG4gKiByYWNlcyBgc3RlcGAgYWdhaW5zdCBgc2xlZXBgLCBhbmQgaGFzIHRoZSBsb2cgc2F5IHRoZSBzbGVlcCB3b24uIFRoZSBzdGVwXG4gKiB3b3VsZCB0aGVuIG92ZXJ0YWtlIHRoZSB3YWl0LCBib3RoIGJyYW5jaGVzIHdvdWxkIHN3YXAgdGhlIGNvcnJlbGF0aW9uIGlkc1xuICogdGhleSBkcmF3IG5leHQsIGFuZCByZXBsYXkgd291bGQgZGl2ZXJnZS4gU2VlXG4gKiBgc3RlcC1kZWxpdmVyeS1vcmRlcmluZy50ZXN0LnRzYC4gV2FpdGluZyBpbnN0ZWFkIGlzIHNhZmUgYmVjYXVzZSB0aGVcbiAqIHBheWxvYWQncyBvd24gaWRsZSBzYWZldHkgbmV0IHJldGlyZXMgaXQgYW5kIHRoZSB3aG9sZSBjaGFpbiB0aGVuIGRlbGl2ZXJzXG4gKiBpbiBsb2cgb3JkZXI7IHtAbGluayBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeX0gZGVsaWJlcmF0ZWx5IHJlcG9ydHMgc3VjaCBhXG4gKiBzdGVwIGFzIG5vdCBzZWxmLXJlc29sdmluZyBzbyB0aGF0IGlkbGUgc3RheXMgcmVhY2hhYmxlLlxuICpcbiAqIFwiVGhlIHdob2xlIGNoYWluIHRoZW4gZGVsaXZlcnMgaW4gbG9nIG9yZGVyXCIgcmVzdHMgb24gdGhlIFBBWUxPQUQncyBiYXJyaWVyXG4gKiBiZWluZyByZXRpcmVkIGJlZm9yZSB0aGF0IG9mIGFueXRoaW5nIHBhcmtlZCBiZWhpbmQgaXQuIFRoYXQgb3JkZXIgaXNcbiAqIHN0cnVjdHVyYWw6IHNhZmV0eS1uZXQgcmV0aXJlbWVudHMgZ28gdGhyb3VnaCBvbmUgcGVyLWNvbnRleHQgZGlzcGVuc2VyIHRoYXRcbiAqIG9ubHkgZXZlciByZXRpcmVzIHRoZSBsb3dlc3QtaW5kZXggZW50cnkgYXQgZGVsaXZlcnkgaWRsZSwgYW5kIGV2ZXJ5XG4gKiByZXRpcmVtZW50IHRoYXQgd2FrZXMgYSBjaGFpbiBmbGlwcyB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9IGJhY2tcbiAqIHRvIHRydWUsIHJlLWJsb2NraW5nIHRoZSBkaXNwZW5zZXIgdW50aWwgdGhlIGNoYWluIGhhcyBkcmFpbmVkLiBTZWVcbiAqIHtAbGluayBlbnN1cmVCYXJyaWVyU2FmZXR5TmV0fS4gKFRoaXMgdXNlZCB0byByZXN0IG9uIHRoZSBGSUZPIG9mIG9uZSBpZGxlXG4gKiBwb2xsIHBlciBiYXJyaWVyLCB3aGljaCBoZWxkIGZvciBhIHNpbmdsZSBwYXJrZWQgc2VnbWVudCBidXQgZGVjYXllZCB0b1xuICogdGltaW5nIG5vaXNlIHdpdGggc2V2ZXJhbDogdGhlIHJlbGVhc2Ugb3JkZXIsIGFuZCB0aGVyZWZvcmUgdGhlIFVMSURzXG4gKiBkcmF3biBieSB0aGUgd29rZW4gYnJhbmNoZXMsIHRoZW4gZGVwZW5kZWQgb24gaG93IG11Y2ggbG9nIHRoZSByZXBsYXkgaGFkXG4gKiBsb2FkZWQuIHN0b3JtLWxvZy1yZXBsYXkudGVzdC50cyByZXBsYXlzIGEgcHJvZHVjdGlvbiBsb2cgY29ycnVwdGVkIGV4YWN0bHlcbiAqIHRoYXQgd2F5LilcbiAqL1xuLyoqXG4gKiBXaGV0aGVyIGNvcnJlbGF0aW9uLWlkIGRyYXcgb3JkZXIgaXMgcGlubmVkIHRvIGV2ZW50LWxvZyBvcmRlci4gRGVmYXVsdCBPTjpcbiAqIG9ubHkgdGhlIGxpdGVyYWwgc3RyaW5nIGBXT1JLRkxPV19MT0dfT1JERVJfRFJBV1M9MGAgb3B0cyBvdXQuIGA9ZmFsc2VgLFxuICogYD1vZmZgLCBhbmQgZXZlcnkgb3RoZXIgdmFsdWUga2VlcCBpdCBlbmFibGVkLiBSZWFkIHBlciBjYWxsIHNvIHRlc3RzIGNhblxuICogZmxpcCBpdC5cbiAqXG4gKiBPZmYsIGEgZGVsaXZlcnkgdGhhdCBoYWQgdG8gZGVmZXIgeWllbGRzIE9ORSBtYWNyb3Rhc2sgYWZ0ZXIgaXRzXG4gKiBwcmVkZWNlc3NvcnMgcmVzb2x2ZS4gVGhpcyBpcyBlbm91Z2ggZm9yIHNob3J0IGNvbnN1bWVycywgYnV0IGEgd29rZW4gYnJhbmNoXG4gKiB3aG9zZSBwYXRoIHRvIGl0cyBuZXh0IGRyYXcgY3Jvc3NlcyBtb3JlIGhvcHMgKGEgYFByb21pc2UucmFjZWAgcmVzb2x1dGlvbiwgYVxuICogdXNlci1sZXZlbCBzZW1hcGhvcmUsIGFuIGFzeW5jLWl0ZXJhdG9yIHJlYWQpIGNhbiBzdGlsbCBiZSBvdmVydGFrZW4gYnkgYVxuICogbGF0ZXItaW4tbG9nIGRlbGl2ZXJ5J3Mgc2hvcnRlciBjYXNjYWRlLCBzbyB0aGUgcnVuJ3MgZHJhdyBvcmRlciwgaW5jbHVkaW5nXG4gKiBpdHMgY29ycmVsYXRpb24gaWRzLCBkZXBlbmRzIG9uIGhvdyBtdWNoIGxvZyB0aGlzIHJlcGxheSBsb2FkZWQuXG4gKiBPbiwgdGhlIHlpZWxkIGJlY29tZXMgYSBmaXhwb2ludDogdGhlIGRlbGl2ZXJ5IHJlc29sdmVzIG9ubHkgb25jZSBldmVyeVxuICogZWFybGllciBjYXNjYWRlIGhhcyBxdWllc2NlZCwgbWFraW5nIHRoZSBkcmF3IHNlcXVlbmNlIGEgcHVyZSBmdW5jdGlvbiBvZlxuICogdGhlIGRlbnNlIGxvZywgc3RhYmxlIHVuZGVyIHByZWZpeCBleHRlbnNpb24sIGFuZCBjb25jdXJyZW50IHdyaXRlcnMnXG4gKiBkdXBsaWNhdGUgY3JlYXRlcyBpZGVudGljYWwgKGRlZHVwZWQpIGluc3RlYWQgb2YgY29sbGlkaW5nLlxuICovXG5mdW5jdGlvbiBpc0xvZ09yZGVyRHJhd3NFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTE9HX09SREVSX0RSQVdTICE9PSAnMCc7XG59XG5cbi8qKlxuICogT25lIHF1aWVzY2VuY2UgdHVybjogbGV0cyB0aGUgZW50aXJlIHBlbmRpbmcgbWljcm90YXNrIHF1ZXVlIGRyYWluLCB0aGVuXG4gKiB5aWVsZHMgdG8gdGhlIGV2ZW50IGxvb3Agb25jZS4gYHNldEltbWVkaWF0ZWAgKGNoZWNrIHBoYXNlKSBpcyB1c2VkIHdoZXJlXG4gKiBhdmFpbGFibGUgYmVjYXVzZSBOb2RlIGNsYW1wcyBgc2V0VGltZW91dCgwKWAgdG8gfjFtcyB3aGlsZSBgc2V0SW1tZWRpYXRlYFxuICogY29zdHMgfjIwwrVzLiBFdmVyeSBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgcGF5cyB0aGlzIHR1cm4gYXQgbGVhc3RcbiAqIG9uY2UsIHNvIG9uIGEgc2VxdWVudGlhbCByZXBsYXkgdGhlIGNsYW1wIGlzIHRoZSB3aG9sZSBjb3N0LiBUaW1lcnMgc3RpbGxcbiAqIHJ1biBiZXR3ZWVuIGNvbnNlY3V0aXZlIHR1cm5zICh0aGUgbG9vcCByZS1lbnRlcnMgdGhlIGV2ZW50IGxvb3AgZWFjaFxuICogaXRlcmF0aW9uLCBwYXNzaW5nIHRocm91Z2ggdGhlIHRpbWVycyBwaGFzZSksIHNvIGNoYWlucyBwYXJrZWQgb24gdGhlXG4gKiBzYWZldHktbmV0IGRpc3BlbnNlcidzIGBzZXRUaW1lb3V0YCBjYWRlbmNlIGFyZSBub3Qgc3RhcnZlZC5cbiAqL1xuZnVuY3Rpb24gcXVpZXNjZW5jZVR1cm4oZGVsYXlNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkZWxheU1zID09PSAwICYmIHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldEltbWVkaWF0ZShyZXNvbHZlKSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5TXMpKTtcbn1cblxuLyoqXG4gKiBXYWl0cyB1bnRpbCB0aGUgd29ya2Zsb3cgY2FuIG1ha2Ugbm8gZnVydGhlciBwcm9ncmVzcyB3aXRob3V0IGFub3RoZXJcbiAqIGRlbGl2ZXJ5OiByZXBlYXRlZCAocHJvbWlzZS1xdWV1ZSBkcmFpbiArIGV2ZW50LWxvb3AgdHVybilzIHVudGlsIGEgZnVsbFxuICogdHVybiBwYXNzZXMgd2l0aCBubyBuZXcgVUxJRCBkcmF3cyBhbmQgbm8gaHlkcmF0aW9uIGluIGZsaWdodC5cbiAqXG4gKiBUZXJtaW5hdGlvbjogZWFjaCBleHRyYSBpdGVyYXRpb24gcmVxdWlyZXMgYSBuZXcgVUxJRCBkcmF3IG9yIGEgaHlkcmF0aW9uXG4gKiBzdGFydGVkIGluIHRoZSBwcmV2aW91cyB0dXJuLiBgbWludENvdW50YCBjb3VudHMgRVZFUlkgZHJhdyBmcm9tIHRoZSBydW4nc1xuICogc2VxdWVuY2UsIGluY2x1ZGluZyBjb3JyZWxhdGlvbiBpZHMgYW5kIHNlcmlhbGl6YXRpb24tZHJpdmVuIGRyYXdzIChzdHJlYW1cbiAqIGlkcyBtaW50ZWQgdGhyb3VnaCB0aGUgYFNUQUJMRV9VTElEYCBnbG9iYWwgd2hpbGUgZGVoeWRyYXRpbmcpLiBUaGlzIGlzXG4gKiBjb25zZXJ2YXRpdmUgaW4gdGhlIHNhZmUgZGlyZWN0aW9uOiBzZXJpYWxpemF0aW9uIGRyYXdzIG9ubHkgZXh0ZW5kIHRoZVxuICogd2FpdCwgYW5kIGJvdGggYm9keSBwcm9ncmVzcyBhbmQgdGhlIHNlcmlhbGl6YXRpb24gd29yayBvbmUgY2FzY2FkZSBjYW5cbiAqIHNjaGVkdWxlIGFyZSBmaW5pdGUgYmV0d2VlbiBkZWxpdmVyaWVzLCBzbyB0aGUgZml4cG9pbnQgaXMgcmVhY2hlZC4gVGhlXG4gKiBsb29wIGhvbGRzIHRoaXMgZGVsaXZlcnkncyBvd24gYmFycmllciByZWdpc3RlcmVkIChpdHMgYG1hcmtEZWxpdmVyZWRgIGhhc1xuICogbm90IHJ1biksIHNvIGBpc0RlbGl2ZXJ5SWRsZWAgc3RheXMgZmFsc2UgYW5kIG5vIHN1c3BlbnNpb24gY2FuIHByZWVtcHQgdGhlXG4gKiBjYXNjYWRlIGJlaW5nIHdhaXRlZCBvdXQuXG4gKlxuICogQSByZWplY3RlZCBgcHJvbWlzZVF1ZXVlYCBzZXR0bGVzIGltbWVkaWF0ZWx5IGFuZCBmb3JldmVyLCBzbyBsb29waW5nIGF0XG4gKiB0aGUgbm9ybWFsIGNhZGVuY2Ugb24gYSBmYWlsZWQgcnVuIHdvdWxkIGRlZ2VuZXJhdGUgaW50byBhIGJ1c3kgbG9vcCAodGhlXG4gKiBzYW1lIGhhemFyZCB7QGxpbmsgZW5zdXJlQmFycmllclNhZmV0eU5ldH0gZG9jdW1lbnRzKS4gSXRlcmF0aW9ucyB0aGF0XG4gKiBvYnNlcnZlIHRoZSBxdWV1ZSByZWplY3RlZCBiYWNrIG9mZiB0byBhIDUwbXMgdGljayBpbnN0ZWFkLlxuICovXG5hc3luYyBmdW5jdGlvbiBxdWllc2NlRWFybGllckNhc2NhZGVzKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgZXZlbnRJbmRleDogbnVtYmVyXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IG1pbnRzQmVmb3JlID0gY3R4Lm1pbnRDb3VudCA/PyAwO1xuICAgIGNvbnN0IHBlbmRpbmdCZWZvcmUgPSBjdHgucGVuZGluZ0RlbGl2ZXJpZXM7XG4gICAgLy8gU2V0dGxlZCBvciByZWplY3RlZCwgdGhlIHF1ZXVlIHNuYXBzaG90IG9ubHkgb3JkZXJzIHVzIGJlaGluZCB3b3JrXG4gICAgLy8gYWxyZWFkeSBjaGFpbmVkOyBhIHJlamVjdGlvbiBpcyB0aGUgcnVuIGZhaWxpbmcgZWxzZXdoZXJlLlxuICAgIGNvbnN0IHF1ZXVlUmVqZWN0ZWQgPSBhd2FpdCBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oXG4gICAgICAoKSA9PiBmYWxzZSxcbiAgICAgICgpID0+IHRydWVcbiAgICApO1xuICAgIGF3YWl0IHF1aWVzY2VuY2VUdXJuKHF1ZXVlUmVqZWN0ZWQgPyA1MCA6IDApO1xuICAgIGlmIChcbiAgICAgIChjdHgubWludENvdW50ID8/IDApICE9PSBtaW50c0JlZm9yZSB8fFxuICAgICAgcGVuZGluZ0JlZm9yZSAhPT0gMCB8fFxuICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzICE9PSAwXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gUXVpZXQgaXMgbm90IGVub3VnaCBvbiBpdHMgb3duOiBzZXZlcmFsIGRlbGl2ZXJ5IGNoYWlucyBjYW4gYmUgc2l0dGluZ1xuICAgIC8vIGluIHRoaXMgbG9vcCBhdCBvbmNlLCBhbmQgbGV0dGluZyB0aGUgZmlyc3QgcXVpZXQgb2JzZXJ2YXRpb24gcmVzb2x2ZVxuICAgIC8vIHdvdWxkIGJyZWFrIHRoZSB0aWUgYnkgdGltZXIgYXJyaXZhbC4gVGhpcyBtb2RlIHJlbW92ZXMgdGhhdCBhcnJpdmFsLW9yZGVyXG4gICAgLy8gZGVwZW5kZW5jZS4gQSBsb3dlci1pbmRleCBBUk1FRCBiYXJyaWVyIGlzIGEgZGVsaXZlcnkgY29tbWl0dGVkIHRvXG4gICAgLy8gaGFwcGVuaW5nIHRoYXQgaGFzIG5vdCBoYXBwZW5lZCB5ZXQsIHNvIHRoaXMgb25lIGtlZXBzIHdhaXRpbmcuIFVuYXJtZWRcbiAgICAvLyBlbnRyaWVzIChidWZmZXJlZCBwYXlsb2FkcyBub2JvZHkgaGFzIGNsYWltZWQpIGRvIG5vdCBibG9jaywgZXhhY3RseSBhc1xuICAgIC8vIGluIGBnYXRlc09uYDogdGhlaXIgaGFuZG92ZXIgaXMgY2xhaW0tZHJpdmVuLCB3aGljaCBpcyBib2R5LXBvc2l0aW9uXG4gICAgLy8gZGV0ZXJtaW5lZCBhbmQgdGhlcmVmb3JlIGFscmVhZHkgYSBmdW5jdGlvbiBvZiB0aGUgcHJlZml4LlxuICAgIC8vXG4gICAgLy8gVGhpcyBpcyBkZWxpYmVyYXRlbHkgYSBXSURFUiB3YWl0cy1mb3IgcmVsYXRpb24gdGhhbiBgZ2F0ZXNPbmAgKHdoaWNoLFxuICAgIC8vIGUuZy4sIGV4Y2x1ZGVzIHdhaXTihpJ3YWl0KTogdW5kZXIgbG9nLW9yZGVyIGRyYXdzIEVWRVJZIGJyYW5jaC1kZWNpZGluZ1xuICAgIC8vIGRlbGl2ZXJ5IG11c3QgcmVzb2x2ZSBpbiBsb2cgb3JkZXIsIGtpbmRzIGluY2x1ZGVkLiBUaGUgd2lkdGggaXMgc2FmZVxuICAgIC8vIGFnYWluc3QgdGhlIGRpc3BlbnNlciBkZWFkbG9jayB0aGF0IGByZXNvbHZlc09uSXRzT3duYCBndWFyZHMsIGJlY2F1c2VcbiAgICAvLyB0aGUgb25lIGVkZ2UgdGhlIHdpZGVyIHJlbGF0aW9uIGFkZHMgKHdhaXRpbmcgb24gYW4gYXJtZWQgZW50cnkgdGhhdFxuICAgIC8vIGdhdGVzT24gZG9lcyBub3QgbW9kZWwpIGFsd2F5cyBib3R0b21zIG91dCBhdCB0aGUgc2FtZSB1bmFybWVkIHBheWxvYWQ6XG4gICAgLy8gYSBsb3dlciBhcm1lZCBXQUlUIGlzIG5vbi1zZWxmLXJlc29sdmluZyBvbmx5IHdoZW4gaXQgaXMgKHRyYW5zaXRpdmVseSlcbiAgICAvLyBwYXJrZWQgYmVoaW5kIGFuIHVuY2xhaW1lZCBidWZmZXJlZCBwYXlsb2FkLCBhbmQgYSB3YWl0IGdhdGVzIG9uIGV2ZXJ5XG4gICAgLy8gbG93ZXIgaG9vayBhbmQgc3RlcCBkaXJlY3RseSwgc28gdGhlIHNwaW5uZXIgaGVyZSBhbHNvIGdhdGVzIG9uIHRoYXRcbiAgICAvLyBwYXlsb2FkIHRocm91Z2ggYGdhdGVzT25gIGFuZCBpcyBpdHNlbGYgcmVwb3J0ZWQgbm9uLXNlbGYtcmVzb2x2aW5nLlxuICAgIC8vIFRoZSBkaXNwZW5zZXIgdGhlcmVmb3JlIHN0YXlzIHVuYmxvY2tlZCBhbmQgcmV0aXJlcyB0aGUgY2hhaW4gaGVhZDsgc2VlXG4gICAgLy8gdGhlIHBhcmtlZC1jaGFpbiB0ZXN0IGluIGRlbGl2ZXJ5LWJhcnJpZXItY292ZXJhZ2UudGVzdC50cy5cbiAgICBsZXQgbG93ZXJBcm1lZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzID8/IFtdKSB7XG4gICAgICBpZiAoaW5kZXggPCBldmVudEluZGV4ICYmIGVudHJ5LmFybWVkKSB7XG4gICAgICAgIGxvd2VyQXJtZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFsb3dlckFybWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgZXZlbnRJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBraW5kOiBEZWxpdmVyeUtpbmRcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBEZWZlbnNpdmU6IHRvbGVyYXRlIGNvbnRleHRzIHRoYXQgcHJlZGF0ZSB0aGlzIGZpZWxkICh0ZXN0IGhhcm5lc3NlcykuXG4gIGlmIChldmVudEluZGV4ID09PSB1bmRlZmluZWQgfHwgIWN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBiYXJyaWVycyA9IGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycztcbiAgY29uc3QgZWFybGllcjogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgYmFycmllcnMpIHtcbiAgICBpZiAoIWdhdGVzT24oa2luZCwgZXZlbnRJbmRleCwgaW5kZXgsIGVudHJ5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGVhcmxpZXIucHVzaChlbnRyeS5yZWxlYXNlZCk7XG4gIH1cbiAgaWYgKGVhcmxpZXIubGVuZ3RoID4gMCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGVhcmxpZXIpO1xuICB9XG4gIGlmIChpc0xvZ09yZGVyRHJhd3NFbmFibGVkKCkpIHtcbiAgICAvLyBVbmNvbmRpdGlvbmFsLCBub3QganVzdCB3aGVuIGEgYmFycmllciB3YXMgc3RpbGwgcmVnaXN0ZXJlZDogYW4gZWFybGllclxuICAgIC8vIGRlbGl2ZXJ5J3MgYmFycmllciBkZXJlZ2lzdGVycyB3aGVuIGl0cyByZXNvbHZlKCkgcnVucywgYnV0IHRoZSBicmFuY2hcbiAgICAvLyBpdCB3b2tlIG1heSBzdGlsbCBiZSBob3BzIGF3YXkgZnJvbSBpdHMgbmV4dCBkcmF3LiBBIGxhdGVyIGRlbGl2ZXJ5XG4gICAgLy8gY29uc3VtZWQgYWZ0ZXIgdGhhdCBkZXJlZ2lzdHJhdGlvbiBzZWVzIGFuIGVtcHR5IGdhdGUgc2V0LCBhbmQgd2l0aG91dFxuICAgIC8vIHRoaXMgaXQgd291bGQgcmVzb2x2ZSBtaWQtY2FzY2FkZSBhbmQgb3ZlcnRha2UgdGhlIGRyYXcuIFRoaXMgaXMgdGhlIGV4YWN0XG4gICAgLy8gYXJyaXZhbC1vcmRlciBkZXBlbmRlbmNlIHRoaXMgbW9kZSBleGlzdHMgdG8gcmVtb3ZlLiBDb3N0cyBvbmUgcXVpZXRcbiAgICAvLyBtYWNyb3Rhc2sgdHVybiB3aGVuIG5vdGhpbmcgaXMgaW4gZmxpZ2h0LlxuICAgIGF3YWl0IHF1aWVzY2VFYXJsaWVyQ2FzY2FkZXMoY3R4LCBldmVudEluZGV4KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVhcmxpZXIubGVuZ3RoID4gMCkge1xuICAgIC8vIEFuIGVhcmxpZXIgZGVsaXZlcnkgYmVpbmcgXCJkZWxpdmVyZWRcIiBvbmx5IG1lYW5zIGl0cyBgcmVzb2x2ZSgpYCByYW4uXG4gICAgLy8gVGhlIGJyYW5jaCBpdCB3b2tlIG1heSBuZWVkIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgZnVydGhlciBtaWNyb3Rhc2tcbiAgICAvLyBob3BzIGJlZm9yZSBpdCByZWFjaGVzIGl0cyBuZXh0IGB1c2VTdGVwYCBjYWxsIGFuZCBkcmF3cyBhIFVMSUQ6IGFcbiAgICAvLyBgZm9yIGF3YWl0YCBvdmVyIGEgaG9vaywgZm9yIGluc3RhbmNlLCByZXN1bWVzIHRoZSBnZW5lcmF0b3IsIHNldHRsZXNcbiAgICAvLyB0aGUgcHJvbWlzZSBmcm9tIGBuZXh0KClgLCBhbmQgb25seSB0aGVuIHJ1bnMgdGhlIGxvb3AgYm9keS4gUmVzb2x2aW5nXG4gICAgLy8gdGhpcyBkZWxpdmVyeSBvbiBhIG1pY3JvdGFzayB3b3VsZCBsZXQgaXQgb3ZlcnRha2UgdGhhdCBicmFuY2ggYW5kXG4gICAgLy8gcmVvcmRlciB0aGUgVUxJRCBhbGxvY2F0aW9uIGFueXdheSwgdHVybmluZyB0aGUgZ3VhcmFudGVlIGJlbG93IGludG8gYVxuICAgIC8vIGhvcC1jb3VudCByYWNlIHRoYXQgaG9sZHMgb25seSBmb3IgdGhlIHNob3J0ZXN0IGNvbnN1bWVycy5cbiAgICAvL1xuICAgIC8vIFlpZWxkaW5nIGEgbWFjcm90YXNrIGxldHMgdGhlIGVhcmxpZXIgYnJhbmNoJ3MgZW50aXJlIG1pY3JvdGFzayBjaGFpblxuICAgIC8vIGRyYWluIGZpcnN0LCB3aGF0ZXZlciBpdHMgbGVuZ3RoLCBzbyBsb2cgb3JkZXIgc3Vydml2ZXMgcmVnYXJkbGVzcyBvZlxuICAgIC8vIGhvdyB0aGUgd29ya2Zsb3cgY29uc3VtZXMgdGhlIGVhcmxpZXIgZGVsaXZlcnkuIE9ubHkgZGVsaXZlcmllcyB0aGF0XG4gICAgLy8gYWN0dWFsbHkgaGFkIHRvIGRlZmVyIHBheSB0aGlzLCBzbyB0aGUgY29tbW9uIHNpbmdsZS1kZWxpdmVyeSBkcmFpbiBpc1xuICAgIC8vIHVuYWZmZWN0ZWQuXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICB9XG59XG5cbi8qKiBIYW5kbGUgZm9yIGEgcmVnaXN0ZXJlZCBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgYmFycmllci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsaXZlcnlCYXJyaWVyIHtcbiAgLyoqXG4gICAqIE1hcmsgdGhpcyBkZWxpdmVyeSBhcyBkZWxpdmVyZWQgdG8gdGhlIHdvcmtmbG93LiBSZXNvbHZlcyBpdHNcbiAgICogYHJlbGVhc2VkYCBwcm9taXNlIHNvIGFueSBsYXRlci1pbi1sb2cgZGVsaXZlcnkgZ2F0ZWQgb24gaXQgKHZpYVxuICAgKiB7QGxpbmsgYXdhaXRFYXJsaWVyRGVsaXZlcmllc30pIG1heSBwcm9jZWVkLCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZVxuICAgKiByZWdpc3RyeS4gSWRlbXBvdGVudC5cbiAgICovXG4gIG1hcmtEZWxpdmVyZWQ6ICgpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBNYXJrIHRoaXMgZGVsaXZlcnkgYXMgY29tbWl0dGVkIHRvIGhhcHBlbmluZywgZm9yIGEgYmFycmllciByZWdpc3RlcmVkXG4gICAqIHVuYXJtZWQgKGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkKSBvbmNlIGEgY29uc3VtZXIgaGFzIGNsYWltZWQgaXQuIEZyb21cbiAgICogdGhlbiBvbiBhIGxhdGVyIHN0ZXAgcmVzdWx0IG1heSBiZSBvcmRlcmVkIGJlaGluZCBpdC4gSWRlbXBvdGVudC5cbiAgICovXG4gIGFybTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBhdCBpdHMgZXZlbnQtbG9nIGluZGV4IHNvIHRoYXQgbGF0ZXJcbiAqIGRlbGl2ZXJpZXMgY2FuIGJlIG9yZGVyZWQgc3RyaWN0bHkgYWZ0ZXIgaXQuIFJldHVybnMgYW4gaW5lcnQgaGFuZGxlIHdoZW5cbiAqIGBwZW5kaW5nRGVsaXZlcnlCYXJyaWVyc2AgaXMgbm90IGluaXRpYWxpemVkLlxuICpcbiAqIFBhc3MgYGFybWVkOiBmYWxzZWAgZm9yIGEgZGVsaXZlcnkgd2hvc2UgcmVzb2x1dGlvbiB3YWl0cyBvbiB3b3JrZmxvdyBjb2RlXG4gKiBhc2tpbmcgZm9yIGl0IChhIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCk7IGNhbGwgYGFybSgpYCB3aGVuIGl0IGRvZXMuXG4gKlxuICogVG8gZ3VhcmFudGVlIGEgbGF0ZXIgZGVsaXZlcnkgZ2F0ZWQgb24gdGhpcyBvbmUgY2FuIG5ldmVyIGhhbmcgd2hlbiB0aGlzXG4gKiBkZWxpdmVyeSBpcyBhYmFuZG9uZWQgKHRoZSB3b3JrZmxvdyB0b29rIGEgZGlmZmVyZW50IGJyYW5jaCBvciBpc1xuICogc3VzcGVuZGluZyBhbmQgbmV2ZXIgb2JzZXJ2ZXMgaXQpLCB0aGUgYmFycmllciBhdXRvLXJlc29sdmVzIGF0IGlkbGUuXG4gKlxuICogSU5WQVJJQU5UIHJlcXVpcmVkIG9mIGV2ZXJ5IGNhbGwgc2l0ZTogYSBiYXJyaWVyIHRoYXQgaXMgZXZlciBgYXJtZWRgIG11c3RcbiAqIGJlIHBhaXJlZCB3aXRoIGEgZGVsaXZlcnkgY2hhaW4gdGhhdCBydW5zIHVuY29uZGl0aW9uYWxseSwgYXR0YWNoZWQgd2hlblxuICogdGhlIGV2ZW50IGlzIGNvbnN1bWVkICh3YWl0cywgc3RlcCByZXN1bHRzLCB3YWl0aW5nLWNvbnN1bWVyIGhvb2sgcGF5bG9hZHMsXG4gKiBhYm9ydHMpLCBvciBieSB0aGUgYGNsYWltKClgIHdob3NlIGludm9jYXRpb24gaXMgd2hhdCBhcm1zIGl0IChidWZmZXJlZFxuICogaG9vayBwYXlsb2FkcykuIFRoZSBpZGxlIGNoZWNrICh7QGxpbmsgc2NoZWR1bGVXaGVuSWRsZX0pIHJlZnVzZXMgdG9cbiAqIG9ic2VydmUgaWRsZSB3aGlsZSBhbiBhcm1lZCwgc2VsZi1yZXNvbHZpbmcgYmFycmllciBpcyB1bmRlbGl2ZXJlZCwgYW5kIHRoZVxuICogc2FmZXR5IG5ldCBiZWxvdyBpcyBpdHNlbGYgaWRsZS1nYXRlZCwgc28gYW4gYXJtZWQgYmFycmllciB3aXRoIG5vXG4gKiB1bmNvbmRpdGlvbmFsIGNoYWluIHdvdWxkIGxpdmVsb2NrIGV2ZXJ5IGlkbGUgY2hlY2sgaW4gdGhlIHJ1biwgaW5jbHVkaW5nXG4gKiBpdHMgb3duIHJldGlyZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlbGl2ZXJ5QmFycmllcihcbiAgY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG4gIGV2ZW50SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAga2luZDogRGVsaXZlcnlLaW5kLFxuICBvcHRpb25zOiB7IGFybWVkPzogYm9vbGVhbiB9ID0ge31cbik6IERlbGl2ZXJ5QmFycmllciB7XG4gIGNvbnN0IGJhcnJpZXJzID0gY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzO1xuICBpZiAoIWJhcnJpZXJzIHx8IGV2ZW50SW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7IG1hcmtEZWxpdmVyZWQ6ICgpID0+IHt9LCBhcm06ICgpID0+IHt9IH07XG4gIH1cblxuICBjb25zdCBpbnN0YWxsID0gKGFybWVkOiBib29sZWFuKTogRGVsaXZlcnlCYXJyaWVyRW50cnkgPT4ge1xuICAgIGlmIChiYXJyaWVycy5oYXMoZXZlbnRJbmRleCkpIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYERlbGl2ZXJ5IGJhcnJpZXIgYWxyZWFkeSByZWdpc3RlcmVkIGF0IGV2ZW50IGluZGV4ICR7ZXZlbnRJbmRleH1gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IHdpdGhSZXNvbHZlcnM8dm9pZD4oKTtcbiAgICBjb25zdCBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnkgPSB7XG4gICAgICBraW5kLFxuICAgICAgcmVsZWFzZWQ6IHByb21pc2UsXG4gICAgICBhcm1lZCxcbiAgICAgIHJldGlyZWQ6IGZhbHNlLFxuICAgICAgcmV0aXJlOiAoKSA9PiB7XG4gICAgICAgIGlmIChlbnRyeS5yZXRpcmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVudHJ5LnJldGlyZWQgPSB0cnVlO1xuICAgICAgICBpZiAoYmFycmllcnMuZ2V0KGV2ZW50SW5kZXgpID09PSBlbnRyeSkge1xuICAgICAgICAgIGJhcnJpZXJzLmRlbGV0ZShldmVudEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LFxuICAgIH07XG4gICAgYmFycmllcnMuc2V0KGV2ZW50SW5kZXgsIGVudHJ5KTtcblxuICAgIC8vIFNhZmV0eSBuZXQ6IGlmIHRoaXMgZGVsaXZlcnkgaXMgbmV2ZXIgZGVsaXZlcmVkIHRvIHRoZSB3b3JrZmxvdyAoaXRzXG4gICAgLy8gYnJhbmNoIHdhcyBub3QgdGFrZW4gLyB0aGUgcnVuIGlzIHN1c3BlbmRpbmcsIG9yIGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkXG4gICAgLy8gaXMgb25seSBjbGFpbWVkIGFmdGVyIGEgbGF0ZXIgZGVsaXZlcnkgdGhlIHdvcmtmbG93IGlzIHN0aWxsIHdhaXRpbmdcbiAgICAvLyBvbiksIGl0IGlzIHJldGlyZWQgYXQgaWRsZSBzbyBhIGxhdGVyIGRlbGl2ZXJ5IGdhdGVkIG9uIGl0IGNhbm5vdFxuICAgIC8vIGRlYWRsb2NrIGFuZCB0aGUgcmVnaXN0cnkgY2Fubm90IGxlYWsgYW4gZW50cnkgcGVyIGFiYW5kb25lZCBkZWxpdmVyeS5cbiAgICAvLyBSZXRpcmVtZW50IGdvZXMgdGhyb3VnaCB0aGUgY29udGV4dCdzIHNpbmdsZSBvcmRlcmVkIGRpc3BlbnNlciByYXRoZXJcbiAgICAvLyB0aGFuIGEgcGVyLWJhcnJpZXIgaWRsZSBwb2xsLiBTZWUge0BsaW5rIGVuc3VyZUJhcnJpZXJTYWZldHlOZXR9IGZvciB3aHlcbiAgICAvLyB0aGUgT1JERVIgb2YgdGhlc2UgcmV0aXJlbWVudHMgaXMgbG9hZC1iZWFyaW5nLlxuICAgIGVuc3VyZUJhcnJpZXJTYWZldHlOZXQoY3R4KTtcbiAgICByZXR1cm4gZW50cnk7XG4gIH07XG5cbiAgbGV0IGVudHJ5ID0gaW5zdGFsbChvcHRpb25zLmFybWVkID8/IHRydWUpO1xuICBsZXQgZGVsaXZlcmVkVG9Xb3JrZmxvdyA9IGZhbHNlO1xuXG4gIHJldHVybiB7XG4gICAgbWFya0RlbGl2ZXJlZDogKCkgPT4ge1xuICAgICAgaWYgKGRlbGl2ZXJlZFRvV29ya2Zsb3cpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZGVsaXZlcmVkVG9Xb3JrZmxvdyA9IHRydWU7XG4gICAgICBlbnRyeS5yZXRpcmUoKTtcbiAgICB9LFxuICAgIGFybTogKCkgPT4ge1xuICAgICAgaWYgKGRlbGl2ZXJlZFRvV29ya2Zsb3cpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGlkbGUgc2FmZXR5IG5ldCBtYXkgcmV0aXJlIGFuIHVuY2xhaW1lZCBidWZmZXJlZCBob29rIHBheWxvYWRcbiAgICAgIC8vIHdoaWxlIGEgcmV0YWluZWQgVk0ga2VlcHMgaXRzIGBjbGFpbSgpYCBjbG9zdXJlIGFsaXZlLiBJZiB3b3JrZmxvd1xuICAgICAgLy8gY29kZSBsYXRlciBjbGFpbXMgdGhhdCBwYXlsb2FkLCByZXBsYWNlIHRoZSBzZXR0bGVkIGVudHJ5IHNvIGRlbGl2ZXJ5XG4gICAgICAvLyByZW1haW5zIG5vbi1pZGxlIHVudGlsIHRoZSBjbGFpbSByZWFjaGVzIHRoZSB3b3JrZmxvdy5cbiAgICAgIGlmIChlbnRyeS5yZXRpcmVkKSB7XG4gICAgICAgIGVudHJ5ID0gaW5zdGFsbCh0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGJhcnJpZXJzLmdldChldmVudEluZGV4KSAhPT0gZW50cnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgIGBEZWxpdmVyeSBiYXJyaWVyIGxvc3Qgb3duZXJzaGlwIG9mIGV2ZW50IGluZGV4ICR7ZXZlbnRJbmRleH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbnRyeS5hcm1lZCA9IHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb250ZXh0cyB3aG9zZSBiYXJyaWVyIHNhZmV0eS1uZXQgZGlzcGVuc2VyIGlzIGN1cnJlbnRseSBhcm1lZC4gTW9kdWxlLWxldmVsXG4gKiBzbyB0aGUgY29udGV4dCBpbnRlcmZhY2UgKGNvbnN0cnVjdGVkIGxpdGVyYWxseSBieSBtYW55IHRlc3QgaGFybmVzc2VzKVxuICogbmVlZHMgbm8gbmV3IGZpZWxkOyBlbnRyaWVzIGRyb3Agd2l0aCB0aGUgY29udGV4dC5cbiAqL1xuLy8gcGVyLWNvcHktb2s6IGtleWVkIG9uIHRoZSBvcmNoZXN0cmF0b3IgY29udGV4dCBvYmplY3QsIGFuZCBhIGNvbnRleHQgaXMgYXJtZWRcbi8vIGFuZCBvYnNlcnZlZCBieSB0aGUgc2FtZSBjb3B5IHRoYXQgY3JlYXRlZCBpdC4gRW50cmllcyBjYW4gbmV2ZXIgYmUgbG9va2VkIHVwXG4vLyBmcm9tIGFub3RoZXIgY29weSBiZWNhdXNlIHRoYXQgY29weSBoYXMgbm8gcmVmZXJlbmNlIHRvIHRoZSBrZXkuXG5jb25zdCBhY3RpdmVCYXJyaWVyU2FmZXR5TmV0cyA9IG5ldyBXZWFrU2V0PFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dD4oKTtcblxuLyoqXG4gKiBUaGUgYmFycmllciByZWdpc3RyeSdzIHNhZmV0eSBuZXQ6IE9ORSBpZGxlLWdhdGVkIGRpc3BlbnNlciBwZXIgY29udGV4dCB0aGF0XG4gKiByZXRpcmVzLCBhdCBlYWNoIG9ic2VydmF0aW9uIG9mIGRlbGl2ZXJ5IGlkbGUsIG9ubHkgdGhlIExPV0VTVC1pbmRleCBlbnRyeVxuICogc3RpbGwgcmVnaXN0ZXJlZCwgdGhlbiB5aWVsZHMgc28gdGhlIGNoYWluIGl0IHJlbGVhc2VkIGNhbiBydW4gYmVmb3JlIHRoZVxuICogbmV4dCByZXRpcmVtZW50IGlzIGNvbnNpZGVyZWQuXG4gKlxuICogV2h5IG9uZSBvcmRlcmVkIGRpc3BlbnNlciBhbmQgbm90IGEgcG9sbCBwZXIgYmFycmllciAod2hpY2ggaXMgd2hhdCB0aGlzXG4gKiByZXBsYWNlZCk6IHRoZSBvcmRlciBvZiBzYWZldHktbmV0IHJldGlyZW1lbnRzIGRlY2lkZXMgdGhlIGRlbGl2ZXJ5IG9yZGVyIG9mXG4gKiBldmVyeSBjaGFpbiBwYXJrZWQgYmVoaW5kIGFuIHVuY2xhaW1lZCBidWZmZXJlZCBob29rIHBheWxvYWQ6IGEgaG9vayB0aGVcbiAqIHdvcmtmbG93IG5ldmVyIHJlYWRzIChhIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9va2ApIHBhcmtzIGV2ZXJ5IGxhdGVyXG4gKiBhcm1lZCB3YWl0L2hvb2sgYmVoaW5kIGEgYmFycmllciB0aGF0IG9ubHkgdGhpcyBuZXQgY2FuIHJldGlyZS4gUGVyLWJhcnJpZXJcbiAqIHBvbGxzIGZpcmUgaW4gd2hhdGV2ZXIgb3JkZXIgdGhlaXIgcmUtYXJtIGN5Y2xlcyBsYW5kLCBhbmQgZWFjaCByZS1hcm1cbiAqIGF0dGFjaGVzIHRvIGEgYHByb21pc2VRdWV1ZWAgdGhhdCBncm93cyBiZXR3ZWVuIGNoZWNrcywgc28gd2l0aCBzZXZlcmFsXG4gKiBwYXJrZWQgc2VnbWVudHMgdGhlIHJlbGVhc2Ugb3JkZXIgZGVjYXlzIHRvIHRpbWluZyBub2lzZS4gRHJhd3MgKGB1c2VTdGVwYFxuICogY29ycmVsYXRpb24gaWRzKSB0aGVuIGRlcGVuZCBvbiB3aGljaCBzZWdtZW50IGhhcHBlbmVkIHRvIHJlbGVhc2UgZmlyc3Q6XG4gKiBjb25jcmV0ZWx5LCBvbiBob3cgTVVDSCBsb2cgdGhlIHJlcGxheSBsb2FkZWQsIHNpbmNlIHRoYXQgZGVjaWRlcyB3aGF0IGlzIGluXG4gKiB0aGUgcmVnaXN0cnkuIFRoYXQgaXMgdGhlIG1lY2hhbmlzbSBiZWhpbmQgc2xvdC1tb2RlIENPUlJVUFRFRF9FVkVOVF9MT0cgb25cbiAqIHN0b3JtLXNoYXBlZCBydW5zIChzZWUgc3Rvcm0tbG9nLXJlcGxheS50ZXN0LnRzLCBidWlsdCBmcm9tIGEgcHJvZHVjdGlvblxuICogbG9nKTogdHdvIHJlcGxheXMgb2YgdGhlIHNhbWUgcnVuIGhvbGRpbmcgZGlmZmVyZW50LWxlbmd0aCBwcmVmaXhlcyBib3VuZFxuICogdGhlIHNhbWUgY29ycmVsYXRpb24gb3JkaW5hbCB0byBkaWZmZXJlbnQgc3RlcHMuXG4gKlxuICogUmV0aXJpbmcgbG93ZXN0LWZpcnN0IGlzIG5vdCBtZXJlbHkgdGlkeSwgaXQgaXMgdGhlIG9ubHkgb3JkZXIgdGhhdCBjYW5ub3RcbiAqIGludmVydCB0aGUgbG9nOiBldmVyeSBnYXRlIHBvaW50cyBmcm9tIGEgaGlnaGVyIGluZGV4IHRvIGEgc3RyaWN0bHkgbG93ZXJcbiAqIG9uZSwgc28gYXQgZGVsaXZlcnkgaWRsZSB0aGUgbG93ZXN0IHVuZGVsaXZlcmVkIGVudHJ5IGdhdGVzIG9uIG5vdGhpbmdcbiAqIHN0aWxsIHJlZ2lzdGVyZWQ6IGl0IGlzIHRoZSBoZWFkIG9mIGV2ZXJ5IHBhcmtlZCBjaGFpbiAoaW4gcHJhY3RpY2UsIHRoZVxuICogdW5jbGFpbWVkIHBheWxvYWQgaXRzZWxmKS4gUmVsZWFzaW5nIGl0IGxldHMgdGhlIGNoYWluIGFib3ZlIGRlbGl2ZXJcbiAqIHRocm91Z2ggdGhlIG9yZGluYXJ5IGJhcnJpZXIgb3JkZXI7IGFueXRoaW5nIHRoZSByZWxlYXNlIHdha2VzIGZsaXBzXG4gKiB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9IGJhY2sgdG8gdHJ1ZSwgd2hpY2ggcmUtYmxvY2tzIHRoaXNcbiAqIGRpc3BlbnNlciB1bnRpbCB0aGUgY2hhaW4gaGFzIGZ1bGx5IGRyYWluZWQuIEEgaGlnaGVyIGVudHJ5IG11c3QgbmV2ZXIgYmVcbiAqIHJldGlyZWQgd2hpbGUgYSBsb3dlciBvbmUgaXMgcmVnaXN0ZXJlZCwgd2hpY2ggaXMgZXhhY3RseSB0aGUgaW52ZXJzaW9uXG4gKiBkZXNjcmliZWQgb24ge0BsaW5rIGF3YWl0RWFybGllckRlbGl2ZXJpZXN9LlxuICpcbiAqIFRoZSBkaXNwZW5zZXIgZ29lcyBkb3JtYW50IHdoZW4gdGhlIHJlZ2lzdHJ5IGVtcHRpZXMgYW5kIGlzIHJlLWFybWVkIGJ5IHRoZVxuICogbmV4dCByZWdpc3RyYXRpb24sIHNvIGFuIGlkbGUgY29udGV4dCBob2xkcyBubyBsaXZlIHRpbWVyLlxuICovXG5mdW5jdGlvbiBlbnN1cmVCYXJyaWVyU2FmZXR5TmV0KGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KTogdm9pZCB7XG4gIGNvbnN0IGJhcnJpZXJzID0gY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzO1xuICBpZiAoIWJhcnJpZXJzIHx8IGFjdGl2ZUJhcnJpZXJTYWZldHlOZXRzLmhhcyhjdHgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGFjdGl2ZUJhcnJpZXJTYWZldHlOZXRzLmFkZChjdHgpO1xuICBjb25zdCByZWFybSA9ICgpID0+IHtcbiAgICBzZXRUaW1lb3V0KGNoZWNrLCAwKTtcbiAgfTtcbiAgLy8gQSByZWplY3RlZCBwcm9taXNlUXVldWUgc2V0dGxlcyBpbW1lZGlhdGVseSBhbmQgZm9yZXZlciwgc28gcmUtYXJtaW5nXG4gIC8vIHRocm91Z2ggaXQgYXQgdGhlIG5vcm1hbCBjYWRlbmNlIHdvdWxkIGRlZ2VuZXJhdGUgaW50byBhIGJ1c3kgbG9vcCBvbiBhblxuICAvLyBhYmFuZG9uZWQgY29udGV4dC4gQmFjayBvZmYgaW5zdGVhZDogY29ycmVjdG5lc3Mgb25seSBuZWVkcyB0aGUgZGlzcGVuc2VyXG4gIC8vIHRvIHN0aWxsIGV4aXN0LCBzaW5jZSB0aGUgcmVnaXN0cnkgZ2F0ZXMgc3VzcGVuc2lvbiB2aWEgaXNEZWxpdmVyeUlkbGVcbiAgLy8gYW5kIGEgZGVhZCBkaXNwZW5zZXIgd291bGQgd2VkZ2UgdGhlIHJ1bi5cbiAgY29uc3QgcmVhcm1BZnRlclJlamVjdGlvbiA9ICgpID0+IHtcbiAgICBzZXRUaW1lb3V0KGNoZWNrLCA1MCk7XG4gIH07XG4gIGNvbnN0IGNoZWNrID0gKCkgPT4ge1xuICAgIGlmIChiYXJyaWVycy5zaXplID09PSAwKSB7XG4gICAgICAvLyBEb3JtYW50LiBUaGUgbmV4dCByZWdpc3RlckRlbGl2ZXJ5QmFycmllciByZS1hcm1zLlxuICAgICAgYWN0aXZlQmFycmllclNhZmV0eU5ldHMuZGVsZXRlKGN0eCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghY2FuUmV0aXJlQWJhbmRvbmVkQmFycmllcnMoY3R4KSkge1xuICAgICAgLy8gQSBkZWxpdmVyeSBpcyBoeWRyYXRpbmcgb3IgY29tbWl0dGVkLWJ1dC1wYXJrZWQgb24gaXRzIGRlZmVycmFsOyBsZXRcbiAgICAgIC8vIHRoZSBxdWV1ZSBkcmFpbiBhbmQgcmUtY2hlY2sgYSB0aWNrIGxhdGVyIChzYW1lIGNhZGVuY2UgYXNcbiAgICAgIC8vIHNjaGVkdWxlV2hlbklkbGUpLlxuICAgICAgY3R4LnByb21pc2VRdWV1ZS50aGVuKHJlYXJtLCByZWFybUFmdGVyUmVqZWN0aW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSWRsZSB3aXRoIGVudHJpZXMgbGVmdDogbm90aGluZyByZW1haW5pbmcgZGVsaXZlcnMgb24gaXRzIG93biwgc29cbiAgICAvLyByZWxlYXNlIHBhcmtlZCBjaGFpbnMgZnJvbSB0aGUgaGVhZDogbG93ZXN0IGluZGV4IGZpcnN0LCBvbmUgYXQgYVxuICAgIC8vIHRpbWUsIHJlLXJlYWRpbmcgaWRsZSBiZXR3ZWVuIHJldGlyZW1lbnRzLiBBIHJldGlyZW1lbnQgdGhhdCB3YWtlcyBhXG4gICAgLy8gY2hhaW4gZmxpcHMge0BsaW5rIGhhc1BhcmtlZENvbW1pdHRlZERlbGl2ZXJ5fSBzeW5jaHJvbm91c2x5IChpdCBpc1xuICAgIC8vIGNvbXB1dGVkIGZyb20gdGhlIHJlZ2lzdHJ5IHRoaXMgbG9vcCBqdXN0IG11dGF0ZWQpLCB3aGljaCBzdG9wcyB0aGVcbiAgICAvLyBzd2VlcCBzbyB0aGUgY2hhaW4gZGVsaXZlcnMgYmVmb3JlIGFueXRoaW5nIGFib3ZlIGl0IGlzIHJlbGVhc2VkLiBBXG4gICAgLy8gcmV0aXJlbWVudCB0aGF0IHdha2VzIG5vdGhpbmcgKGEgc3RhbGUgcGF5bG9hZCBubyBkZWxpdmVyeSBnYXRlcyBvbilcbiAgICAvLyBrZWVwcyB0aGUgc3dlZXAgZ29pbmcsIHNvIGEgYmFja2xvZyBvZiB0aG9zZSBkcmFpbnMgaW4gT05FIGlkbGVcbiAgICAvLyBvYnNlcnZhdGlvbiwgc2luY2UgcGFjaW5nIHRoZW0gb25lIHBlciB0aW1lciB0aWNrIHdvdWxkIGhvbGRcbiAgICAvLyBjb25zdW1lZC1idXQtdW5kZWxpdmVyZWQgZXZlbnRzIGhvc3RhZ2UgbG9uZyBlbm91Z2ggdG8gdHJpcCB0aGUgZXZlbnRzXG4gICAgLy8gY29uc3VtZXIncyB1bmNvbnN1bWVkLWV2ZW50IGRlYWRsaW5lIGFuZCBmYWlsIGhlYWx0aHkgcmVwbGF5cy5cbiAgICB3aGlsZSAoYmFycmllcnMuc2l6ZSA+IDAgJiYgY2FuUmV0aXJlQWJhbmRvbmVkQmFycmllcnMoY3R4KSkge1xuICAgICAgbGV0IGxvd2VzdEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgbG93ZXN0RW50cnk6IERlbGl2ZXJ5QmFycmllckVudHJ5IHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGVudHJ5XSBvZiBiYXJyaWVycykge1xuICAgICAgICBpZiAobG93ZXN0SW5kZXggPT09IHVuZGVmaW5lZCB8fCBpbmRleCA8IGxvd2VzdEluZGV4KSB7XG4gICAgICAgICAgbG93ZXN0SW5kZXggPSBpbmRleDtcbiAgICAgICAgICBsb3dlc3RFbnRyeSA9IGVudHJ5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsb3dlc3RFbnRyeT8ucmV0aXJlKCk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoY2hlY2ssIDApO1xuICB9O1xuICBzZXRUaW1lb3V0KGNoZWNrLCAwKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBzYWZldHktbmV0IGRpc3BlbnNlciBtYXkgcmV0aXJlIGFiYW5kb25lZCBiYXJyaWVycyByaWdodCBub3c6XG4gKiBubyBoeWRyYXRpb24gaW4gZmxpZ2h0IGFuZCBubyBjb21taXR0ZWQgZGVsaXZlcnkgc3RpbGwgd29ya2luZyB0aHJvdWdoIGl0c1xuICogZGV0YWNoZWQgZGVmZXJyYWwuIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IFdFQUtFUiB0aGFuIHtAbGluayBpc0RlbGl2ZXJ5SWRsZX06XG4gKiB0aGUgZGlzcGVuc2VyIGlzIHdoYXQgZW1wdGllcyB0aGUgcmVnaXN0cnksIHNvIGdhdGluZyBpdCBvbiByZWdpc3RyeVxuICogZW1wdGluZXNzIHdvdWxkIGdhdGUgaXRzIG93biB3b3JrLlxuICovXG5mdW5jdGlvbiBjYW5SZXRpcmVBYmFuZG9uZWRCYXJyaWVycyhjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY3R4LnBlbmRpbmdEZWxpdmVyaWVzID09PSAwICYmICFoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeShjdHgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgc29tZSByZWdpc3RlcmVkIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBpcyBnb2luZyB0byByZWFjaCB0aGVcbiAqIHdvcmtmbG93IHdpdGhvdXQgYW55IGZ1cnRoZXIgaGVscCAoaXQgaXMgYXJtZWQgYW5kIG5vdCB0cmFuc2l0aXZlbHkgcGFya2VkXG4gKiBiZWhpbmQgYW4gdW5jbGFpbWVkIGJ1ZmZlcmVkIHBheWxvYWQsIHNlZSB7QGxpbmsgcmVzb2x2ZXNPbkl0c093bn0pIGJ1dFxuICogaGFzIG5vdCBiZWVuIGhhbmRlZCBvdmVyIHlldC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBkZWxpdmVyeSBzdGF0ZSBgcGVuZGluZ0RlbGl2ZXJpZXNgIGNhbm5vdCBzZWUuIFRoYXQgY291bnRlclxuICogY292ZXJzIHRoZSBoeWRyYXRpb24gd2luZG93IGluc2lkZSBhIHNlcmlhbCBgcHJvbWlzZVF1ZXVlYCBzbG90IGFuZCBpc1xuICogcmVsZWFzZWQgdGhlcmUsIHdoaWxlIHRoZSBkZWxpdmVyeSdzIGByZXNvbHZlKClgIHJ1bnMgbGF0ZXIsIGZyb20gYVxuICogZGV0YWNoZWQgY29udGludWF0aW9uIGJlaGluZCB7QGxpbmsgYXdhaXRFYXJsaWVyRGVsaXZlcmllc30sIGluY2x1ZGluZyBpdHNcbiAqIG1hY3JvdGFzayB5aWVsZCB3aGVuZXZlciB0aGUgZGVsaXZlcnkgaGFkIHRvIGRlZmVyLiBSZXBsYXlpbmcgYSBiYXRjaCBvZiBOXG4gKiBwYXJhbGxlbCBzdGVwIHJlc3VsdHMgY29uc3VtZWQgaW4gb25lIGRyYWluIHdpbmRvdyBsZWF2ZXMgTi0xIG9mIHRoZW1cbiAqIHBhcmtlZCBvbiB0aGF0IHlpZWxkIHdpdGggYHBlbmRpbmdEZWxpdmVyaWVzYCBhbHJlYWR5IGF0IDAuIEFuIGlkbGUgY2hlY2tcbiAqIGFybWVkIGR1cmluZyB0aGUgc2FtZSB3aW5kb3cgKGEgcGVuZGluZyBgc2xlZXAoKWAgYXJtcyBvbmUgb24gZXZlcnkgcmVwbGF5KVxuICogY291bGQgdGhlbiBvYnNlcnZlIFwiaWRsZVwiIG1pZC1kZWZlcnJhbCBhbmQgcmFpc2UgYSBgV29ya2Zsb3dTdXNwZW5zaW9uYFxuICogQkVGT1JFIHRoZSB3b3JrZmxvdydzIG93biBjb250aW51YXRpb25zIHJhbjogYSBzdXNwZW5zaW9uIGNhcnJ5aW5nIG5vbmUgb2ZcbiAqIHRoZSBmb2xsb3ctdXAgd29yayB0aGUgYmF0Y2ggd2FzIGFib3V0IHRvIGNyZWF0ZSwgd2hpY2ggdGhlIHJ1bnRpbWVcbiAqIGR1dGlmdWxseSBzY2hlZHVsZXMgYXMgbm90aGluZywgbGVhdmluZyB0aGUgcnVuIGRvcm1hbnQgdW50aWwgYW4gdW5yZWxhdGVkXG4gKiB0aW1lciBmaXJlcyAodmVyY2VsL3dvcmtmbG93IzMxODMpLlxuICpcbiAqIERlbGl2ZXJpZXMgdGhhdCBkbyBOT1QgcmVzb2x2ZSBvbiB0aGVpciBvd24gbXVzdCBiZSBleGNsdWRlZCwgbm90IGZvclxuICogYWNjdXJhY3kgYnV0IGZvciB0ZXJtaW5hdGlvbjogYW4gdW5jbGFpbWVkIGJ1ZmZlcmVkIGhvb2sgcGF5bG9hZCBpcyByZXRpcmVkXG4gKiBCWSB0aGUgaWRsZSBzYWZldHkgbmV0IGluIHtAbGluayByZWdpc3RlckRlbGl2ZXJ5QmFycmllcn0sIHNvIGNvdW50aW5nIGl0XG4gKiBoZXJlIHdvdWxkIGdhdGUgaXRzIG93biByZXRpcmVtZW50LiBUaGF0IHJlYXNvbmluZyBleHRlbmRzIHRvIHdoYXRldmVyIGlzXG4gKiBwYXJrZWQgYmVoaW5kIHN1Y2ggYSBwYXlsb2FkIChhIHdhaXQsIGFuZCBhIHN0ZXAgZ2F0aW5nIG9uIHRoYXQgd2FpdCkgZm9yXG4gKiB0aGUgc2FtZSByZWFzb246IHRoZSB3aG9sZSBjaGFpbiBtb3ZlcyBvbmx5IG9uY2UgdGhlIG5ldCBmaXJlcywgYW5kIGl0XG4gKiBjYW5ub3QgZmlyZSB3aGlsZSB0aGUgY2hhaW4gaXMgY291bnRlZC4gU2VsZi1yZXNvbHZpbmcgZGVsaXZlcmllcyBhbHdheXNcbiAqIGRlbGl2ZXIgZnJvbSB0aGVpciBvd24gY2hhaW5zIChzZWUgdGhlIElOVkFSSUFOVCBvblxuICoge0BsaW5rIHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyfSkgYW5kIG5ldmVyIG5lZWQgdGhhdCBuZXQsIHNvIHdhaXRpbmcgb25cbiAqIHRoZW0gaXMgZGVhZGxvY2stZnJlZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1BhcmtlZENvbW1pdHRlZERlbGl2ZXJ5KFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJhcnJpZXJzID0gY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzO1xuICBpZiAoIWJhcnJpZXJzIHx8IGJhcnJpZXJzLnNpemUgPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gU2hhcmVkIGFjcm9zcyB0aGlzIGNhbGwgb25seS4gU2VlIGByZXNvbHZlc09uSXRzT3duYC5cbiAgY29uc3Qgc2VsZlJlc29sdmluZyA9IG5ldyBNYXA8bnVtYmVyLCBib29sZWFuPigpO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgZW50cnldIG9mIGJhcnJpZXJzKSB7XG4gICAgaWYgKHJlc29sdmVzT25JdHNPd24oYmFycmllcnMsIGluZGV4LCBlbnRyeSwgc2VsZlJlc29sdmluZykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciBubyBkYXRhIGRlbGl2ZXJ5IChzdGVwIHJlc3VsdCwgaG9vayBwYXlsb2FkKSBpcyBpbiBmbGlnaHQgcmlnaHQgbm93LlxuICpcbiAqIFwiSW4gZmxpZ2h0XCIgaXMgdHdvIGRpc3RpbmN0IHdpbmRvd3MsIGVhY2ggd2l0aCBpdHMgb3duIGd1YXJkOlxuICogYHBlbmRpbmdEZWxpdmVyaWVzID4gMGAgY292ZXJzIGh5ZHJhdGlvbiBpbnNpZGUgdGhlIHNlcmlhbCBxdWV1ZSBzbG90cywgYW5kXG4gKiB7QGxpbmsgaGFzUGFya2VkQ29tbWl0dGVkRGVsaXZlcnl9IGNvdmVycyB0aGUgZGV0YWNoZWQgZ2FwIGJldHdlZW4gYSBzbG90XG4gKiByZWxlYXNpbmcgdGhhdCBjb3VudGVyIGFuZCB0aGUgZGVsaXZlcnkncyBgcmVzb2x2ZSgpYCBhY3R1YWxseSBydW5uaW5nLFxuICogZGVsaWJlcmF0ZWx5IG91dHNpZGUgYHBlbmRpbmdEZWxpdmVyaWVzYCAoc2VlIHN0ZXAudHMpLCBhbmQgaW52aXNpYmxlIHRvIGl0LlxuICpcbiAqIEFueXRoaW5nIHRoYXQgZGVjaWRlcyBhIHJlcGxheSBpcyBvdmVyLCBvciB0aGF0IGEgcmVwbGF5IHdlbnQgd3JvbmcsIGhhcyB0b1xuICogY29uc3VsdCB0aGlzIGZpcnN0OiB3aGlsZSBpdCBpcyBmYWxzZSB0aGUgd29ya2Zsb3cgVk0gaXMgbWlkLXJlYWN0aW9uLCBzb1xuICogd2hhdCBpdCBoYXMgYW5kIGhhcyBub3QgZG9uZSB5ZXQgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBydW4uIFR3byBjYWxsZXJzXG4gKiByZWFkIGl0LCBmb3IgdGhlIHR3byBzdWNoIGRlY2lzaW9uczoge0BsaW5rIHNjaGVkdWxlV2hlbklkbGV9IGZvciB0aGVcbiAqIHN1c3BlbnNpb24sIGFuZCB0aGUgZXZlbnRzIGNvbnN1bWVyJ3MgdW5jb25zdW1lZC1ldmVudCBjaGVjayBmb3IgZGl2ZXJnZW5jZS5cbiAqXG4gKiBBIG5vbi1lbXB0eSBiYXJyaWVyIHJlZ2lzdHJ5IGNvdW50cyBhcyBpbiBmbGlnaHQsIGV2ZW4gd2hlbiBldmVyeSByZW1haW5pbmdcbiAqIGVudHJ5IGlzIHBhcmtlZCBiZWhpbmQgYW4gdW5jbGFpbWVkIGJ1ZmZlcmVkIHBheWxvYWQuIFRob3NlIGVudHJpZXMgb25seVxuICogbW92ZSB3aGVuIHRoZSBzYWZldHktbmV0IGRpc3BlbnNlciByZXRpcmVzIHRoZW0gKGxvd2VzdC1maXJzdCwgc2VlXG4gKiB7QGxpbmsgZW5zdXJlQmFycmllclNhZmV0eU5ldH0pLCBhbmQgdGhlIGRlbGl2ZXJpZXMgdGhleSByZWxlYXNlIGFyZSByZWFsXG4gKiB3b3JrZmxvdyByZWFjdGlvbnM6IGEgc3VzcGVuc2lvbiByYWlzZWQgYmVmb3JlIHRoZXkgcnVuIHdvdWxkIGJlIGNvbXB1dGVkXG4gKiBmcm9tIGEgVk0gdGhhdCBoYXMgbm90IHNlZW4gdGhlbSwgc2NoZWR1bGluZyBub25lIG9mIHRoZWlyIGZvbGxvdy11cCB3b3JrXG4gKiBhbmQgbGVhdmluZyB0aGUgcnVuIGRvcm1hbnQgKHRoZSB2ZXJjZWwvd29ya2Zsb3cjMzE4MyBzaGFwZSkuIFRoZSBkaXNwZW5zZXJcbiAqIGl0c2VsZiBpcyBnYXRlZCBvbiB7QGxpbmsgY2FuUmV0aXJlQWJhbmRvbmVkQmFycmllcnN9LCB0aGUgd2Vha2VyIHByZWRpY2F0ZVxuICogd2l0aG91dCB0aGUgcmVnaXN0cnkgdGVybSwgcHJlY2lzZWx5IHNvIGl0IGNhbiBkbyB0aGUgZHJhaW5pbmcgdGhhdCB0aGlzXG4gKiBwcmVkaWNhdGUgd2FpdHMgZm9yOyByZWdpc3RyeSBzaXplIHN0cmljdGx5IGRlY3JlYXNlcyBhdCBlYWNoIHJldGlyZW1lbnQsXG4gKiBzbyBpZGxlIGlzIGFsd2F5cyByZWFjaGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZWxpdmVyeUlkbGUoY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMgPT09IDAgJiZcbiAgICAoIWN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVycyB8fCBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnMuc2l6ZSA9PT0gMClcbiAgKTtcbn1cblxuLyoqXG4gKiBTY2hlZHVsZSBhIGNhbGxiYWNrIHRvIGZpcmUgb25seSBhZnRlciBhbGwgcGVuZGluZyBkYXRhIGRlbGl2ZXJpZXNcbiAqIChzdGVwIHJlc3VsdHMsIGhvb2sgcGF5bG9hZHMpIGFuZCBhc3luYyBkZXNlcmlhbGl6YXRpb24gaGF2ZSBjb21wbGV0ZWQuXG4gKiBVc2VzIGEgcG9sbGluZyBsb29wOiBzZXRUaW1lb3V0KDApIOKGkiBjaGVjayBwZW5kaW5nRGVsaXZlcmllcyBhbmQgdGhlXG4gKiBiYXJyaWVyIHJlZ2lzdHJ5IOKGkiBpZiBhbnl0aGluZyBpcyBzdGlsbCBpbiBmbGlnaHQsIHdhaXQgZm9yIHByb21pc2VRdWV1ZSDihpJcbiAqIHJlcGVhdC4gVGhpcyBoYW5kbGVzIHRoZSBtdWx0aS1yb3VuZCBkZWxpdmVyeSBwYXR0ZXJuIHdoZXJlIGVhY2ggaG9va1xuICogcGF5bG9hZCBkZWxpdmVyeSBjeWNsZSBhcHBlbmRzIG5ldyBhc3luYyB3b3JrIHRvIHRoZSBwcm9taXNlUXVldWUuIFdoYXRcbiAqIGNvdW50cyBhcyBpbiBmbGlnaHQgaXMge0BsaW5rIGlzRGVsaXZlcnlJZGxlfS5cbiAqXG4gKiBUaGUgaW5pdGlhbCBgc2V0VGltZW91dCgwKWAgbWFjcm90YXNrIGlzIGxvYWQtYmVhcmluZyBhbmQgbXVzdCBOT1QgYmVcbiAqIGRvd25ncmFkZWQgdG8gYSBtaWNyb3Rhc2sgKGBxdWV1ZU1pY3JvdGFza2AvYFByb21pc2UucmVzb2x2ZSgpLnRoZW5gKS5cbiAqIGBwZW5kaW5nRGVsaXZlcmllc2Agb25seSBndWFyZHMgdGhlIGhvc3Qtc2lkZSBoeWRyYXRpb24gd2luZG93OyBiZXR3ZWVuIGFcbiAqIGRlbGl2ZXJ5J3MgYHJlc29sdmUoKWAgYW5kIHRoZSB3b3JrZmxvdyBWTSBib2R5IHJ1bm5pbmcgaXRzIGNvbnRpbnVhdGlvbiB0b1xuICogcmVnaXN0ZXIgdGhlIG5leHQgc3Vic2NyaWJlciwgYHBlbmRpbmdEZWxpdmVyaWVzYCBpcyBhbHJlYWR5IDAgZXZlbiB0aG91Z2hcbiAqIHRoZSBWTSBpcyBtaWQtcmVhY3Rpb24uIE5vZGUgZG9lcyBub3QgZ3VhcmFudGVlIGEgbWljcm90YXNrIHNjaGVkdWxlZCBpblxuICogdGhlIGhvc3QgY29udGV4dCBzZXR0bGVzIGFmdGVyIHRoZSBjcm9zcy1WTSBwcm9taXNlIGNoYWluIChyZXNvbHZlIGluIGhvc3RcbiAqIOKGkiB3b3JrZmxvdyBjb2RlIGluIFZNIOKGkiBzdWJzY3JpYmUgYmFjayBpbiBob3N0KTsgdGhlIG1hY3JvdGFzayBib3VuZGFyeVxuICogZ2l2ZXMgdGhhdCBjaGFpbiB0aW1lIHRvIHJ1biwgc28gdGhlIHN1c3BlbnNpb24gZG9lcyBub3QgcHJlZW1wdCBhIHNpYmxpbmdcbiAqIGRlbGl2ZXJ5IHN0aWxsIGluIGZsaWdodC4gRW1waXJpY2FsbHksIHJlcGxhY2luZyBpdCB3aXRoIGBxdWV1ZU1pY3JvdGFza2BcbiAqIGJyZWFrcyBob29rL3NsZWVwIGBQcm9taXNlLnJhY2VgIG9yZGVyaW5nIChDb3JydXB0ZWRFdmVudExvZ0Vycm9yKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlV2hlbklkbGUoXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBmbjogKCkgPT4gdm9pZFxuKTogdm9pZCB7XG4gIGNvbnN0IGNoZWNrID0gKCkgPT4ge1xuICAgIGlmICghaXNEZWxpdmVyeUlkbGUoY3R4KSkge1xuICAgICAgLy8gQSBkZWxpdmVyeSBpcyBzdGlsbCBoeWRyYXRpbmcsIG9yIGlzIGNvbW1pdHRlZCBidXQgcGFya2VkIGJlaGluZCBpdHNcbiAgICAgIC8vIGRlZmVycmFsICh3aG9zZSByZXNvbHZlIHJ1bnMgb24gYSBkZXRhY2hlZCB0aW1lciwgbm90IHRoaXMgcXVldWUpLlxuICAgICAgLy8gRWl0aGVyIHdheTogbGV0IHRoZSBxdWV1ZSBkcmFpbiwgdGhlbiByZS1jaGVjayBhIHRpbWVyIHRpY2sgbGF0ZXIuXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KGNoZWNrLCAwKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbigpO1xuICAgIH1cbiAgfTtcbiAgc2V0VGltZW91dChjaGVjaywgMCk7XG59XG5cbi8qKiBTY2hlZHVsZSBhIGdlbmVyYXRpb24tZ3VhcmRlZCBzdXNwZW5zaW9uIGFmdGVyIGRlbGl2ZXJpZXMgc2V0dGxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlV29ya2Zsb3dTdXNwZW5zaW9uKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dFxuKTogdm9pZCB7XG4gIGNvbnN0IGdlbmVyYXRpb24gPSBjdHguc3VzcGVuc2lvbkdlbmVyYXRpb247XG4gIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgaWYgKGdlbmVyYXRpb24gIT09IGN0eC5zdXNwZW5zaW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICApO1xuICB9KTtcbn1cbiJdfQ==
|
|
@@ -218,15 +218,17 @@ export declare function isTurboEnabled(): boolean;
|
|
|
218
218
|
*/
|
|
219
219
|
export declare function isQuickJSBaselineSnapshotEnabled(): boolean;
|
|
220
220
|
/**
|
|
221
|
-
* Whether the inline loop retains a suspended workflow VM
|
|
222
|
-
*
|
|
223
|
-
* the live VM, event consumer, and hydrated state
|
|
224
|
-
* iteration appends
|
|
225
|
-
* `vm.Context` and replaying the whole event log.
|
|
226
|
-
*
|
|
221
|
+
* Whether the Node.js inline loop retains a suspended workflow VM within one
|
|
222
|
+
* invocation (default ON). When on, a step- or attribute-driven suspension can
|
|
223
|
+
* keep the live VM, event consumer, and hydrated state even with open hooks or
|
|
224
|
+
* waits. The next loop iteration appends newly durable events instead of
|
|
225
|
+
* rebuilding the `vm.Context` and replaying the whole event log. Hook- or
|
|
226
|
+
* wait-only suspensions park the invocation, while replay divergence falls back
|
|
227
|
+
* to the ordinary durable replay path. QuickJS manages its own retained loop.
|
|
227
228
|
*
|
|
228
229
|
* `WORKFLOW_RETAINED_VM=0` (or `false`) is the kill switch: every iteration
|
|
229
|
-
* replays from scratch in a fresh VM, matching the
|
|
230
|
+
* replays the Node.js engine from scratch in a fresh VM, matching the
|
|
231
|
+
* pre-retention behavior.
|
|
230
232
|
*/
|
|
231
233
|
export declare function isVmRetentionEnabled(): boolean;
|
|
232
234
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/runtime/constants.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAW9C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAEzC,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAwB7C;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CA6B3C;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAMD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAMnD;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA2B1C;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,8BAA8B,QAAa,CAAC;AAEzD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAExD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAInD;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAezD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAIxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,yCAAyC,IAAI,OAAO,CAInE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gCAAgC,IAAI,OAAO,CAI1D;AAED
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/runtime/constants.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAW9C;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAEzC,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAwB7C;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CA6B3C;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,IAAI,IAAI,CAE3D;AAMD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAMnD;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA2B1C;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,8BAA8B,QAAa,CAAC;AAEzD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAExD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAInD;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAezD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAIxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,yCAAyC,IAAI,OAAO,CAInE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gCAAgC,IAAI,OAAO,CAI1D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAI9C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAIlD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,MAAM,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,8BAA8B,IAAI,MAAM,CAMvD;AAKD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,CAMtD;AAQD,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD;;;GAGG;AACH,wBAAgB,mCAAmC,IAAI,MAAM,CAM5D;AASD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAMxD;AAMD,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD;;;GAGG;AACH,wBAAgB,mCAAmC,IAAI,MAAM,CAM5D;AAKD,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAMxD"}
|