@yorkie-js/react 0.7.12-rc → 0.7.13
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/yorkie-js-react.d.ts +27 -1
- package/dist/yorkie-js-react.es.js +787 -41
- package/dist/yorkie-js-react.es.js.map +1 -1
- package/dist/yorkie-js-react.js +787 -41
- package/dist/yorkie-js-react.js.map +1 -1
- package/package.json +2 -2
|
@@ -5790,7 +5790,7 @@ function createGrpcWebTransport(options) {
|
|
|
5790
5790
|
}
|
|
5791
5791
|
};
|
|
5792
5792
|
}
|
|
5793
|
-
const file_yorkie_v1_resources = /* @__PURE__ */ fileDesc("Chl5b3JraWUvdjEvcmVzb3VyY2VzLnByb3RvEgl5b3JraWUudjEirgEKCFNuYXBzaG90EiQKBHJvb3QYASABKAsyFi55b3JraWUudjEuSlNPTkVsZW1lbnQSNQoJcHJlc2VuY2VzGAIgAygLMiIueW9ya2llLnYxLlNuYXBzaG90LlByZXNlbmNlc0VudHJ5GkUKDlByZXNlbmNlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5QcmVzZW5jZToCOAEi+wEKCkNoYW5nZVBhY2sSFAoMZG9jdW1lbnRfa2V5GAEgASgJEikKCmNoZWNrcG9pbnQYAiABKAsyFS55b3JraWUudjEuQ2hlY2twb2ludBIQCghzbmFwc2hvdBgDIAEoDBIiCgdjaGFuZ2VzGAQgAygLMhEueW9ya2llLnYxLkNoYW5nZRIwChFtaW5fc3luY2VkX3RpY2tldBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYBiABKAgSMAoOdmVyc2lvbl92ZWN0b3IYByABKAsyGC55b3JraWUudjEuVmVyc2lvblZlY3RvciKYAQoGQ2hhbmdlEh8KAmlkGAEgASgLMhMueW9ya2llLnYxLkNoYW5nZUlEEg8KB21lc3NhZ2UYAiABKAkSKAoKb3BlcmF0aW9ucxgDIAMoCzIULnlvcmtpZS52MS5PcGVyYXRpb24SMgoPcHJlc2VuY2VfY2hhbmdlGAQgASgLMhkueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlIocBCghDaGFuZ2VJRBISCgpjbGllbnRfc2VxGAEgASgNEhIKCnNlcnZlcl9zZXEYAiABKAMSDwoHbGFtcG9ydBgDIAEoAxIQCghhY3Rvcl9pZBgEIAEoDBIwCg52ZXJzaW9uX3ZlY3RvchgFIAEoCzIYLnlvcmtpZS52MS5WZXJzaW9uVmVjdG9yInQKDVZlcnNpb25WZWN0b3ISNAoGdmVjdG9yGAEgAygLMiQueW9ya2llLnYxLlZlcnNpb25WZWN0b3IuVmVjdG9yRW50cnkaLQoLVmVjdG9yRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgDOgI4ASLZGgoJT3BlcmF0aW9uEicKA3NldBgBIAEoCzIYLnlvcmtpZS52MS5PcGVyYXRpb24uU2V0SAASJwoDYWRkGAIgASgLMhgueW9ya2llLnYxLk9wZXJhdGlvbi5BZGRIABIpCgRtb3ZlGAMgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5Nb3ZlSAASLQoGcmVtb3ZlGAQgASgLMhsueW9ya2llLnYxLk9wZXJhdGlvbi5SZW1vdmVIABIpCgRlZGl0GAUgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0SAASKwoFc3R5bGUYByABKAsyGi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlSAASMQoIaW5jcmVhc2UYCCABKAsyHS55b3JraWUudjEuT3BlcmF0aW9uLkluY3JlYXNlSAASMgoJdHJlZV9lZGl0GAkgASgLMh0ueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdEgAEjQKCnRyZWVfc3R5bGUYCiABKAsyHi55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVTdHlsZUgAEjIKCWFycmF5X3NldBgLIAEoCzIdLnlvcmtpZS52MS5PcGVyYXRpb24uQXJyYXlTZXRIABqdAQoDU2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSCwoDa2V5GAIgASgJEisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQawAEKA0FkZBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Ei4KD3ByZXZfY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQavwEKBE1vdmUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIuCg9wcmV2X2NyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqRAQoGUmVtb3ZlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2V4ZWN1dGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa2QMKBEVkaXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zElMKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjIueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0LkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRIPCgdjb250ZW50GAUgASgJEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSPQoKYXR0cmlidXRlcxgHIAMoCzIpLnlvcmtpZS52MS5PcGVyYXRpb24uRWRpdC5BdHRyaWJ1dGVzRW50cnkaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARrpAwoFU3R5bGUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEj4KCmF0dHJpYnV0ZXMYBCADKAsyKi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0ElQKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAYgAygLMjMueW9ya2llLnYxLk9wZXJhdGlvbi5TdHlsZS5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSHAoUYXR0cmlidXRlc190b19yZW1vdmUYByADKAkaMQoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARqkAQoISW5jcmVhc2USMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIrCgV2YWx1ZRgCIAEoCzIcLnlvcmtpZS52MS5KU09ORWxlbWVudFNpbXBsZRIqCgtleGVjdXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg0KBWFjdG9yGAQgASgJGpMDCghUcmVlRWRpdBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiAKBGZyb20YAiABKAsyEi55b3JraWUudjEuVHJlZVBvcxIeCgJ0bxgDIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zElcKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjYueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdC5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSJgoIY29udGVudHMYBSADKAsyFC55b3JraWUudjEuVHJlZU5vZGVzEhMKC3NwbGl0X2xldmVsGAcgASgFEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARrtAwoJVHJlZVN0eWxlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIAoEZnJvbRgCIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zEh4KAnRvGAMgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSQgoKYXR0cmlidXRlcxgEIAMoCzIuLnlvcmtpZS52MS5PcGVyYXRpb24uVHJlZVN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhwKFGF0dHJpYnV0ZXNfdG9fcmVtb3ZlGAYgAygJElgKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAcgAygLMjcueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlU3R5bGUuQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5GjEKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGlEKGENyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRILCgNrZXkYASABKAkSJAoFdmFsdWUYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldDoCOAEawAEKCEFycmF5U2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXRCBgoEYm9keSLFAQoRSlNPTkVsZW1lbnRTaW1wbGUSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiIKBHR5cGUYBCABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAUgASgMIp8LCgtKU09ORWxlbWVudBI4Cgtqc29uX29iamVjdBgBIAEoCzIhLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OT2JqZWN0SAASNgoKanNvbl9hcnJheRgCIAEoCzIgLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OQXJyYXlIABI1CglwcmltaXRpdmUYAyABKAsyIC55b3JraWUudjEuSlNPTkVsZW1lbnQuUHJpbWl0aXZlSAASKwoEdGV4dBgFIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UZXh0SAASMQoHY291bnRlchgGIAEoCzIeLnlvcmtpZS52MS5KU09ORWxlbWVudC5Db3VudGVySAASKwoEdHJlZRgHIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UcmVlSAAargEKCkpTT05PYmplY3QSIQoFbm9kZXMYASADKAsyEi55b3JraWUudjEuUkhUTm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQarQEKCUpTT05BcnJheRIhCgVub2RlcxgBIAMoCzISLnlvcmtpZS52MS5SR0FOb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBq9AQoJUHJpbWl0aXZlEiIKBHR5cGUYASABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAIgASgMEikKCmNyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBSABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqpAQoEVGV4dBIiCgVub2RlcxgBIAMoCzITLnlvcmtpZS52MS5UZXh0Tm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa2AEKB0NvdW50ZXISIgoEdHlwZRgBIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYAiABKAwSKQoKY3JlYXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhUKDWhsbF9yZWdpc3RlcnMYByABKAxKBAgGEAcaqQEKBFRyZWUSIgoFbm9kZXMYASADKAsyEy55b3JraWUudjEuVHJlZU5vZGUSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0QgYKBGJvZHkiPwoHUkhUTm9kZRILCgNrZXkYASABKAkSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudCLuAQoHUkdBTm9kZRIgCgRuZXh0GAEgASgLMhIueW9ya2llLnYxLlJHQU5vZGUSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudBIyChNwb3NpdGlvbl9jcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSMAoRcG9zaXRpb25fbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIyChNwb3NpdGlvbl9yZW1vdmVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQiWAoITm9kZUF0dHISDQoFdmFsdWUYASABKAkSKQoKdXBkYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYAyABKAgilAIKCFRleHROb2RlEiEKAmlkGAEgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSDQoFdmFsdWUYAiABKAkSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAQgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSNwoKYXR0cmlidXRlcxgFIAMoCzIjLnlvcmtpZS52MS5UZXh0Tm9kZS5BdHRyaWJ1dGVzRW50cnkaRgoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5Ob2RlQXR0cjoCOAEiRwoKVGV4dE5vZGVJRBIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFIrMDCghUcmVlTm9kZRIhCgJpZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEgwKBHR5cGUYAiABKAkSDQoFdmFsdWUYAyABKAkSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAUgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSKgoLaW5zX25leHRfaWQYBiABKAsyFS55b3JraWUudjEuVHJlZU5vZGVJRBINCgVkZXB0aBgHIAEoBRI3CgphdHRyaWJ1dGVzGAggAygLMiMueW9ya2llLnYxLlRyZWVOb2RlLkF0dHJpYnV0ZXNFbnRyeRIqCgttZXJnZWRfZnJvbRgJIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEigKCW1lcmdlZF9hdBgKIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GkYKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuTm9kZUF0dHI6AjgBIjEKCVRyZWVOb2RlcxIkCgdjb250ZW50GAEgAygLMhMueW9ya2llLnYxLlRyZWVOb2RlIkcKClRyZWVOb2RlSUQSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBSJjCgdUcmVlUG9zEigKCXBhcmVudF9pZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEi4KD2xlZnRfc2libGluZ19pZBgCIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEImsKBFVzZXISCgoCaWQYASABKAkSFQoNYXV0aF9wcm92aWRlchgCIAEoCRIQCgh1c2VybmFtZRgDIAEoCRIuCgpjcmVhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKJAQoGTWVtYmVyEgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSDwoHdXNlcl9pZBgDIAEoCRIQCgh1c2VybmFtZRgEIAEoCRIMCgRyb2xlGAUgASgJEi4KCmludml0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIukGCgdQcm9qZWN0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcHVibGljX2tleRgDIAEoCRISCgpzZWNyZXRfa2V5GAQgASgJEhgKEGF1dGhfd2ViaG9va191cmwYBSABKAkSHAoUYXV0aF93ZWJob29rX21ldGhvZHMYBiADKAkSIAoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGBEgASgEEiYKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgSIAEoCRImCh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYEyABKAkSJAocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgUIAEoCRIZChFldmVudF93ZWJob29rX3VybBgHIAEoCRIcChRldmVudF93ZWJob29rX2V2ZW50cxgIIAMoCRIhChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBUgASgEEicKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYFiABKAkSJwofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgXIAEoCRIlCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgYIAEoCRIjChtjbGllbnRfZGVhY3RpdmF0ZV90aHJlc2hvbGQYCSABKAkSGgoSc25hcHNob3RfdGhyZXNob2xkGBkgASgDEhkKEXNuYXBzaG90X2ludGVydmFsGBogASgDEiQKHG1heF9zdWJzY3JpYmVyc19wZXJfZG9jdW1lbnQYCiABKAUSJAocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgLIAEoBRIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYDyABKAUSGAoQcmVtb3ZlX29uX2RldGFjaBgQIAEoCBIdChVhdXRvX3JldmlzaW9uX2VuYWJsZWQYGyABKAgSFwoPYWxsb3dlZF9vcmlnaW5zGA4gAygJEi4KCmNyZWF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIi8KC01ldHJpY1BvaW50EhEKCXRpbWVzdGFtcBgBIAEoAxINCgV2YWx1ZRgCIAEoBSKjDAoWVXBkYXRhYmxlUHJvamVjdEZpZWxkcxIqCgRuYW1lGAEgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjYKEGF1dGhfd2ViaG9va191cmwYAiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSUgoUYXV0aF93ZWJob29rX21ldGhvZHMYAyABKAsyNC55b3JraWUudjEuVXBkYXRhYmxlUHJvamVjdEZpZWxkcy5BdXRoV2ViaG9va01ldGhvZHMSPgoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGAwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkQKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJECh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYDiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSQgocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgPIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChFldmVudF93ZWJob29rX3VybBgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJSChRldmVudF93ZWJob29rX2V2ZW50cxgFIAEoCzI0LnlvcmtpZS52MS5VcGRhdGFibGVQcm9qZWN0RmllbGRzLkV2ZW50V2ViaG9va0V2ZW50cxI/ChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBAgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkUKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSRQofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgSIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJDCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgTIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChJzbmFwc2hvdF90aHJlc2hvbGQYFCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZRI2ChFzbmFwc2hvdF9pbnRlcnZhbBgVIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEkEKG2NsaWVudF9kZWFjdGl2YXRlX3RocmVzaG9sZBgGIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJBChxtYXhfc3Vic2NyaWJlcnNfcGVyX2RvY3VtZW50GAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSQQocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjoKFW1heF9zaXplX3Blcl9kb2N1bWVudBgKIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjQKEHJlbW92ZV9vbl9kZXRhY2gYCyABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlEjkKFWF1dG9fcmV2aXNpb25fZW5hYmxlZBgWIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSSQoPYWxsb3dlZF9vcmlnaW5zGAkgASgLMjAueW9ya2llLnYxLlVwZGF0YWJsZVByb2plY3RGaWVsZHMuQWxsb3dlZE9yaWdpbnMaJQoSQXV0aFdlYmhvb2tNZXRob2RzEg8KB21ldGhvZHMYASADKAkaJAoSRXZlbnRXZWJob29rRXZlbnRzEg4KBmV2ZW50cxgBIAMoCRohCg5BbGxvd2VkT3JpZ2lucxIPCgdvcmlnaW5zGAEgAygJIqcDCg9Eb2N1bWVudFN1bW1hcnkSCgoCaWQYASABKAkSCwoDa2V5GAIgASgJEgwKBHJvb3QYAyABKAkSGAoQYXR0YWNoZWRfY2xpZW50cxgHIAEoBRIpCg1kb2N1bWVudF9zaXplGAggASgLMhIueW9ya2llLnYxLkRvY1NpemUSEgoKc2NoZW1hX2tleRgJIAEoCRI8CglwcmVzZW5jZXMYCiADKAsyKS55b3JraWUudjEuRG9jdW1lbnRTdW1tYXJ5LlByZXNlbmNlc0VudHJ5Ei4KCmNyZWF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC2FjY2Vzc2VkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBpFCg5QcmVzZW5jZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2U6AjgBItoBCg5QcmVzZW5jZUNoYW5nZRIyCgR0eXBlGAEgASgOMiQueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlLkNoYW5nZVR5cGUSJQoIcHJlc2VuY2UYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2UibQoKQ2hhbmdlVHlwZRIbChdDSEFOR0VfVFlQRV9VTlNQRUNJRklFRBAAEhMKD0NIQU5HRV9UWVBFX1BVVBABEhYKEkNIQU5HRV9UWVBFX0RFTEVURRACEhUKEUNIQU5HRV9UWVBFX0NMRUFSEAMiZAoIUHJlc2VuY2USKwoEZGF0YRgBIAMoCzIdLnlvcmtpZS52MS5QcmVzZW5jZS5EYXRhRW50cnkaKwoJRGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiNAoOQ2hhbm5lbFN1bW1hcnkSCwoDa2V5GAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAUiNAoKQ2hlY2twb2ludBISCgpzZXJ2ZXJfc2VxGAEgASgDEhIKCmNsaWVudF9zZXEYAiABKA0iYQoLVGV4dE5vZGVQb3MSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBRIXCg9yZWxhdGl2ZV9vZmZzZXQYAyABKAUiQgoKVGltZVRpY2tldBIPCgdsYW1wb3J0GAEgASgDEhEKCWRlbGltaXRlchgCIAEoDRIQCghhY3Rvcl9pZBgDIAEoDCIuCgxEb2NFdmVudEJvZHkSDQoFdG9waWMYASABKAkSDwoHcGF5bG9hZBgCIAEoDCJrCghEb2NFdmVudBIlCgR0eXBlGAEgASgOMhcueW9ya2llLnYxLkRvY0V2ZW50VHlwZRIRCglwdWJsaXNoZXIYAiABKAkSJQoEYm9keRgDIAEoCzIXLnlvcmtpZS52MS5Eb2NFdmVudEJvZHki1gEKDENoYW5uZWxFdmVudBIqCgR0eXBlGAEgASgOMhwueW9ya2llLnYxLkNoYW5uZWxFdmVudC5UeXBlEhEKCXB1Ymxpc2hlchgCIAEoCRIVCg1zZXNzaW9uX2NvdW50GAMgASgDEgsKA3NlcRgEIAEoAxINCgV0b3BpYxgFIAEoCRIPCgdwYXlsb2FkGAYgASgMIkMKBFR5cGUSFAoQVFlQRV9VTlNQRUNJRklFRBAAEhEKDVRZUEVfUFJFU0VOQ0UQARISCg5UWVBFX0JST0FEQ0FTVBACIiYKCERhdGFTaXplEgwKBGRhdGEYASABKAUSDAoEbWV0YRgCIAEoBSJNCgdEb2NTaXplEiEKBGxpdmUYASABKAsyEy55b3JraWUudjEuRGF0YVNpemUSHwoCZ2MYAiABKAsyEy55b3JraWUudjEuRGF0YVNpemUikQEKBlNjaGVtYRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAUSDAoEYm9keRgEIAEoCRIeCgVydWxlcxgFIAMoCzIPLnlvcmtpZS52MS5SdWxlEi4KCmNyZWF0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIlAKDFRyZWVOb2RlUnVsZRIRCglub2RlX3R5cGUYASABKAkSDwoHY29udGVudBgCIAEoCRINCgVtYXJrcxgDIAEoCRINCgVncm91cBgEIAEoCSJPCgRSdWxlEgwKBHBhdGgYASABKAkSDAoEdHlwZRgCIAEoCRIrCgp0cmVlX25vZGVzGAMgAygLMhcueW9ya2llLnYxLlRyZWVOb2RlUnVsZSKDAQoPUmV2aXNpb25TdW1tYXJ5EgoKAmlkGAEgASgJEg0KBWxhYmVsGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEhAKCHNuYXBzaG90GAQgASgJEi4KCmNyZWF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wKvwCCglWYWx1ZVR5cGUSEwoPVkFMVUVfVFlQRV9OVUxMEAASFgoSVkFMVUVfVFlQRV9CT09MRUFOEAESFgoSVkFMVUVfVFlQRV9JTlRFR0VSEAISEwoPVkFMVUVfVFlQRV9MT05HEAMSFQoRVkFMVUVfVFlQRV9ET1VCTEUQBBIVChFWQUxVRV9UWVBFX1NUUklORxAFEhQKEFZBTFVFX1RZUEVfQllURVMQBhITCg9WQUxVRV9UWVBFX0RBVEUQBxIaChZWQUxVRV9UWVBFX0pTT05fT0JKRUNUEAgSGQoVVkFMVUVfVFlQRV9KU09OX0FSUkFZEAkSEwoPVkFMVUVfVFlQRV9URVhUEAoSGgoWVkFMVUVfVFlQRV9JTlRFR0VSX0NOVBALEhcKE1ZBTFVFX1RZUEVfTE9OR19DTlQQDBITCg9WQUxVRV9UWVBFX1RSRUUQDRIgChxWQUxVRV9UWVBFX0lOVEVHRVJfREVEVVBfQ05UEA4iBAgPEA8qpgEKDERvY0V2ZW50VHlwZRIjCh9ET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9DSEFOR0VEEAASIwofRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfV0FUQ0hFRBABEiUKIURPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX1VOV0FUQ0hFRBACEiUKIURPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX0JST0FEQ0FTVBADQkUKEWRldi55b3JraWUuYXBpLnYxUAFaLmdpdGh1Yi5jb20veW9ya2llLXRlYW0veW9ya2llL2FwaS95b3JraWUvdjE7djFiBnByb3RvMw", [file_google_protobuf_timestamp, file_google_protobuf_wrappers]);
|
|
5793
|
+
const file_yorkie_v1_resources = /* @__PURE__ */ fileDesc("Chl5b3JraWUvdjEvcmVzb3VyY2VzLnByb3RvEgl5b3JraWUudjEirgEKCFNuYXBzaG90EiQKBHJvb3QYASABKAsyFi55b3JraWUudjEuSlNPTkVsZW1lbnQSNQoJcHJlc2VuY2VzGAIgAygLMiIueW9ya2llLnYxLlNuYXBzaG90LlByZXNlbmNlc0VudHJ5GkUKDlByZXNlbmNlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5QcmVzZW5jZToCOAEi+wEKCkNoYW5nZVBhY2sSFAoMZG9jdW1lbnRfa2V5GAEgASgJEikKCmNoZWNrcG9pbnQYAiABKAsyFS55b3JraWUudjEuQ2hlY2twb2ludBIQCghzbmFwc2hvdBgDIAEoDBIiCgdjaGFuZ2VzGAQgAygLMhEueW9ya2llLnYxLkNoYW5nZRIwChFtaW5fc3luY2VkX3RpY2tldBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYBiABKAgSMAoOdmVyc2lvbl92ZWN0b3IYByABKAsyGC55b3JraWUudjEuVmVyc2lvblZlY3RvciKYAQoGQ2hhbmdlEh8KAmlkGAEgASgLMhMueW9ya2llLnYxLkNoYW5nZUlEEg8KB21lc3NhZ2UYAiABKAkSKAoKb3BlcmF0aW9ucxgDIAMoCzIULnlvcmtpZS52MS5PcGVyYXRpb24SMgoPcHJlc2VuY2VfY2hhbmdlGAQgASgLMhkueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlIocBCghDaGFuZ2VJRBISCgpjbGllbnRfc2VxGAEgASgNEhIKCnNlcnZlcl9zZXEYAiABKAMSDwoHbGFtcG9ydBgDIAEoAxIQCghhY3Rvcl9pZBgEIAEoDBIwCg52ZXJzaW9uX3ZlY3RvchgFIAEoCzIYLnlvcmtpZS52MS5WZXJzaW9uVmVjdG9yInQKDVZlcnNpb25WZWN0b3ISNAoGdmVjdG9yGAEgAygLMiQueW9ya2llLnYxLlZlcnNpb25WZWN0b3IuVmVjdG9yRW50cnkaLQoLVmVjdG9yRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgDOgI4ASLpGwoJT3BlcmF0aW9uEicKA3NldBgBIAEoCzIYLnlvcmtpZS52MS5PcGVyYXRpb24uU2V0SAASJwoDYWRkGAIgASgLMhgueW9ya2llLnYxLk9wZXJhdGlvbi5BZGRIABIpCgRtb3ZlGAMgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5Nb3ZlSAASLQoGcmVtb3ZlGAQgASgLMhsueW9ya2llLnYxLk9wZXJhdGlvbi5SZW1vdmVIABIpCgRlZGl0GAUgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0SAASKwoFc3R5bGUYByABKAsyGi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlSAASMQoIaW5jcmVhc2UYCCABKAsyHS55b3JraWUudjEuT3BlcmF0aW9uLkluY3JlYXNlSAASMgoJdHJlZV9lZGl0GAkgASgLMh0ueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdEgAEjQKCnRyZWVfc3R5bGUYCiABKAsyHi55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVTdHlsZUgAEjIKCWFycmF5X3NldBgLIAEoCzIdLnlvcmtpZS52MS5PcGVyYXRpb24uQXJyYXlTZXRIABqdAQoDU2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSCwoDa2V5GAIgASgJEisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQawAEKA0FkZBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Ei4KD3ByZXZfY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQavwEKBE1vdmUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIuCg9wcmV2X2NyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqRAQoGUmVtb3ZlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2V4ZWN1dGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa6QQKBEVkaXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zElMKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjIueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0LkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRIPCgdjb250ZW50GAUgASgJEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSPQoKYXR0cmlidXRlcxgHIAMoCzIpLnlvcmtpZS52MS5PcGVyYXRpb24uRWRpdC5BdHRyaWJ1dGVzRW50cnkSLQoNcmVzdG9yZV9zcGFucxgIIAMoCzIWLnlvcmtpZS52MS5SZXN0b3JlU3BhbhIsCgxyZXN0b3JlX21vZGUYCSABKA4yFi55b3JraWUudjEuUmVzdG9yZU1vZGUSMQoRcmV0b21ic3RvbmVfc3BhbnMYCiADKAsyFi55b3JraWUudjEuUmVzdG9yZVNwYW4aUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARrpAwoFU3R5bGUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEj4KCmF0dHJpYnV0ZXMYBCADKAsyKi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0ElQKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAYgAygLMjMueW9ya2llLnYxLk9wZXJhdGlvbi5TdHlsZS5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSHAoUYXR0cmlidXRlc190b19yZW1vdmUYByADKAkaMQoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARqkAQoISW5jcmVhc2USMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIrCgV2YWx1ZRgCIAEoCzIcLnlvcmtpZS52MS5KU09ORWxlbWVudFNpbXBsZRIqCgtleGVjdXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg0KBWFjdG9yGAQgASgJGpMDCghUcmVlRWRpdBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiAKBGZyb20YAiABKAsyEi55b3JraWUudjEuVHJlZVBvcxIeCgJ0bxgDIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zElcKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjYueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdC5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSJgoIY29udGVudHMYBSADKAsyFC55b3JraWUudjEuVHJlZU5vZGVzEhMKC3NwbGl0X2xldmVsGAcgASgFEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARrtAwoJVHJlZVN0eWxlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIAoEZnJvbRgCIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zEh4KAnRvGAMgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSQgoKYXR0cmlidXRlcxgEIAMoCzIuLnlvcmtpZS52MS5PcGVyYXRpb24uVHJlZVN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhwKFGF0dHJpYnV0ZXNfdG9fcmVtb3ZlGAYgAygJElgKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAcgAygLMjcueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlU3R5bGUuQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5GjEKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGlEKGENyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRILCgNrZXkYASABKAkSJAoFdmFsdWUYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldDoCOAEawAEKCEFycmF5U2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXRCBgoEYm9keSLFAQoRSlNPTkVsZW1lbnRTaW1wbGUSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiIKBHR5cGUYBCABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAUgASgMIp8LCgtKU09ORWxlbWVudBI4Cgtqc29uX29iamVjdBgBIAEoCzIhLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OT2JqZWN0SAASNgoKanNvbl9hcnJheRgCIAEoCzIgLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OQXJyYXlIABI1CglwcmltaXRpdmUYAyABKAsyIC55b3JraWUudjEuSlNPTkVsZW1lbnQuUHJpbWl0aXZlSAASKwoEdGV4dBgFIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UZXh0SAASMQoHY291bnRlchgGIAEoCzIeLnlvcmtpZS52MS5KU09ORWxlbWVudC5Db3VudGVySAASKwoEdHJlZRgHIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UcmVlSAAargEKCkpTT05PYmplY3QSIQoFbm9kZXMYASADKAsyEi55b3JraWUudjEuUkhUTm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQarQEKCUpTT05BcnJheRIhCgVub2RlcxgBIAMoCzISLnlvcmtpZS52MS5SR0FOb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBq9AQoJUHJpbWl0aXZlEiIKBHR5cGUYASABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAIgASgMEikKCmNyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBSABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqpAQoEVGV4dBIiCgVub2RlcxgBIAMoCzITLnlvcmtpZS52MS5UZXh0Tm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa2AEKB0NvdW50ZXISIgoEdHlwZRgBIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYAiABKAwSKQoKY3JlYXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhUKDWhsbF9yZWdpc3RlcnMYByABKAxKBAgGEAcaqQEKBFRyZWUSIgoFbm9kZXMYASADKAsyEy55b3JraWUudjEuVHJlZU5vZGUSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0QgYKBGJvZHkiPwoHUkhUTm9kZRILCgNrZXkYASABKAkSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudCLuAQoHUkdBTm9kZRIgCgRuZXh0GAEgASgLMhIueW9ya2llLnYxLlJHQU5vZGUSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudBIyChNwb3NpdGlvbl9jcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSMAoRcG9zaXRpb25fbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIyChNwb3NpdGlvbl9yZW1vdmVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQiWAoITm9kZUF0dHISDQoFdmFsdWUYASABKAkSKQoKdXBkYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYAyABKAgilAIKCFRleHROb2RlEiEKAmlkGAEgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSDQoFdmFsdWUYAiABKAkSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAQgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSNwoKYXR0cmlidXRlcxgFIAMoCzIjLnlvcmtpZS52MS5UZXh0Tm9kZS5BdHRyaWJ1dGVzRW50cnkaRgoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5Ob2RlQXR0cjoCOAEiRwoKVGV4dE5vZGVJRBIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFIrMDCghUcmVlTm9kZRIhCgJpZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEgwKBHR5cGUYAiABKAkSDQoFdmFsdWUYAyABKAkSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAUgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSKgoLaW5zX25leHRfaWQYBiABKAsyFS55b3JraWUudjEuVHJlZU5vZGVJRBINCgVkZXB0aBgHIAEoBRI3CgphdHRyaWJ1dGVzGAggAygLMiMueW9ya2llLnYxLlRyZWVOb2RlLkF0dHJpYnV0ZXNFbnRyeRIqCgttZXJnZWRfZnJvbRgJIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEigKCW1lcmdlZF9hdBgKIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GkYKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuTm9kZUF0dHI6AjgBIjEKCVRyZWVOb2RlcxIkCgdjb250ZW50GAEgAygLMhMueW9ya2llLnYxLlRyZWVOb2RlIkcKClRyZWVOb2RlSUQSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBSJjCgdUcmVlUG9zEigKCXBhcmVudF9pZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEi4KD2xlZnRfc2libGluZ19pZBgCIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEImsKBFVzZXISCgoCaWQYASABKAkSFQoNYXV0aF9wcm92aWRlchgCIAEoCRIQCgh1c2VybmFtZRgDIAEoCRIuCgpjcmVhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKJAQoGTWVtYmVyEgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSDwoHdXNlcl9pZBgDIAEoCRIQCgh1c2VybmFtZRgEIAEoCRIMCgRyb2xlGAUgASgJEi4KCmludml0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIukGCgdQcm9qZWN0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcHVibGljX2tleRgDIAEoCRISCgpzZWNyZXRfa2V5GAQgASgJEhgKEGF1dGhfd2ViaG9va191cmwYBSABKAkSHAoUYXV0aF93ZWJob29rX21ldGhvZHMYBiADKAkSIAoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGBEgASgEEiYKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgSIAEoCRImCh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYEyABKAkSJAocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgUIAEoCRIZChFldmVudF93ZWJob29rX3VybBgHIAEoCRIcChRldmVudF93ZWJob29rX2V2ZW50cxgIIAMoCRIhChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBUgASgEEicKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYFiABKAkSJwofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgXIAEoCRIlCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgYIAEoCRIjChtjbGllbnRfZGVhY3RpdmF0ZV90aHJlc2hvbGQYCSABKAkSGgoSc25hcHNob3RfdGhyZXNob2xkGBkgASgDEhkKEXNuYXBzaG90X2ludGVydmFsGBogASgDEiQKHG1heF9zdWJzY3JpYmVyc19wZXJfZG9jdW1lbnQYCiABKAUSJAocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgLIAEoBRIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYDyABKAUSGAoQcmVtb3ZlX29uX2RldGFjaBgQIAEoCBIdChVhdXRvX3JldmlzaW9uX2VuYWJsZWQYGyABKAgSFwoPYWxsb3dlZF9vcmlnaW5zGA4gAygJEi4KCmNyZWF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIi8KC01ldHJpY1BvaW50EhEKCXRpbWVzdGFtcBgBIAEoAxINCgV2YWx1ZRgCIAEoBSKjDAoWVXBkYXRhYmxlUHJvamVjdEZpZWxkcxIqCgRuYW1lGAEgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjYKEGF1dGhfd2ViaG9va191cmwYAiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSUgoUYXV0aF93ZWJob29rX21ldGhvZHMYAyABKAsyNC55b3JraWUudjEuVXBkYXRhYmxlUHJvamVjdEZpZWxkcy5BdXRoV2ViaG9va01ldGhvZHMSPgoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGAwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkQKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJECh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYDiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSQgocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgPIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChFldmVudF93ZWJob29rX3VybBgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJSChRldmVudF93ZWJob29rX2V2ZW50cxgFIAEoCzI0LnlvcmtpZS52MS5VcGRhdGFibGVQcm9qZWN0RmllbGRzLkV2ZW50V2ViaG9va0V2ZW50cxI/ChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBAgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkUKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSRQofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgSIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJDCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgTIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChJzbmFwc2hvdF90aHJlc2hvbGQYFCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZRI2ChFzbmFwc2hvdF9pbnRlcnZhbBgVIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEkEKG2NsaWVudF9kZWFjdGl2YXRlX3RocmVzaG9sZBgGIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJBChxtYXhfc3Vic2NyaWJlcnNfcGVyX2RvY3VtZW50GAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSQQocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjoKFW1heF9zaXplX3Blcl9kb2N1bWVudBgKIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjQKEHJlbW92ZV9vbl9kZXRhY2gYCyABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlEjkKFWF1dG9fcmV2aXNpb25fZW5hYmxlZBgWIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSSQoPYWxsb3dlZF9vcmlnaW5zGAkgASgLMjAueW9ya2llLnYxLlVwZGF0YWJsZVByb2plY3RGaWVsZHMuQWxsb3dlZE9yaWdpbnMaJQoSQXV0aFdlYmhvb2tNZXRob2RzEg8KB21ldGhvZHMYASADKAkaJAoSRXZlbnRXZWJob29rRXZlbnRzEg4KBmV2ZW50cxgBIAMoCRohCg5BbGxvd2VkT3JpZ2lucxIPCgdvcmlnaW5zGAEgAygJIqcDCg9Eb2N1bWVudFN1bW1hcnkSCgoCaWQYASABKAkSCwoDa2V5GAIgASgJEgwKBHJvb3QYAyABKAkSGAoQYXR0YWNoZWRfY2xpZW50cxgHIAEoBRIpCg1kb2N1bWVudF9zaXplGAggASgLMhIueW9ya2llLnYxLkRvY1NpemUSEgoKc2NoZW1hX2tleRgJIAEoCRI8CglwcmVzZW5jZXMYCiADKAsyKS55b3JraWUudjEuRG9jdW1lbnRTdW1tYXJ5LlByZXNlbmNlc0VudHJ5Ei4KCmNyZWF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC2FjY2Vzc2VkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBpFCg5QcmVzZW5jZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2U6AjgBItoBCg5QcmVzZW5jZUNoYW5nZRIyCgR0eXBlGAEgASgOMiQueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlLkNoYW5nZVR5cGUSJQoIcHJlc2VuY2UYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2UibQoKQ2hhbmdlVHlwZRIbChdDSEFOR0VfVFlQRV9VTlNQRUNJRklFRBAAEhMKD0NIQU5HRV9UWVBFX1BVVBABEhYKEkNIQU5HRV9UWVBFX0RFTEVURRACEhUKEUNIQU5HRV9UWVBFX0NMRUFSEAMiZAoIUHJlc2VuY2USKwoEZGF0YRgBIAMoCzIdLnlvcmtpZS52MS5QcmVzZW5jZS5EYXRhRW50cnkaKwoJRGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiNAoOQ2hhbm5lbFN1bW1hcnkSCwoDa2V5GAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAUiNAoKQ2hlY2twb2ludBISCgpzZXJ2ZXJfc2VxGAEgASgDEhIKCmNsaWVudF9zZXEYAiABKA0iYQoLVGV4dE5vZGVQb3MSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBRIXCg9yZWxhdGl2ZV9vZmZzZXQYAyABKAUi1AEKC1Jlc3RvcmVTcGFuEikKCmNyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBINCgVzdGFydBgCIAEoBRILCgNlbmQYAyABKAUSDwoHY29udGVudBgEIAEoCRI6CgphdHRyaWJ1dGVzGAUgAygLMiYueW9ya2llLnYxLlJlc3RvcmVTcGFuLkF0dHJpYnV0ZXNFbnRyeRoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJCCgpUaW1lVGlja2V0Eg8KB2xhbXBvcnQYASABKAMSEQoJZGVsaW1pdGVyGAIgASgNEhAKCGFjdG9yX2lkGAMgASgMIi4KDERvY0V2ZW50Qm9keRINCgV0b3BpYxgBIAEoCRIPCgdwYXlsb2FkGAIgASgMImsKCERvY0V2ZW50EiUKBHR5cGUYASABKA4yFy55b3JraWUudjEuRG9jRXZlbnRUeXBlEhEKCXB1Ymxpc2hlchgCIAEoCRIlCgRib2R5GAMgASgLMhcueW9ya2llLnYxLkRvY0V2ZW50Qm9keSLWAQoMQ2hhbm5lbEV2ZW50EioKBHR5cGUYASABKA4yHC55b3JraWUudjEuQ2hhbm5lbEV2ZW50LlR5cGUSEQoJcHVibGlzaGVyGAIgASgJEhUKDXNlc3Npb25fY291bnQYAyABKAMSCwoDc2VxGAQgASgDEg0KBXRvcGljGAUgASgJEg8KB3BheWxvYWQYBiABKAwiQwoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASEQoNVFlQRV9QUkVTRU5DRRABEhIKDlRZUEVfQlJPQURDQVNUEAIiJgoIRGF0YVNpemUSDAoEZGF0YRgBIAEoBRIMCgRtZXRhGAIgASgFIk0KB0RvY1NpemUSIQoEbGl2ZRgBIAEoCzITLnlvcmtpZS52MS5EYXRhU2l6ZRIfCgJnYxgCIAEoCzITLnlvcmtpZS52MS5EYXRhU2l6ZSKRAQoGU2NoZW1hEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDwoHdmVyc2lvbhgDIAEoBRIMCgRib2R5GAQgASgJEh4KBXJ1bGVzGAUgAygLMg8ueW9ya2llLnYxLlJ1bGUSLgoKY3JlYXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiUAoMVHJlZU5vZGVSdWxlEhEKCW5vZGVfdHlwZRgBIAEoCRIPCgdjb250ZW50GAIgASgJEg0KBW1hcmtzGAMgASgJEg0KBWdyb3VwGAQgASgJIk8KBFJ1bGUSDAoEcGF0aBgBIAEoCRIMCgR0eXBlGAIgASgJEisKCnRyZWVfbm9kZXMYAyADKAsyFy55b3JraWUudjEuVHJlZU5vZGVSdWxlIoMBCg9SZXZpc2lvblN1bW1hcnkSCgoCaWQYASABKAkSDQoFbGFiZWwYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSEAoIc25hcHNob3QYBCABKAkSLgoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAqYwoLUmVzdG9yZU1vZGUSHAoYUkVTVE9SRV9NT0RFX1VOU1BFQ0lGSUVEEAASGAoUUkVTVE9SRV9NT0RFX1JFU1RPUkUQARIcChhSRVNUT1JFX01PREVfUkVUT01CU1RPTkUQAir8AgoJVmFsdWVUeXBlEhMKD1ZBTFVFX1RZUEVfTlVMTBAAEhYKElZBTFVFX1RZUEVfQk9PTEVBThABEhYKElZBTFVFX1RZUEVfSU5URUdFUhACEhMKD1ZBTFVFX1RZUEVfTE9ORxADEhUKEVZBTFVFX1RZUEVfRE9VQkxFEAQSFQoRVkFMVUVfVFlQRV9TVFJJTkcQBRIUChBWQUxVRV9UWVBFX0JZVEVTEAYSEwoPVkFMVUVfVFlQRV9EQVRFEAcSGgoWVkFMVUVfVFlQRV9KU09OX09CSkVDVBAIEhkKFVZBTFVFX1RZUEVfSlNPTl9BUlJBWRAJEhMKD1ZBTFVFX1RZUEVfVEVYVBAKEhoKFlZBTFVFX1RZUEVfSU5URUdFUl9DTlQQCxIXChNWQUxVRV9UWVBFX0xPTkdfQ05UEAwSEwoPVkFMVUVfVFlQRV9UUkVFEA0SIAocVkFMVUVfVFlQRV9JTlRFR0VSX0RFRFVQX0NOVBAOIgQIDxAPKqYBCgxEb2NFdmVudFR5cGUSIwofRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfQ0hBTkdFRBAAEiMKH0RPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX1dBVENIRUQQARIlCiFET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9VTldBVENIRUQQAhIlCiFET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9CUk9BRENBU1QQA0JFChFkZXYueW9ya2llLmFwaS52MVABWi5naXRodWIuY29tL3lvcmtpZS10ZWFtL3lvcmtpZS9hcGkveW9ya2llL3YxO3YxYgZwcm90bzM", [file_google_protobuf_timestamp, file_google_protobuf_wrappers]);
|
|
5794
5794
|
const SnapshotSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 0);
|
|
5795
5795
|
const ChangePackSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 1);
|
|
5796
5796
|
const ChangeSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 2);
|
|
@@ -5835,13 +5835,20 @@ var PresenceChange_ChangeType = /* @__PURE__ */ ((PresenceChange_ChangeType2) =>
|
|
|
5835
5835
|
const PresenceSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 24);
|
|
5836
5836
|
const CheckpointSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 26);
|
|
5837
5837
|
const TextNodePosSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 27);
|
|
5838
|
-
const
|
|
5838
|
+
const RestoreSpanSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 28);
|
|
5839
|
+
const TimeTicketSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 29);
|
|
5839
5840
|
var ChannelEvent_Type = /* @__PURE__ */ ((ChannelEvent_Type2) => {
|
|
5840
5841
|
ChannelEvent_Type2[ChannelEvent_Type2["UNSPECIFIED"] = 0] = "UNSPECIFIED";
|
|
5841
5842
|
ChannelEvent_Type2[ChannelEvent_Type2["PRESENCE"] = 1] = "PRESENCE";
|
|
5842
5843
|
ChannelEvent_Type2[ChannelEvent_Type2["BROADCAST"] = 2] = "BROADCAST";
|
|
5843
5844
|
return ChannelEvent_Type2;
|
|
5844
5845
|
})(ChannelEvent_Type || {});
|
|
5846
|
+
var RestoreMode = /* @__PURE__ */ ((RestoreMode2) => {
|
|
5847
|
+
RestoreMode2[RestoreMode2["UNSPECIFIED"] = 0] = "UNSPECIFIED";
|
|
5848
|
+
RestoreMode2[RestoreMode2["RESTORE"] = 1] = "RESTORE";
|
|
5849
|
+
RestoreMode2[RestoreMode2["RETOMBSTONE"] = 2] = "RETOMBSTONE";
|
|
5850
|
+
return RestoreMode2;
|
|
5851
|
+
})(RestoreMode || {});
|
|
5845
5852
|
var ValueType = /* @__PURE__ */ ((ValueType2) => {
|
|
5846
5853
|
ValueType2[ValueType2["NULL"] = 0] = "NULL";
|
|
5847
5854
|
ValueType2[ValueType2["BOOLEAN"] = 1] = "BOOLEAN";
|
|
@@ -5867,7 +5874,7 @@ var DocEventType$1 = /* @__PURE__ */ ((DocEventType2) => {
|
|
|
5867
5874
|
DocEventType2[DocEventType2["DOCUMENT_BROADCAST"] = 3] = "DOCUMENT_BROADCAST";
|
|
5868
5875
|
return DocEventType2;
|
|
5869
5876
|
})(DocEventType$1 || {});
|
|
5870
|
-
const file_yorkie_v1_yorkie = /* @__PURE__ */ fileDesc("
|
|
5877
|
+
const file_yorkie_v1_yorkie = /* @__PURE__ */ fileDesc("ChZ5b3JraWUvdjEveW9ya2llLnByb3RvEgl5b3JraWUudjEingEKFUFjdGl2YXRlQ2xpZW50UmVxdWVzdBISCgpjbGllbnRfa2V5GAEgASgJEkAKCG1ldGFkYXRhGAIgAygLMi4ueW9ya2llLnYxLkFjdGl2YXRlQ2xpZW50UmVxdWVzdC5NZXRhZGF0YUVudHJ5Gi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIrChZBY3RpdmF0ZUNsaWVudFJlc3BvbnNlEhEKCWNsaWVudF9pZBgBIAEoCSJBChdEZWFjdGl2YXRlQ2xpZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLc3luY2hyb25vdXMYAiABKAgiGgoYRGVhY3RpdmF0ZUNsaWVudFJlc3BvbnNlIpgBChVBdHRhY2hEb2N1bWVudFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEioKC2NoYW5nZV9wYWNrGAIgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sSEgoKc2NoZW1hX2tleRgDIAEoCRISCgpkaXNhYmxlX2djGAQgASgIEhgKEGRpc2FibGVfcHJlc2VuY2UYBSABKAgiuQEKFkF0dGFjaERvY3VtZW50UmVzcG9uc2USEwoLZG9jdW1lbnRfaWQYASABKAkSKgoLY2hhbmdlX3BhY2sYAiABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYAyABKAUSJQoMc2NoZW1hX3J1bGVzGAQgAygLMg8ueW9ya2llLnYxLlJ1bGUSGAoQZGlzYWJsZV9wcmVzZW5jZRgFIAEoCCKLAQoVRGV0YWNoRG9jdW1lbnRSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRIqCgtjaGFuZ2VfcGFjaxgDIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrEh4KFnJlbW92ZV9pZl9ub3RfYXR0YWNoZWQYBCABKAgiRAoWRGV0YWNoRG9jdW1lbnRSZXNwb25zZRIqCgtjaGFuZ2VfcGFjaxgCIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrIlMKDFdhdGNoUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSMAoJcmVzb3VyY2VzGAIgAygLMh0ueW9ya2llLnYxLlJlc291cmNlRGVzY3JpcHRvciKEAQoSUmVzb3VyY2VEZXNjcmlwdG9yEjEKCGRvY3VtZW50GAEgASgLMh0ueW9ya2llLnYxLkRvY3VtZW50RGVzY3JpcHRvckgAEi8KB2NoYW5uZWwYAiABKAsyHC55b3JraWUudjEuQ2hhbm5lbERlc2NyaXB0b3JIAEIKCghyZXNvdXJjZSIpChJEb2N1bWVudERlc2NyaXB0b3ISEwoLZG9jdW1lbnRfaWQYASABKAkiKAoRQ2hhbm5lbERlc2NyaXB0b3ISEwoLY2hhbm5lbF9rZXkYASABKAkieQoNV2F0Y2hSZXNwb25zZRI4Cg5pbml0aWFsaXphdGlvbhgBIAEoCzIeLnlvcmtpZS52MS5XYXRjaEluaXRpYWxpemF0aW9uSAASJgoFZXZlbnQYAiABKAsyFS55b3JraWUudjEuV2F0Y2hFdmVudEgAQgYKBGJvZHkiRgoTV2F0Y2hJbml0aWFsaXphdGlvbhIvCg5yZXNvdXJjZV9pbml0cxgBIAMoCzIXLnlvcmtpZS52MS5SZXNvdXJjZUluaXQieAoMUmVzb3VyY2VJbml0EjAKDWRvY3VtZW50X2luaXQYASABKAsyFy55b3JraWUudjEuRG9jdW1lbnRJbml0SAASLgoMY2hhbm5lbF9pbml0GAIgASgLMhYueW9ya2llLnYxLkNoYW5uZWxJbml0SABCBgoEaW5pdCI3CgxEb2N1bWVudEluaXQSEwoLZG9jdW1lbnRfaWQYASABKAkSEgoKY2xpZW50X2lkcxgCIAMoCSJGCgtDaGFubmVsSW5pdBITCgtjaGFubmVsX2tleRgBIAEoCRIVCg1zZXNzaW9uX2NvdW50GAIgASgDEgsKA3NlcRgDIAEoAyJ7CgpXYXRjaEV2ZW50Ei0KCWRvY19ldmVudBgBIAEoCzIYLnlvcmtpZS52MS5Eb2NXYXRjaEV2ZW50SAASNQoNY2hhbm5lbF9ldmVudBgCIAEoCzIcLnlvcmtpZS52MS5DaGFubmVsV2F0Y2hFdmVudEgAQgcKBWV2ZW50IkgKDURvY1dhdGNoRXZlbnQSEwoLZG9jdW1lbnRfaWQYASABKAkSIgoFZXZlbnQYAiABKAsyEy55b3JraWUudjEuRG9jRXZlbnQiUAoRQ2hhbm5lbFdhdGNoRXZlbnQSEwoLY2hhbm5lbF9rZXkYASABKAkSJgoFZXZlbnQYAiABKAsyFy55b3JraWUudjEuQ2hhbm5lbEV2ZW50Ij4KFFdhdGNoRG9jdW1lbnRSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCSK2AQoVV2F0Y2hEb2N1bWVudFJlc3BvbnNlEkkKDmluaXRpYWxpemF0aW9uGAEgASgLMi8ueW9ya2llLnYxLldhdGNoRG9jdW1lbnRSZXNwb25zZS5Jbml0aWFsaXphdGlvbkgAEiQKBWV2ZW50GAIgASgLMhMueW9ya2llLnYxLkRvY0V2ZW50SAAaJAoOSW5pdGlhbGl6YXRpb24SEgoKY2xpZW50X2lkcxgBIAMoCUIGCgRib2R5Ij0KE1dhdGNoQ2hhbm5lbFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJIoMBChRXYXRjaENoYW5uZWxSZXNwb25zZRI5Cgtpbml0aWFsaXplZBgBIAEoCzIiLnlvcmtpZS52MS5XYXRjaENoYW5uZWxJbml0aWFsaXplZEgAEigKBWV2ZW50GAIgASgLMhcueW9ya2llLnYxLkNoYW5uZWxFdmVudEgAQgYKBGJvZHkiPQoXV2F0Y2hDaGFubmVsSW5pdGlhbGl6ZWQSFQoNc2Vzc2lvbl9jb3VudBgBIAEoAxILCgNzZXEYAiABKAMiawoVUmVtb3ZlRG9jdW1lbnRSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRIqCgtjaGFuZ2VfcGFjaxgDIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrIkQKFlJlbW92ZURvY3VtZW50UmVzcG9uc2USKgoLY2hhbmdlX3BhY2sYASABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjayKTAQoWUHVzaFB1bGxDaGFuZ2VzUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSKgoLY2hhbmdlX3BhY2sYAyABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxIRCglwdXNoX29ubHkYBCABKAgSEgoKZGlzYWJsZV9nYxgFIAEoCCJFChdQdXNoUHVsbENoYW5nZXNSZXNwb25zZRIqCgtjaGFuZ2VfcGFjaxgBIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrImMKFUNyZWF0ZVJldmlzaW9uUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSDQoFbGFiZWwYAyABKAkSEwoLZGVzY3JpcHRpb24YBCABKAkiRgoWQ3JlYXRlUmV2aXNpb25SZXNwb25zZRIsCghyZXZpc2lvbhgBIAEoCzIaLnlvcmtpZS52MS5SZXZpc2lvblN1bW1hcnkiUQoSR2V0UmV2aXNpb25SZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRITCgtyZXZpc2lvbl9pZBgDIAEoCSJDChNHZXRSZXZpc2lvblJlc3BvbnNlEiwKCHJldmlzaW9uGAEgASgLMhoueW9ya2llLnYxLlJldmlzaW9uU3VtbWFyeSJ1ChRMaXN0UmV2aXNpb25zUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSEQoJcGFnZV9zaXplGAMgASgFEg4KBm9mZnNldBgEIAEoBRISCgppc19mb3J3YXJkGAUgASgIIkYKFUxpc3RSZXZpc2lvbnNSZXNwb25zZRItCglyZXZpc2lvbnMYASADKAsyGi55b3JraWUudjEuUmV2aXNpb25TdW1tYXJ5IlUKFlJlc3RvcmVSZXZpc2lvblJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEhMKC3JldmlzaW9uX2lkGAQgASgJIhkKF1Jlc3RvcmVSZXZpc2lvblJlc3BvbnNlIj4KFEF0dGFjaENoYW5uZWxSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtjaGFubmVsX2tleRgCIAEoCSJCChVBdHRhY2hDaGFubmVsUmVzcG9uc2USEgoKc2Vzc2lvbl9pZBgBIAEoCRIVCg1zZXNzaW9uX2NvdW50GAIgASgDIlIKFERldGFjaENoYW5uZWxSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtjaGFubmVsX2tleRgCIAEoCRISCgpzZXNzaW9uX2lkGAMgASgJIi4KFURldGFjaENoYW5uZWxSZXNwb25zZRIVCg1zZXNzaW9uX2NvdW50GAEgASgDItoBChVSZWZyZXNoQ2hhbm5lbFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJEhIKCnNlc3Npb25faWQYAyABKAkSEgoKY2xpZW50X2tleRgEIAEoCRJACghtZXRhZGF0YRgFIAMoCzIuLnlvcmtpZS52MS5SZWZyZXNoQ2hhbm5lbFJlcXVlc3QuTWV0YWRhdGFFbnRyeRovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiVgoWUmVmcmVzaENoYW5uZWxSZXNwb25zZRIVCg1zZXNzaW9uX2NvdW50GAEgASgDEhEKCWNsaWVudF9pZBgCIAEoCRISCgpzZXNzaW9uX2lkGAMgASgJIikKElBlZWtDaGFubmVsUmVxdWVzdBITCgtjaGFubmVsX2tleRgBIAEoCSIsChNQZWVrQ2hhbm5lbFJlc3BvbnNlEhUKDXNlc3Npb25fY291bnQYASABKAMiWgoQQnJvYWRjYXN0UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLY2hhbm5lbF9rZXkYAiABKAkSDQoFdG9waWMYAyABKAkSDwoHcGF5bG9hZBgEIAEoDCITChFCcm9hZGNhc3RSZXNwb25zZTKVDAoNWW9ya2llU2VydmljZRJXCg5BY3RpdmF0ZUNsaWVudBIgLnlvcmtpZS52MS5BY3RpdmF0ZUNsaWVudFJlcXVlc3QaIS55b3JraWUudjEuQWN0aXZhdGVDbGllbnRSZXNwb25zZSIAEl0KEERlYWN0aXZhdGVDbGllbnQSIi55b3JraWUudjEuRGVhY3RpdmF0ZUNsaWVudFJlcXVlc3QaIy55b3JraWUudjEuRGVhY3RpdmF0ZUNsaWVudFJlc3BvbnNlIgASVwoOQXR0YWNoRG9jdW1lbnQSIC55b3JraWUudjEuQXR0YWNoRG9jdW1lbnRSZXF1ZXN0GiEueW9ya2llLnYxLkF0dGFjaERvY3VtZW50UmVzcG9uc2UiABJXCg5EZXRhY2hEb2N1bWVudBIgLnlvcmtpZS52MS5EZXRhY2hEb2N1bWVudFJlcXVlc3QaIS55b3JraWUudjEuRGV0YWNoRG9jdW1lbnRSZXNwb25zZSIAElcKDlJlbW92ZURvY3VtZW50EiAueW9ya2llLnYxLlJlbW92ZURvY3VtZW50UmVxdWVzdBohLnlvcmtpZS52MS5SZW1vdmVEb2N1bWVudFJlc3BvbnNlIgASWgoPUHVzaFB1bGxDaGFuZ2VzEiEueW9ya2llLnYxLlB1c2hQdWxsQ2hhbmdlc1JlcXVlc3QaIi55b3JraWUudjEuUHVzaFB1bGxDaGFuZ2VzUmVzcG9uc2UiABI+CgVXYXRjaBIXLnlvcmtpZS52MS5XYXRjaFJlcXVlc3QaGC55b3JraWUudjEuV2F0Y2hSZXNwb25zZSIAMAESVgoNV2F0Y2hEb2N1bWVudBIfLnlvcmtpZS52MS5XYXRjaERvY3VtZW50UmVxdWVzdBogLnlvcmtpZS52MS5XYXRjaERvY3VtZW50UmVzcG9uc2UiADABElMKDFdhdGNoQ2hhbm5lbBIeLnlvcmtpZS52MS5XYXRjaENoYW5uZWxSZXF1ZXN0Gh8ueW9ya2llLnYxLldhdGNoQ2hhbm5lbFJlc3BvbnNlIgAwARJXCg5DcmVhdGVSZXZpc2lvbhIgLnlvcmtpZS52MS5DcmVhdGVSZXZpc2lvblJlcXVlc3QaIS55b3JraWUudjEuQ3JlYXRlUmV2aXNpb25SZXNwb25zZSIAEk4KC0dldFJldmlzaW9uEh0ueW9ya2llLnYxLkdldFJldmlzaW9uUmVxdWVzdBoeLnlvcmtpZS52MS5HZXRSZXZpc2lvblJlc3BvbnNlIgASVAoNTGlzdFJldmlzaW9ucxIfLnlvcmtpZS52MS5MaXN0UmV2aXNpb25zUmVxdWVzdBogLnlvcmtpZS52MS5MaXN0UmV2aXNpb25zUmVzcG9uc2UiABJaCg9SZXN0b3JlUmV2aXNpb24SIS55b3JraWUudjEuUmVzdG9yZVJldmlzaW9uUmVxdWVzdBoiLnlvcmtpZS52MS5SZXN0b3JlUmV2aXNpb25SZXNwb25zZSIAElQKDUF0dGFjaENoYW5uZWwSHy55b3JraWUudjEuQXR0YWNoQ2hhbm5lbFJlcXVlc3QaIC55b3JraWUudjEuQXR0YWNoQ2hhbm5lbFJlc3BvbnNlIgASVAoNRGV0YWNoQ2hhbm5lbBIfLnlvcmtpZS52MS5EZXRhY2hDaGFubmVsUmVxdWVzdBogLnlvcmtpZS52MS5EZXRhY2hDaGFubmVsUmVzcG9uc2UiABJXCg5SZWZyZXNoQ2hhbm5lbBIgLnlvcmtpZS52MS5SZWZyZXNoQ2hhbm5lbFJlcXVlc3QaIS55b3JraWUudjEuUmVmcmVzaENoYW5uZWxSZXNwb25zZSIAEk4KC1BlZWtDaGFubmVsEh0ueW9ya2llLnYxLlBlZWtDaGFubmVsUmVxdWVzdBoeLnlvcmtpZS52MS5QZWVrQ2hhbm5lbFJlc3BvbnNlIgASSAoJQnJvYWRjYXN0EhsueW9ya2llLnYxLkJyb2FkY2FzdFJlcXVlc3QaHC55b3JraWUudjEuQnJvYWRjYXN0UmVzcG9uc2UiAEJFChFkZXYueW9ya2llLmFwaS52MVABWi5naXRodWIuY29tL3lvcmtpZS10ZWFtL3lvcmtpZS9hcGkveW9ya2llL3YxO3YxYgZwcm90bzM", [file_yorkie_v1_resources]);
|
|
5871
5878
|
const YorkieService = /* @__PURE__ */ serviceDesc(file_yorkie_v1_yorkie, 0);
|
|
5872
5879
|
const file_google_rpc_error_details = /* @__PURE__ */ fileDesc("Ch5nb29nbGUvcnBjL2Vycm9yX2RldGFpbHMucHJvdG8SCmdvb2dsZS5ycGMikwEKCUVycm9ySW5mbxIOCgZyZWFzb24YASABKAkSDgoGZG9tYWluGAIgASgJEjUKCG1ldGFkYXRhGAMgAygLMiMuZ29vZ2xlLnJwYy5FcnJvckluZm8uTWV0YWRhdGFFbnRyeRovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiOwoJUmV0cnlJbmZvEi4KC3JldHJ5X2RlbGF5GAEgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIjIKCURlYnVnSW5mbxIVCg1zdGFja19lbnRyaWVzGAEgAygJEg4KBmRldGFpbBgCIAEoCSKPAwoMUXVvdGFGYWlsdXJlEjYKCnZpb2xhdGlvbnMYASADKAsyIi5nb29nbGUucnBjLlF1b3RhRmFpbHVyZS5WaW9sYXRpb24axgIKCVZpb2xhdGlvbhIPCgdzdWJqZWN0GAEgASgJEhMKC2Rlc2NyaXB0aW9uGAIgASgJEhMKC2FwaV9zZXJ2aWNlGAMgASgJEhQKDHF1b3RhX21ldHJpYxgEIAEoCRIQCghxdW90YV9pZBgFIAEoCRJRChBxdW90YV9kaW1lbnNpb25zGAYgAygLMjcuZ29vZ2xlLnJwYy5RdW90YUZhaWx1cmUuVmlvbGF0aW9uLlF1b3RhRGltZW5zaW9uc0VudHJ5EhMKC3F1b3RhX3ZhbHVlGAcgASgDEh8KEmZ1dHVyZV9xdW90YV92YWx1ZRgIIAEoA0gAiAEBGjYKFFF1b3RhRGltZW5zaW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAFCFQoTX2Z1dHVyZV9xdW90YV92YWx1ZSKVAQoTUHJlY29uZGl0aW9uRmFpbHVyZRI9Cgp2aW9sYXRpb25zGAEgAygLMikuZ29vZ2xlLnJwYy5QcmVjb25kaXRpb25GYWlsdXJlLlZpb2xhdGlvbho/CglWaW9sYXRpb24SDAoEdHlwZRgBIAEoCRIPCgdzdWJqZWN0GAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJIswBCgpCYWRSZXF1ZXN0Ej8KEGZpZWxkX3Zpb2xhdGlvbnMYASADKAsyJS5nb29nbGUucnBjLkJhZFJlcXVlc3QuRmllbGRWaW9sYXRpb24afQoORmllbGRWaW9sYXRpb24SDQoFZmllbGQYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkSDgoGcmVhc29uGAMgASgJEjcKEWxvY2FsaXplZF9tZXNzYWdlGAQgASgLMhwuZ29vZ2xlLnJwYy5Mb2NhbGl6ZWRNZXNzYWdlIjcKC1JlcXVlc3RJbmZvEhIKCnJlcXVlc3RfaWQYASABKAkSFAoMc2VydmluZ19kYXRhGAIgASgJImAKDFJlc291cmNlSW5mbxIVCg1yZXNvdXJjZV90eXBlGAEgASgJEhUKDXJlc291cmNlX25hbWUYAiABKAkSDQoFb3duZXIYAyABKAkSEwoLZGVzY3JpcHRpb24YBCABKAkiVgoESGVscBIkCgVsaW5rcxgBIAMoCzIVLmdvb2dsZS5ycGMuSGVscC5MaW5rGigKBExpbmsSEwoLZGVzY3JpcHRpb24YASABKAkSCwoDdXJsGAIgASgJIjMKEExvY2FsaXplZE1lc3NhZ2USDgoGbG9jYWxlGAEgASgJEg8KB21lc3NhZ2UYAiABKAlCbAoOY29tLmdvb2dsZS5ycGNCEUVycm9yRGV0YWlsc1Byb3RvUAFaP2dvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvcnBjL2VycmRldGFpbHM7ZXJyZGV0YWlsc6ICA1JQQ2IGcHJvdG8z", [file_google_protobuf_duration]);
|
|
5873
5880
|
const ErrorInfoSchema = /* @__PURE__ */ messageDesc(file_google_rpc_error_details, 0);
|
|
@@ -9686,10 +9693,20 @@ class RGATreeSplit {
|
|
|
9686
9693
|
head;
|
|
9687
9694
|
treeByIndex;
|
|
9688
9695
|
treeByID;
|
|
9696
|
+
/**
|
|
9697
|
+
* `pendingGCPairs` buffers GC pairs for nodes that were created
|
|
9698
|
+
* already-tombstoned by splitting a removed node. Such pieces inherit
|
|
9699
|
+
* `removedAt` without ever passing through `remove()`, so they would
|
|
9700
|
+
* otherwise never be registered for GC. Callers that split nodes
|
|
9701
|
+
* (`edit`, `CRDTText.setStyle`, `CRDTText.removeStyle`) drain this
|
|
9702
|
+
* buffer into their returned GC pairs.
|
|
9703
|
+
*/
|
|
9704
|
+
pendingGCPairs;
|
|
9689
9705
|
constructor() {
|
|
9690
9706
|
this.head = RGATreeSplitNode.create(InitialRGATreeSplitNodeID);
|
|
9691
9707
|
this.treeByIndex = new SplayTree();
|
|
9692
9708
|
this.treeByID = new LLRBTree(RGATreeSplitNode.createComparator());
|
|
9709
|
+
this.pendingGCPairs = [];
|
|
9693
9710
|
this.treeByIndex.insert(this.head);
|
|
9694
9711
|
this.treeByID.put(this.head.getID(), this.head);
|
|
9695
9712
|
}
|
|
@@ -9722,7 +9739,7 @@ class RGATreeSplit {
|
|
|
9722
9739
|
);
|
|
9723
9740
|
addDataSizes(diff, diffTo, diffFrom);
|
|
9724
9741
|
const nodesToDelete = this.findBetween(fromRight, toRight);
|
|
9725
|
-
const [changes, removedNodes] = this.deleteNodes(
|
|
9742
|
+
const [changes, removedNodes, alreadyRemovedIDs] = this.deleteNodes(
|
|
9726
9743
|
nodesToDelete,
|
|
9727
9744
|
editedAt,
|
|
9728
9745
|
versionVector
|
|
@@ -9753,11 +9770,285 @@ class RGATreeSplit {
|
|
|
9753
9770
|
}
|
|
9754
9771
|
const pairs = [];
|
|
9755
9772
|
const removedValues = [];
|
|
9756
|
-
|
|
9757
|
-
|
|
9773
|
+
const removedSpans = [];
|
|
9774
|
+
for (const [id, removedNode] of removedNodes) {
|
|
9775
|
+
if (!alreadyRemovedIDs.has(id)) {
|
|
9776
|
+
pairs.push({ parent: this, child: removedNode });
|
|
9777
|
+
}
|
|
9758
9778
|
removedValues.push(removedNode.getValue());
|
|
9779
|
+
removedSpans.push({
|
|
9780
|
+
createdAt: removedNode.getCreatedAt(),
|
|
9781
|
+
start: removedNode.getID().getOffset(),
|
|
9782
|
+
end: removedNode.getID().getOffset() + removedNode.getContentLength(),
|
|
9783
|
+
value: removedNode.getValue().substring(0)
|
|
9784
|
+
});
|
|
9785
|
+
}
|
|
9786
|
+
pairs.push(...this.drainPendingGCPairs());
|
|
9787
|
+
return [caretPos, pairs, diff, changes, removedValues, removedSpans];
|
|
9788
|
+
}
|
|
9789
|
+
/**
|
|
9790
|
+
* `restore` re-establishes the characters described by `spans` under
|
|
9791
|
+
* their ORIGINAL identities. For each span, per overlapping region:
|
|
9792
|
+
* - live piece exists → skip (idempotent; another undo restored it)
|
|
9793
|
+
* - tombstoned piece exists → clear removedAt (un-tombstone)
|
|
9794
|
+
* - no piece exists (GC'd) → recreate a node with the original ID
|
|
9795
|
+
*
|
|
9796
|
+
* Returns [untombstonedNodes, recreatedNodes, changes, liveDiff,
|
|
9797
|
+
* pendingGCPairs]. `changes` describes the revived content as insertions
|
|
9798
|
+
* (ascending index) so editor bindings and remote sync can be driven
|
|
9799
|
+
* the same way as a normal edit.
|
|
9800
|
+
*
|
|
9801
|
+
* The caller must, in order: (1) register every pair in `pendingGCPairs`
|
|
9802
|
+
* — these are fragments `splitNode` buffered while isolating a target
|
|
9803
|
+
* range out of a larger tombstoned piece (see `drainPendingGCPairs`);
|
|
9804
|
+
* (2) unregister GC pairs for `untombstonedNodes`. Registering first is
|
|
9805
|
+
* required for `untombstonedNodes` entries whose node was itself one of
|
|
9806
|
+
* those split-born fragments (a target isolated from the interior of a
|
|
9807
|
+
* tombstone) — such a node was never registered under its own id, so
|
|
9808
|
+
* step (1) creates the entry that step (2) then correctly walks from gc
|
|
9809
|
+
* back to live; entries that remain tombstoned (siblings of the
|
|
9810
|
+
* restored target) simply stay registered. Finally, `root.acc(liveDiff)`
|
|
9811
|
+
* accounts the size of any nodes recreated from scratch (the GC'd-away
|
|
9812
|
+
* case), which `splitNode`'s buffering does not cover.
|
|
9813
|
+
*/
|
|
9814
|
+
restore(spans, executedAt, fallbackAnchor) {
|
|
9815
|
+
const untombstoned = [];
|
|
9816
|
+
const recreated = [];
|
|
9817
|
+
const liveDiff = { data: 0, meta: 0 };
|
|
9818
|
+
for (const span of spans) {
|
|
9819
|
+
const pieces = this.findPiecesOverlapping(
|
|
9820
|
+
span.createdAt,
|
|
9821
|
+
span.start,
|
|
9822
|
+
span.end
|
|
9823
|
+
);
|
|
9824
|
+
let cursor = span.start;
|
|
9825
|
+
let pieceIdx = 0;
|
|
9826
|
+
while (cursor < span.end) {
|
|
9827
|
+
const piece = pieces[pieceIdx];
|
|
9828
|
+
const pieceStart = piece ? piece.getID().getOffset() : Infinity;
|
|
9829
|
+
const pieceEnd = piece ? pieceStart + piece.getContentLength() : Infinity;
|
|
9830
|
+
if (piece && pieceStart <= cursor) {
|
|
9831
|
+
const overlapEnd = Math.min(pieceEnd, span.end);
|
|
9832
|
+
if (piece.isRemoved()) {
|
|
9833
|
+
const [target] = this.isolateRange(piece, cursor, overlapEnd);
|
|
9834
|
+
target.setRemovedAt(void 0);
|
|
9835
|
+
this.treeByIndex.splayNode(target);
|
|
9836
|
+
untombstoned.push(target);
|
|
9837
|
+
}
|
|
9838
|
+
cursor = overlapEnd;
|
|
9839
|
+
if (overlapEnd >= pieceEnd) {
|
|
9840
|
+
pieceIdx++;
|
|
9841
|
+
}
|
|
9842
|
+
} else {
|
|
9843
|
+
const gapEnd = Math.min(pieceStart, span.end);
|
|
9844
|
+
const value = span.value.substring(
|
|
9845
|
+
cursor - span.start,
|
|
9846
|
+
gapEnd - span.start
|
|
9847
|
+
);
|
|
9848
|
+
const newNode = RGATreeSplitNode.create(
|
|
9849
|
+
RGATreeSplitNodeID.of(span.createdAt, cursor),
|
|
9850
|
+
value
|
|
9851
|
+
);
|
|
9852
|
+
addDataSizes(liveDiff, newNode.getDataSize());
|
|
9853
|
+
const prev = this.findRestoreAnchor(
|
|
9854
|
+
span.createdAt,
|
|
9855
|
+
cursor,
|
|
9856
|
+
gapEnd,
|
|
9857
|
+
executedAt,
|
|
9858
|
+
fallbackAnchor
|
|
9859
|
+
);
|
|
9860
|
+
this.insertAfter(prev, newNode);
|
|
9861
|
+
recreated.push(newNode);
|
|
9862
|
+
cursor = gapEnd;
|
|
9863
|
+
}
|
|
9864
|
+
}
|
|
9865
|
+
}
|
|
9866
|
+
const pendingGCPairs = this.drainPendingGCPairs();
|
|
9867
|
+
const changes = [];
|
|
9868
|
+
for (const node of [...untombstoned, ...recreated]) {
|
|
9869
|
+
const [from] = this.findIndexesFromRange(node.createPosRange());
|
|
9870
|
+
changes.push({
|
|
9871
|
+
actor: executedAt.getActorID(),
|
|
9872
|
+
from,
|
|
9873
|
+
to: from,
|
|
9874
|
+
value: node.getValue()
|
|
9875
|
+
});
|
|
9876
|
+
}
|
|
9877
|
+
changes.sort((a, b) => a.from - b.from);
|
|
9878
|
+
return [untombstoned, recreated, changes, liveDiff, pendingGCPairs];
|
|
9879
|
+
}
|
|
9880
|
+
/**
|
|
9881
|
+
* `retombstone` re-deletes the characters described by `spans` (redo of
|
|
9882
|
+
* an identity-preserving undo). Only live pieces are affected; already
|
|
9883
|
+
* removed or purged regions are skipped (idempotent).
|
|
9884
|
+
*
|
|
9885
|
+
* Returns [pairs, changes, diff]: GCPairs for the newly tombstoned
|
|
9886
|
+
* nodes, the removed regions as deletions so editor bindings and remote
|
|
9887
|
+
* sync can be driven the same way as a normal edit, and the
|
|
9888
|
+
* metadata-size overhead from splitting the (live) pieces to isolate the
|
|
9889
|
+
* target range. The caller must `root.acc(diff)` before registering
|
|
9890
|
+
* `pairs`, mirroring how a normal edit's boundary splits are accounted
|
|
9891
|
+
* before its resulting tombstones are registered. Indices are captured
|
|
9892
|
+
* before each removal, so applying them in emission order stays
|
|
9893
|
+
* consistent.
|
|
9894
|
+
*/
|
|
9895
|
+
retombstone(spans, executedAt) {
|
|
9896
|
+
const pairs = [];
|
|
9897
|
+
const changes = [];
|
|
9898
|
+
const diff = { data: 0, meta: 0 };
|
|
9899
|
+
for (const span of spans) {
|
|
9900
|
+
const pieces = this.findPiecesOverlapping(
|
|
9901
|
+
span.createdAt,
|
|
9902
|
+
span.start,
|
|
9903
|
+
span.end
|
|
9904
|
+
);
|
|
9905
|
+
for (const piece of pieces) {
|
|
9906
|
+
if (piece.isRemoved()) {
|
|
9907
|
+
continue;
|
|
9908
|
+
}
|
|
9909
|
+
const pieceStart = piece.getID().getOffset();
|
|
9910
|
+
const pieceEnd = pieceStart + piece.getContentLength();
|
|
9911
|
+
const [target, splitDiff] = this.isolateRange(
|
|
9912
|
+
piece,
|
|
9913
|
+
Math.max(pieceStart, span.start),
|
|
9914
|
+
Math.min(pieceEnd, span.end)
|
|
9915
|
+
);
|
|
9916
|
+
addDataSizes(diff, splitDiff);
|
|
9917
|
+
const [from, to] = this.findIndexesFromRange(target.createPosRange());
|
|
9918
|
+
target.remove(executedAt);
|
|
9919
|
+
this.treeByIndex.splayNode(target);
|
|
9920
|
+
pairs.push({ parent: this, child: target });
|
|
9921
|
+
if (from < to) {
|
|
9922
|
+
changes.push({ actor: executedAt.getActorID(), from, to });
|
|
9923
|
+
}
|
|
9924
|
+
}
|
|
9925
|
+
}
|
|
9926
|
+
pairs.push(...this.drainPendingGCPairs());
|
|
9927
|
+
return [pairs, changes, diff];
|
|
9928
|
+
}
|
|
9929
|
+
/**
|
|
9930
|
+
* `findPiecesOverlapping` collects existing nodes (live or tombstoned)
|
|
9931
|
+
* belonging to the insertion `createdAt` that overlap the absolute-offset
|
|
9932
|
+
* interval [start, end), in ascending offset order. Works by descending
|
|
9933
|
+
* floorEntry probes over treeByID.
|
|
9934
|
+
*/
|
|
9935
|
+
findPiecesOverlapping(createdAt, start, end) {
|
|
9936
|
+
const pieces = [];
|
|
9937
|
+
let probe = end - 1;
|
|
9938
|
+
while (probe >= 0) {
|
|
9939
|
+
const key = RGATreeSplitNodeID.of(createdAt, probe);
|
|
9940
|
+
const entry = this.treeByID.floorEntry(key);
|
|
9941
|
+
if (!entry || !entry.key.hasSameCreatedAt(key)) {
|
|
9942
|
+
break;
|
|
9943
|
+
}
|
|
9944
|
+
const node = entry.value;
|
|
9945
|
+
const nodeStart = node.getID().getOffset();
|
|
9946
|
+
const nodeEnd = nodeStart + node.getContentLength();
|
|
9947
|
+
if (nodeEnd <= start) {
|
|
9948
|
+
break;
|
|
9949
|
+
}
|
|
9950
|
+
if (nodeStart < end && nodeEnd > start) {
|
|
9951
|
+
pieces.push(node);
|
|
9952
|
+
}
|
|
9953
|
+
if (nodeStart <= start) {
|
|
9954
|
+
break;
|
|
9955
|
+
}
|
|
9956
|
+
probe = nodeStart - 1;
|
|
9957
|
+
}
|
|
9958
|
+
return pieces.reverse();
|
|
9959
|
+
}
|
|
9960
|
+
/**
|
|
9961
|
+
* `findPieceCovering` returns the node of insertion `createdAt` whose
|
|
9962
|
+
* absolute-offset range covers `offset`, if present.
|
|
9963
|
+
*/
|
|
9964
|
+
findPieceCovering(createdAt, offset) {
|
|
9965
|
+
const key = RGATreeSplitNodeID.of(createdAt, offset);
|
|
9966
|
+
const entry = this.treeByID.floorEntry(key);
|
|
9967
|
+
if (!entry || !entry.key.hasSameCreatedAt(key)) {
|
|
9968
|
+
return;
|
|
9969
|
+
}
|
|
9970
|
+
const node = entry.value;
|
|
9971
|
+
const nodeStart = node.getID().getOffset();
|
|
9972
|
+
const nodeEnd = nodeStart + node.getContentLength();
|
|
9973
|
+
if (nodeStart <= offset && offset < nodeEnd) {
|
|
9974
|
+
return node;
|
|
9975
|
+
}
|
|
9976
|
+
return;
|
|
9977
|
+
}
|
|
9978
|
+
/**
|
|
9979
|
+
* `findRestoreAnchor` returns the physical node to insert a recreated
|
|
9980
|
+
* fragment [gapStart, gapEnd) of insertion `createdAt` AFTER.
|
|
9981
|
+
*
|
|
9982
|
+
* Resolution ladder (all rules key on op-carried data + ID lookups only):
|
|
9983
|
+
* (a) a piece covering gapEnd exists → directly before it
|
|
9984
|
+
* (originally-adjacent successor; exact original slot)
|
|
9985
|
+
* (b) nearest surviving piece of the same insertion left of gapStart
|
|
9986
|
+
* → directly after it
|
|
9987
|
+
* (c) rightmost surviving piece of the same insertion (must be right
|
|
9988
|
+
* of the gap) → directly before it
|
|
9989
|
+
* (d) the operation's fallback anchor (refined) — same exposure as the
|
|
9990
|
+
* current implementation's fromPos; see design-doc caveat
|
|
9991
|
+
* (e) head (deterministic last resort)
|
|
9992
|
+
*/
|
|
9993
|
+
findRestoreAnchor(createdAt, gapStart, gapEnd, executedAt, fallbackAnchor) {
|
|
9994
|
+
const succ = this.findPieceCovering(createdAt, gapEnd);
|
|
9995
|
+
if (succ) {
|
|
9996
|
+
return succ.getPrev();
|
|
9997
|
+
}
|
|
9998
|
+
if (gapStart > 0) {
|
|
9999
|
+
const key = RGATreeSplitNodeID.of(createdAt, gapStart - 1);
|
|
10000
|
+
const entry = this.treeByID.floorEntry(key);
|
|
10001
|
+
if (entry && entry.key.hasSameCreatedAt(key)) {
|
|
10002
|
+
return entry.value;
|
|
10003
|
+
}
|
|
10004
|
+
}
|
|
10005
|
+
const rightmostKey = RGATreeSplitNodeID.of(
|
|
10006
|
+
createdAt,
|
|
10007
|
+
Number.MAX_SAFE_INTEGER
|
|
10008
|
+
);
|
|
10009
|
+
const rightmost = this.treeByID.floorEntry(rightmostKey);
|
|
10010
|
+
if (rightmost && rightmost.key.hasSameCreatedAt(rightmostKey) && rightmost.value.getID().getOffset() >= gapEnd) {
|
|
10011
|
+
return rightmost.value.getPrev();
|
|
10012
|
+
}
|
|
10013
|
+
if (fallbackAnchor) {
|
|
10014
|
+
try {
|
|
10015
|
+
const refined = this.refinePos(fallbackAnchor);
|
|
10016
|
+
const [left] = this.findNodeWithSplit(refined, executedAt);
|
|
10017
|
+
return left;
|
|
10018
|
+
} catch {
|
|
10019
|
+
}
|
|
9759
10020
|
}
|
|
9760
|
-
return
|
|
10021
|
+
return this.head;
|
|
10022
|
+
}
|
|
10023
|
+
/**
|
|
10024
|
+
* `isolateRange` splits `piece` so that a node exactly covering the
|
|
10025
|
+
* absolute-offset interval [from, to) exists, and returns it along with
|
|
10026
|
+
* the net metadata-size overhead the split(s) introduced.
|
|
10027
|
+
*
|
|
10028
|
+
* When `piece` is live, this overhead is a normal live-bucket cost (same
|
|
10029
|
+
* as any other boundary split) and the caller should `root.acc` it.
|
|
10030
|
+
* When `piece` is tombstoned, `splitNode` itself buffers the overhead of
|
|
10031
|
+
* any born-removed fragment via `pendingGCPairs` (see `drainPendingGCPairs`),
|
|
10032
|
+
* so the returned diff is zero in that case — the caller must still
|
|
10033
|
+
* drain and register those pairs.
|
|
10034
|
+
*
|
|
10035
|
+
* Requires: pieceStart <= from < to <= pieceEnd.
|
|
10036
|
+
*/
|
|
10037
|
+
isolateRange(piece, from, to) {
|
|
10038
|
+
const diff = { data: 0, meta: 0 };
|
|
10039
|
+
let node = piece;
|
|
10040
|
+
const nodeStart = node.getID().getOffset();
|
|
10041
|
+
if (from > nodeStart) {
|
|
10042
|
+
const [right, splitDiff] = this.splitNode(node, from - nodeStart);
|
|
10043
|
+
addDataSizes(diff, splitDiff);
|
|
10044
|
+
node = right;
|
|
10045
|
+
}
|
|
10046
|
+
const newStart = node.getID().getOffset();
|
|
10047
|
+
if (to < newStart + node.getContentLength()) {
|
|
10048
|
+
const [, splitDiff] = this.splitNode(node, to - newStart);
|
|
10049
|
+
addDataSizes(diff, splitDiff);
|
|
10050
|
+
}
|
|
10051
|
+
return [node, diff];
|
|
9761
10052
|
}
|
|
9762
10053
|
/**
|
|
9763
10054
|
* `indexToPos` finds RGATreeSplitPos of given offset.
|
|
@@ -10027,11 +10318,28 @@ class RGATreeSplit {
|
|
|
10027
10318
|
splitNode.setInsPrev(node);
|
|
10028
10319
|
addDataSizes(diff, node.getDataSize(), splitNode.getDataSize());
|
|
10029
10320
|
subDataSize(diff, prvSize);
|
|
10321
|
+
if (splitNode.isRemoved()) {
|
|
10322
|
+
this.pendingGCPairs.push({
|
|
10323
|
+
parent: this,
|
|
10324
|
+
child: splitNode,
|
|
10325
|
+
gcOnlySize: diff
|
|
10326
|
+
});
|
|
10327
|
+
return [splitNode, { data: 0, meta: 0 }];
|
|
10328
|
+
}
|
|
10030
10329
|
return [splitNode, diff];
|
|
10031
10330
|
}
|
|
10331
|
+
/**
|
|
10332
|
+
* `drainPendingGCPairs` returns the GC pairs buffered for born-tombstoned
|
|
10333
|
+
* split pieces and clears the buffer.
|
|
10334
|
+
*/
|
|
10335
|
+
drainPendingGCPairs() {
|
|
10336
|
+
const pairs = this.pendingGCPairs;
|
|
10337
|
+
this.pendingGCPairs = [];
|
|
10338
|
+
return pairs;
|
|
10339
|
+
}
|
|
10032
10340
|
deleteNodes(candidates, editedAt, vector) {
|
|
10033
10341
|
if (!candidates.length) {
|
|
10034
|
-
return [[], /* @__PURE__ */ new Map()];
|
|
10342
|
+
return [[], /* @__PURE__ */ new Map(), /* @__PURE__ */ new Set()];
|
|
10035
10343
|
}
|
|
10036
10344
|
const isLocal = vector === void 0 || vector.size() === 0;
|
|
10037
10345
|
const nodesToRemove = [];
|
|
@@ -10066,12 +10374,17 @@ class RGATreeSplit {
|
|
|
10066
10374
|
nodesToKeep.push(rightEdge);
|
|
10067
10375
|
const changes = this.makeChanges(nodesToKeep, editedAt);
|
|
10068
10376
|
const removedNodes = /* @__PURE__ */ new Map();
|
|
10377
|
+
const alreadyRemovedIDs = /* @__PURE__ */ new Set();
|
|
10069
10378
|
for (const node of nodesToRemove) {
|
|
10070
|
-
|
|
10379
|
+
const id = node.getID().toIDString();
|
|
10380
|
+
if (node.isRemoved()) {
|
|
10381
|
+
alreadyRemovedIDs.add(id);
|
|
10382
|
+
}
|
|
10383
|
+
removedNodes.set(id, node);
|
|
10071
10384
|
node.remove(editedAt);
|
|
10072
10385
|
}
|
|
10073
10386
|
this.deleteIndexNodes(nodesToKeep);
|
|
10074
|
-
return [changes, removedNodes];
|
|
10387
|
+
return [changes, removedNodes, alreadyRemovedIDs];
|
|
10075
10388
|
}
|
|
10076
10389
|
/**
|
|
10077
10390
|
* `findEdgesOfCandidates` finds the edges outside `candidates`,
|
|
@@ -10543,7 +10856,7 @@ class CRDTText extends CRDTElement {
|
|
|
10543
10856
|
crdtTextValue.setAttr(k, v, editedAt);
|
|
10544
10857
|
}
|
|
10545
10858
|
}
|
|
10546
|
-
const [caretPos, pairs, diff, valueChanges, removedValues] = this.rgaTreeSplit.edit(range, editedAt, crdtTextValue, versionVector);
|
|
10859
|
+
const [caretPos, pairs, diff, valueChanges, removedValues, removedSpans] = this.rgaTreeSplit.edit(range, editedAt, crdtTextValue, versionVector);
|
|
10547
10860
|
const changes = valueChanges.map((change) => ({
|
|
10548
10861
|
...change,
|
|
10549
10862
|
value: change.value ? {
|
|
@@ -10556,7 +10869,56 @@ class CRDTText extends CRDTElement {
|
|
|
10556
10869
|
type: "content"
|
|
10557
10870
|
/* Content */
|
|
10558
10871
|
}));
|
|
10559
|
-
return [
|
|
10872
|
+
return [
|
|
10873
|
+
changes,
|
|
10874
|
+
pairs,
|
|
10875
|
+
diff,
|
|
10876
|
+
[caretPos, caretPos],
|
|
10877
|
+
removedValues,
|
|
10878
|
+
removedSpans
|
|
10879
|
+
];
|
|
10880
|
+
}
|
|
10881
|
+
/**
|
|
10882
|
+
* `restore` re-establishes removed characters under their original
|
|
10883
|
+
* identities (identity-preserving undo of a deletion).
|
|
10884
|
+
*/
|
|
10885
|
+
restore(spans, executedAt, fallbackAnchor) {
|
|
10886
|
+
const [untombstoned, recreated, valueChanges, liveDiff, pendingGCPairs] = this.rgaTreeSplit.restore(spans, executedAt, fallbackAnchor);
|
|
10887
|
+
return [
|
|
10888
|
+
untombstoned,
|
|
10889
|
+
recreated,
|
|
10890
|
+
this.toTextChanges(valueChanges),
|
|
10891
|
+
liveDiff,
|
|
10892
|
+
pendingGCPairs
|
|
10893
|
+
];
|
|
10894
|
+
}
|
|
10895
|
+
/**
|
|
10896
|
+
* `retombstone` re-deletes previously restored characters (redo).
|
|
10897
|
+
*/
|
|
10898
|
+
retombstone(spans, executedAt) {
|
|
10899
|
+
const [pairs, valueChanges, diff] = this.rgaTreeSplit.retombstone(
|
|
10900
|
+
spans,
|
|
10901
|
+
executedAt
|
|
10902
|
+
);
|
|
10903
|
+
return [pairs, this.toTextChanges(valueChanges), diff];
|
|
10904
|
+
}
|
|
10905
|
+
/**
|
|
10906
|
+
* `toTextChanges` wraps raw RGATreeSplit value changes into `TextChange`s,
|
|
10907
|
+
* mirroring the mapping used by `edit`.
|
|
10908
|
+
*/
|
|
10909
|
+
toTextChanges(valueChanges) {
|
|
10910
|
+
return valueChanges.map((change) => ({
|
|
10911
|
+
...change,
|
|
10912
|
+
value: change.value ? {
|
|
10913
|
+
attributes: parseObjectValues(change.value.getAttributes()),
|
|
10914
|
+
content: change.value.getContent()
|
|
10915
|
+
} : {
|
|
10916
|
+
attributes: void 0,
|
|
10917
|
+
content: ""
|
|
10918
|
+
},
|
|
10919
|
+
type: "content"
|
|
10920
|
+
/* Content */
|
|
10921
|
+
}));
|
|
10560
10922
|
}
|
|
10561
10923
|
/**
|
|
10562
10924
|
* `setStyle` applies the style of the given range.
|
|
@@ -10633,6 +10995,7 @@ class CRDTText extends CRDTElement {
|
|
|
10633
10995
|
}
|
|
10634
10996
|
}
|
|
10635
10997
|
}
|
|
10998
|
+
pairs.push(...this.rgaTreeSplit.drainPendingGCPairs());
|
|
10636
10999
|
return [pairs, diff, changes, prevAttributes, attributesToRemove];
|
|
10637
11000
|
}
|
|
10638
11001
|
/**
|
|
@@ -10703,6 +11066,7 @@ class CRDTText extends CRDTElement {
|
|
|
10703
11066
|
}
|
|
10704
11067
|
}
|
|
10705
11068
|
}
|
|
11069
|
+
pairs.push(...this.rgaTreeSplit.drainPendingGCPairs());
|
|
10706
11070
|
return [pairs, diff, changes, prevAttributes];
|
|
10707
11071
|
}
|
|
10708
11072
|
/**
|
|
@@ -10857,10 +11221,16 @@ class CRDTText extends CRDTElement {
|
|
|
10857
11221
|
const pairs = [];
|
|
10858
11222
|
for (const node of this.rgaTreeSplit) {
|
|
10859
11223
|
if (node.getRemovedAt()) {
|
|
10860
|
-
pairs.push({
|
|
11224
|
+
pairs.push({
|
|
11225
|
+
parent: this.rgaTreeSplit,
|
|
11226
|
+
child: node,
|
|
11227
|
+
gcOnlySize: node.getDataSize()
|
|
11228
|
+
});
|
|
10861
11229
|
}
|
|
10862
11230
|
for (const p of node.getValue().getGCPairs()) {
|
|
10863
|
-
pairs.push(
|
|
11231
|
+
pairs.push(
|
|
11232
|
+
node.getRemovedAt() ? { ...p, gcOnlySize: p.child.getDataSize() } : p
|
|
11233
|
+
);
|
|
10864
11234
|
}
|
|
10865
11235
|
}
|
|
10866
11236
|
return pairs;
|
|
@@ -10872,18 +11242,33 @@ class EditOperation extends Operation {
|
|
|
10872
11242
|
content;
|
|
10873
11243
|
attributes;
|
|
10874
11244
|
isUndoOp;
|
|
10875
|
-
|
|
11245
|
+
restoreSpans;
|
|
11246
|
+
restoreMode;
|
|
11247
|
+
// `retombstoneSpans` is the companion span set for an identity-preserving
|
|
11248
|
+
// reverse op. `restoreSpans` describes content the reversed edit removed;
|
|
11249
|
+
// `retombstoneSpans` describes content the reversed edit inserted (non-empty
|
|
11250
|
+
// only for the reverse of a replace). `restoreMode` picks the direction:
|
|
11251
|
+
// 'restore' revives restoreSpans and re-removes retombstoneSpans; a
|
|
11252
|
+
// 'retombstone' op (the redo) does the opposite. Reversing an edit that both
|
|
11253
|
+
// inserts and deletes as two identity operations — rather than
|
|
11254
|
+
// copy-reinserting the deleted text as a fresh node — keeps a later revived
|
|
11255
|
+
// neighbour in its original relative order.
|
|
11256
|
+
retombstoneSpans;
|
|
11257
|
+
constructor(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp, restoreSpans, restoreMode, retombstoneSpans) {
|
|
10876
11258
|
super(parentCreatedAt, executedAt);
|
|
10877
11259
|
this.fromPos = fromPos;
|
|
10878
11260
|
this.toPos = toPos;
|
|
10879
11261
|
this.content = content;
|
|
10880
11262
|
this.attributes = attributes;
|
|
10881
11263
|
this.isUndoOp = isUndoOp;
|
|
11264
|
+
this.restoreSpans = restoreSpans;
|
|
11265
|
+
this.restoreMode = restoreMode;
|
|
11266
|
+
this.retombstoneSpans = retombstoneSpans;
|
|
10882
11267
|
}
|
|
10883
11268
|
/**
|
|
10884
11269
|
* `create` creates a new instance of EditOperation.
|
|
10885
11270
|
*/
|
|
10886
|
-
static create(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp) {
|
|
11271
|
+
static create(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp, restoreSpans, restoreMode, retombstoneSpans) {
|
|
10887
11272
|
return new EditOperation(
|
|
10888
11273
|
parentCreatedAt,
|
|
10889
11274
|
fromPos,
|
|
@@ -10891,7 +11276,10 @@ class EditOperation extends Operation {
|
|
|
10891
11276
|
content,
|
|
10892
11277
|
attributes,
|
|
10893
11278
|
executedAt,
|
|
10894
|
-
isUndoOp
|
|
11279
|
+
isUndoOp,
|
|
11280
|
+
restoreSpans,
|
|
11281
|
+
restoreMode,
|
|
11282
|
+
retombstoneSpans
|
|
10895
11283
|
);
|
|
10896
11284
|
}
|
|
10897
11285
|
/**
|
|
@@ -10912,11 +11300,71 @@ class EditOperation extends Operation {
|
|
|
10912
11300
|
);
|
|
10913
11301
|
}
|
|
10914
11302
|
const text = parentObject;
|
|
11303
|
+
if (this.restoreSpans || this.retombstoneSpans) {
|
|
11304
|
+
const isRetombstone = this.restoreMode === "retombstone";
|
|
11305
|
+
const toRestore = (isRetombstone ? this.retombstoneSpans : this.restoreSpans) ?? [];
|
|
11306
|
+
const toRetombstone = (isRetombstone ? this.restoreSpans : this.retombstoneSpans) ?? [];
|
|
11307
|
+
const opInfos = [];
|
|
11308
|
+
const totalDiff = { data: 0, meta: 0 };
|
|
11309
|
+
const toOpInfo = (c) => ({
|
|
11310
|
+
type: "edit",
|
|
11311
|
+
from: c.from,
|
|
11312
|
+
to: c.to,
|
|
11313
|
+
value: c.value,
|
|
11314
|
+
path: root.createPath(this.getParentCreatedAt())
|
|
11315
|
+
});
|
|
11316
|
+
if (toRetombstone.length) {
|
|
11317
|
+
const [pairs2, changes2, diff2] = text.retombstone(
|
|
11318
|
+
toRetombstone,
|
|
11319
|
+
this.getExecutedAt()
|
|
11320
|
+
);
|
|
11321
|
+
addDataSizes(totalDiff, diff2);
|
|
11322
|
+
for (const pair of pairs2) {
|
|
11323
|
+
root.registerGCPair(pair);
|
|
11324
|
+
}
|
|
11325
|
+
for (const c of changes2) {
|
|
11326
|
+
opInfos.push(toOpInfo(c));
|
|
11327
|
+
}
|
|
11328
|
+
}
|
|
11329
|
+
if (toRestore.length) {
|
|
11330
|
+
const [untombstoned, , changes2, liveDiff, pendingGCPairs] = text.restore(toRestore, this.getExecutedAt(), this.fromPos);
|
|
11331
|
+
for (const pair of pendingGCPairs) {
|
|
11332
|
+
root.registerGCPair(pair);
|
|
11333
|
+
}
|
|
11334
|
+
for (const node of untombstoned) {
|
|
11335
|
+
root.unregisterGCPair({
|
|
11336
|
+
parent: text.getRGATreeSplit(),
|
|
11337
|
+
child: node
|
|
11338
|
+
});
|
|
11339
|
+
}
|
|
11340
|
+
addDataSizes(totalDiff, liveDiff);
|
|
11341
|
+
for (const c of changes2) {
|
|
11342
|
+
opInfos.push(toOpInfo(c));
|
|
11343
|
+
}
|
|
11344
|
+
}
|
|
11345
|
+
root.acc(totalDiff);
|
|
11346
|
+
return {
|
|
11347
|
+
opInfos,
|
|
11348
|
+
// Reverse keeps the same span sets and flips the direction.
|
|
11349
|
+
reverseOp: EditOperation.create(
|
|
11350
|
+
this.getParentCreatedAt(),
|
|
11351
|
+
this.fromPos,
|
|
11352
|
+
this.toPos,
|
|
11353
|
+
"",
|
|
11354
|
+
/* @__PURE__ */ new Map(),
|
|
11355
|
+
void 0,
|
|
11356
|
+
true,
|
|
11357
|
+
this.restoreSpans,
|
|
11358
|
+
isRetombstone ? "restore" : "retombstone",
|
|
11359
|
+
this.retombstoneSpans
|
|
11360
|
+
)
|
|
11361
|
+
};
|
|
11362
|
+
}
|
|
10915
11363
|
if (this.isUndoOp) {
|
|
10916
11364
|
this.fromPos = text.refinePos(this.fromPos);
|
|
10917
11365
|
this.toPos = text.refinePos(this.toPos);
|
|
10918
11366
|
}
|
|
10919
|
-
const [changes, pairs, diff, , removedValues] = text.edit(
|
|
11367
|
+
const [changes, pairs, diff, , removedValues, removedSpans] = text.edit(
|
|
10920
11368
|
[this.fromPos, this.toPos],
|
|
10921
11369
|
this.content,
|
|
10922
11370
|
this.getExecutedAt(),
|
|
@@ -10925,7 +11373,8 @@ class EditOperation extends Operation {
|
|
|
10925
11373
|
);
|
|
10926
11374
|
const reverseOp = this.toReverseOperation(
|
|
10927
11375
|
removedValues,
|
|
10928
|
-
text.normalizePos(this.fromPos)
|
|
11376
|
+
text.normalizePos(this.fromPos),
|
|
11377
|
+
removedSpans
|
|
10929
11378
|
);
|
|
10930
11379
|
root.acc(diff);
|
|
10931
11380
|
for (const pair of pairs) {
|
|
@@ -10944,7 +11393,33 @@ class EditOperation extends Operation {
|
|
|
10944
11393
|
reverseOp
|
|
10945
11394
|
};
|
|
10946
11395
|
}
|
|
10947
|
-
toReverseOperation(removedValues, fromPos) {
|
|
11396
|
+
toReverseOperation(removedValues, fromPos, removedSpans) {
|
|
11397
|
+
if (removedSpans.length || this.content?.length) {
|
|
11398
|
+
let insertedSpans;
|
|
11399
|
+
if (this.content?.length) {
|
|
11400
|
+
const value = CRDTTextValue.create(this.content);
|
|
11401
|
+
insertedSpans = [
|
|
11402
|
+
{
|
|
11403
|
+
createdAt: this.getExecutedAt(),
|
|
11404
|
+
start: 0,
|
|
11405
|
+
end: value.length,
|
|
11406
|
+
value
|
|
11407
|
+
}
|
|
11408
|
+
];
|
|
11409
|
+
}
|
|
11410
|
+
return EditOperation.create(
|
|
11411
|
+
this.getParentCreatedAt(),
|
|
11412
|
+
fromPos,
|
|
11413
|
+
fromPos,
|
|
11414
|
+
"",
|
|
11415
|
+
/* @__PURE__ */ new Map(),
|
|
11416
|
+
void 0,
|
|
11417
|
+
true,
|
|
11418
|
+
removedSpans.length ? removedSpans : void 0,
|
|
11419
|
+
"restore",
|
|
11420
|
+
insertedSpans
|
|
11421
|
+
);
|
|
11422
|
+
}
|
|
10948
11423
|
const content = removedValues?.length ? removedValues.map((v) => v.getContent()).join("") : "";
|
|
10949
11424
|
let attrs;
|
|
10950
11425
|
if (removedValues.length === 1) {
|
|
@@ -11082,6 +11557,26 @@ class EditOperation extends Operation {
|
|
|
11082
11557
|
getAttributes() {
|
|
11083
11558
|
return this.attributes || /* @__PURE__ */ new Map();
|
|
11084
11559
|
}
|
|
11560
|
+
/**
|
|
11561
|
+
* `getRestoreSpans` returns the identity-preserving restore payload, if
|
|
11562
|
+
* this is a restore/retombstone operation.
|
|
11563
|
+
*/
|
|
11564
|
+
getRestoreSpans() {
|
|
11565
|
+
return this.restoreSpans;
|
|
11566
|
+
}
|
|
11567
|
+
/**
|
|
11568
|
+
* `getRestoreMode` returns the identity-preserving mode of this Edit.
|
|
11569
|
+
*/
|
|
11570
|
+
getRestoreMode() {
|
|
11571
|
+
return this.restoreMode;
|
|
11572
|
+
}
|
|
11573
|
+
/**
|
|
11574
|
+
* `getRetombstoneSpans` returns the companion span set (content the reversed
|
|
11575
|
+
* edit inserted) for an identity-preserving reverse op, if any.
|
|
11576
|
+
*/
|
|
11577
|
+
getRetombstoneSpans() {
|
|
11578
|
+
return this.retombstoneSpans;
|
|
11579
|
+
}
|
|
11085
11580
|
}
|
|
11086
11581
|
class StyleOperation extends Operation {
|
|
11087
11582
|
fromPos;
|
|
@@ -12382,6 +12877,10 @@ class CRDTTreeNode extends IndexTreeNode {
|
|
|
12382
12877
|
}
|
|
12383
12878
|
this.insNextID = split.id;
|
|
12384
12879
|
tree.registerNode(split);
|
|
12880
|
+
if (split.removedAt) {
|
|
12881
|
+
tree.registerPendingGCPair(split, diff);
|
|
12882
|
+
return [split, { data: 0, meta: 0 }];
|
|
12883
|
+
}
|
|
12385
12884
|
}
|
|
12386
12885
|
return [split, diff];
|
|
12387
12886
|
}
|
|
@@ -12479,7 +12978,11 @@ class CRDTTreeNode extends IndexTreeNode {
|
|
|
12479
12978
|
}
|
|
12480
12979
|
for (const node of this.attrs) {
|
|
12481
12980
|
if (node.getRemovedAt()) {
|
|
12482
|
-
pairs.push({
|
|
12981
|
+
pairs.push({
|
|
12982
|
+
parent: this,
|
|
12983
|
+
child: node,
|
|
12984
|
+
gcOnlySize: node.getDataSize()
|
|
12985
|
+
});
|
|
12483
12986
|
}
|
|
12484
12987
|
}
|
|
12485
12988
|
return pairs;
|
|
@@ -12546,10 +13049,19 @@ function toTestTreeNode(node) {
|
|
|
12546
13049
|
class CRDTTree extends CRDTElement {
|
|
12547
13050
|
indexTree;
|
|
12548
13051
|
nodeMapByID;
|
|
13052
|
+
/**
|
|
13053
|
+
* `pendingGCPairs` buffers GC pairs for nodes that were created
|
|
13054
|
+
* already-tombstoned by splitting a removed node. Such pieces inherit
|
|
13055
|
+
* `removedAt` without ever passing through `remove()`, so they would
|
|
13056
|
+
* otherwise never be registered for GC. `edit` and `style` drain this
|
|
13057
|
+
* buffer into their returned GC pairs.
|
|
13058
|
+
*/
|
|
13059
|
+
pendingGCPairs;
|
|
12549
13060
|
constructor(root, createdAt) {
|
|
12550
13061
|
super(createdAt);
|
|
12551
13062
|
this.indexTree = new IndexTree(root);
|
|
12552
13063
|
this.nodeMapByID = new LLRBTree(CRDTTreeNodeID.createComparator());
|
|
13064
|
+
this.pendingGCPairs = [];
|
|
12553
13065
|
this.indexTree.traverseAll((node) => {
|
|
12554
13066
|
this.nodeMapByID.put(node.id, node);
|
|
12555
13067
|
});
|
|
@@ -12651,6 +13163,25 @@ class CRDTTree extends CRDTElement {
|
|
|
12651
13163
|
registerNode(node) {
|
|
12652
13164
|
this.nodeMapByID.put(node.id, node);
|
|
12653
13165
|
}
|
|
13166
|
+
/**
|
|
13167
|
+
* `registerPendingGCPair` buffers a GC pair for a node that was born
|
|
13168
|
+
* tombstoned (split off an already-removed node). The pair is picked up
|
|
13169
|
+
* by the next `edit` or `style` call via `drainPendingGCPairs`. `size`
|
|
13170
|
+
* is the net-new size created by the split; it is accounted to
|
|
13171
|
+
* docSize.gc at registration since the node was never live.
|
|
13172
|
+
*/
|
|
13173
|
+
registerPendingGCPair(node, size) {
|
|
13174
|
+
this.pendingGCPairs.push({ parent: this, child: node, gcOnlySize: size });
|
|
13175
|
+
}
|
|
13176
|
+
/**
|
|
13177
|
+
* `drainPendingGCPairs` returns the buffered GC pairs and clears the
|
|
13178
|
+
* buffer.
|
|
13179
|
+
*/
|
|
13180
|
+
drainPendingGCPairs() {
|
|
13181
|
+
const pairs = this.pendingGCPairs;
|
|
13182
|
+
this.pendingGCPairs = [];
|
|
13183
|
+
return pairs;
|
|
13184
|
+
}
|
|
12654
13185
|
/**
|
|
12655
13186
|
* `findNodesAndSplitText` finds `TreePos` of the given `CRDTTreeNodeID` and
|
|
12656
13187
|
* splits nodes if the position is in the middle of a text node.
|
|
@@ -12837,6 +13368,7 @@ class CRDTTree extends CRDTElement {
|
|
|
12837
13368
|
}
|
|
12838
13369
|
}
|
|
12839
13370
|
);
|
|
13371
|
+
pairs.push(...this.drainPendingGCPairs());
|
|
12840
13372
|
return [pairs, changes, diff, prevAttributes, newAttrKeys];
|
|
12841
13373
|
}
|
|
12842
13374
|
/**
|
|
@@ -12940,6 +13472,7 @@ class CRDTTree extends CRDTElement {
|
|
|
12940
13472
|
}
|
|
12941
13473
|
}
|
|
12942
13474
|
);
|
|
13475
|
+
pairs.push(...this.drainPendingGCPairs());
|
|
12943
13476
|
return [pairs, changes, diff, prevAttributes];
|
|
12944
13477
|
}
|
|
12945
13478
|
/**
|
|
@@ -13103,6 +13636,9 @@ class CRDTTree extends CRDTElement {
|
|
|
13103
13636
|
parent = left.parent;
|
|
13104
13637
|
}
|
|
13105
13638
|
}
|
|
13639
|
+
if (!parent.parent) {
|
|
13640
|
+
break;
|
|
13641
|
+
}
|
|
13106
13642
|
parent.split(
|
|
13107
13643
|
this,
|
|
13108
13644
|
left !== parent ? parent.findOffset(left, true) + 1 : 0,
|
|
@@ -13162,6 +13698,7 @@ class CRDTTree extends CRDTElement {
|
|
|
13162
13698
|
}
|
|
13163
13699
|
}
|
|
13164
13700
|
}
|
|
13701
|
+
pairs.push(...this.drainPendingGCPairs());
|
|
13165
13702
|
return [
|
|
13166
13703
|
changes,
|
|
13167
13704
|
pairs,
|
|
@@ -13226,9 +13763,13 @@ class CRDTTree extends CRDTElement {
|
|
|
13226
13763
|
*/
|
|
13227
13764
|
getGCPairs() {
|
|
13228
13765
|
const pairs = [];
|
|
13229
|
-
this.indexTree.
|
|
13766
|
+
this.indexTree.traverseAll((node) => {
|
|
13230
13767
|
if (node.getRemovedAt()) {
|
|
13231
|
-
pairs.push({
|
|
13768
|
+
pairs.push({
|
|
13769
|
+
parent: this,
|
|
13770
|
+
child: node,
|
|
13771
|
+
gcOnlySize: node.getDataSize()
|
|
13772
|
+
});
|
|
13232
13773
|
}
|
|
13233
13774
|
for (const p of node.getGCPairs()) {
|
|
13234
13775
|
pairs.push(p);
|
|
@@ -15677,6 +16218,25 @@ function toOperation(operation) {
|
|
|
15677
16218
|
pbAttributes[key] = value;
|
|
15678
16219
|
}
|
|
15679
16220
|
pbEditOperation.executedAt = toTimeTicket(editOperation.getExecutedAt());
|
|
16221
|
+
const toPbSpan = (span) => {
|
|
16222
|
+
const pbSpan = create(RestoreSpanSchema);
|
|
16223
|
+
pbSpan.createdAt = toTimeTicket(span.createdAt);
|
|
16224
|
+
pbSpan.start = span.start;
|
|
16225
|
+
pbSpan.end = span.end;
|
|
16226
|
+
pbSpan.content = span.value.getContent();
|
|
16227
|
+
const pbSpanAttrs = pbSpan.attributes;
|
|
16228
|
+
for (const [key, value] of Object.entries(span.value.getAttributes())) {
|
|
16229
|
+
pbSpanAttrs[key] = value;
|
|
16230
|
+
}
|
|
16231
|
+
return pbSpan;
|
|
16232
|
+
};
|
|
16233
|
+
const restoreSpans = editOperation.getRestoreSpans();
|
|
16234
|
+
const retombstoneSpans = editOperation.getRetombstoneSpans();
|
|
16235
|
+
if (restoreSpans && restoreSpans.length || retombstoneSpans && retombstoneSpans.length) {
|
|
16236
|
+
pbEditOperation.restoreSpans = (restoreSpans ?? []).map(toPbSpan);
|
|
16237
|
+
pbEditOperation.retombstoneSpans = (retombstoneSpans ?? []).map(toPbSpan);
|
|
16238
|
+
pbEditOperation.restoreMode = editOperation.getRestoreMode() === "retombstone" ? RestoreMode.RETOMBSTONE : RestoreMode.RESTORE;
|
|
16239
|
+
}
|
|
15680
16240
|
pbOperation.body.case = "edit";
|
|
15681
16241
|
pbOperation.body.value = pbEditOperation;
|
|
15682
16242
|
} else if (operation instanceof StyleOperation) {
|
|
@@ -16336,13 +16896,38 @@ function fromOperation(pbOperation) {
|
|
|
16336
16896
|
Object.entries(pbEditOperation.attributes).forEach(([key, value]) => {
|
|
16337
16897
|
attributes.set(key, value);
|
|
16338
16898
|
});
|
|
16899
|
+
const executedAt = fromTimeTicket(pbEditOperation.executedAt);
|
|
16900
|
+
const fromPbSpan = (pbSpan) => {
|
|
16901
|
+
const value = CRDTTextValue.create(pbSpan.content);
|
|
16902
|
+
for (const [key, attr] of Object.entries(pbSpan.attributes)) {
|
|
16903
|
+
value.setAttr(key, attr, executedAt);
|
|
16904
|
+
}
|
|
16905
|
+
return {
|
|
16906
|
+
createdAt: fromTimeTicket(pbSpan.createdAt),
|
|
16907
|
+
start: pbSpan.start,
|
|
16908
|
+
end: pbSpan.end,
|
|
16909
|
+
value
|
|
16910
|
+
};
|
|
16911
|
+
};
|
|
16912
|
+
let restoreSpans;
|
|
16913
|
+
let retombstoneSpans;
|
|
16914
|
+
let restoreMode;
|
|
16915
|
+
if (pbEditOperation.restoreSpans.length || pbEditOperation.retombstoneSpans.length) {
|
|
16916
|
+
restoreSpans = pbEditOperation.restoreSpans.map(fromPbSpan);
|
|
16917
|
+
retombstoneSpans = pbEditOperation.retombstoneSpans.map(fromPbSpan);
|
|
16918
|
+
restoreMode = pbEditOperation.restoreMode === RestoreMode.RETOMBSTONE ? "retombstone" : "restore";
|
|
16919
|
+
}
|
|
16339
16920
|
return EditOperation.create(
|
|
16340
16921
|
fromTimeTicket(pbEditOperation.parentCreatedAt),
|
|
16341
16922
|
fromTextNodePos(pbEditOperation.from),
|
|
16342
16923
|
fromTextNodePos(pbEditOperation.to),
|
|
16343
16924
|
pbEditOperation.content,
|
|
16344
16925
|
attributes,
|
|
16345
|
-
|
|
16926
|
+
executedAt,
|
|
16927
|
+
restoreMode ? true : void 0,
|
|
16928
|
+
restoreSpans,
|
|
16929
|
+
restoreMode,
|
|
16930
|
+
retombstoneSpans
|
|
16346
16931
|
);
|
|
16347
16932
|
} else if (pbOperation.body.case === "style") {
|
|
16348
16933
|
const pbStyleOperation = pbOperation.body.value;
|
|
@@ -17025,6 +17610,25 @@ class ChangeContext {
|
|
|
17025
17610
|
setPresenceChange(presenceChange) {
|
|
17026
17611
|
this.presenceChange = presenceChange;
|
|
17027
17612
|
}
|
|
17613
|
+
/**
|
|
17614
|
+
* `hasPresenceChange` returns whether a presence change was registered
|
|
17615
|
+
* during this context. Used by `Document.update` to detect a presence
|
|
17616
|
+
* emit when the document was attached with `disablePresence: true`.
|
|
17617
|
+
*/
|
|
17618
|
+
hasPresenceChange() {
|
|
17619
|
+
return this.presenceChange !== void 0;
|
|
17620
|
+
}
|
|
17621
|
+
/**
|
|
17622
|
+
* `dropPresenceChange` clears any presence change registered during
|
|
17623
|
+
* this context. Used by `Document.update` to silently drop presence
|
|
17624
|
+
* emits on documents attached with `disablePresence: true`. After
|
|
17625
|
+
* dropping, the change carries only its operations (if any); when
|
|
17626
|
+
* the context was presence-only the resulting `hasChange()` returns
|
|
17627
|
+
* false and no `Change` is enqueued.
|
|
17628
|
+
*/
|
|
17629
|
+
dropPresenceChange() {
|
|
17630
|
+
this.presenceChange = void 0;
|
|
17631
|
+
}
|
|
17028
17632
|
/**
|
|
17029
17633
|
* `setReversePresence` registers the previous presence to undo presence updates.
|
|
17030
17634
|
*/
|
|
@@ -17048,6 +17652,16 @@ class ChangeContext {
|
|
|
17048
17652
|
}
|
|
17049
17653
|
return reversePresence;
|
|
17050
17654
|
}
|
|
17655
|
+
/**
|
|
17656
|
+
* `clearReversePresence` discards any reverse-presence keys recorded
|
|
17657
|
+
* during this context. Used by `Document.update` alongside
|
|
17658
|
+
* `dropPresenceChange` for documents attached with
|
|
17659
|
+
* `disablePresence: true`, so the dropped presence emit does not push
|
|
17660
|
+
* a no-op undo entry onto the history stack.
|
|
17661
|
+
*/
|
|
17662
|
+
clearReversePresence() {
|
|
17663
|
+
this.reversePresenceKeys.clear();
|
|
17664
|
+
}
|
|
17051
17665
|
/**
|
|
17052
17666
|
* `issueTimeTicket` creates a time ticket to be used to create a new operation.
|
|
17053
17667
|
*/
|
|
@@ -18949,7 +19563,9 @@ class Tree {
|
|
|
18949
19563
|
CRDTTreePos.fromStruct(range[0]),
|
|
18950
19564
|
CRDTTreePos.fromStruct(range[1])
|
|
18951
19565
|
];
|
|
18952
|
-
|
|
19566
|
+
const indexRange = this.tree.posRangeToIndexRange(posRange);
|
|
19567
|
+
this.registerPendingGCPairs();
|
|
19568
|
+
return indexRange;
|
|
18953
19569
|
}
|
|
18954
19570
|
/**
|
|
18955
19571
|
* `posRangeToPathRange` converts the position range into the path range.
|
|
@@ -18965,7 +19581,23 @@ class Tree {
|
|
|
18965
19581
|
CRDTTreePos.fromStruct(range[0]),
|
|
18966
19582
|
CRDTTreePos.fromStruct(range[1])
|
|
18967
19583
|
];
|
|
18968
|
-
|
|
19584
|
+
const pathRange = this.tree.posRangeToPathRange(posRange);
|
|
19585
|
+
this.registerPendingGCPairs();
|
|
19586
|
+
return pathRange;
|
|
19587
|
+
}
|
|
19588
|
+
/**
|
|
19589
|
+
* `registerPendingGCPairs` registers with the root any GC pairs the tree
|
|
19590
|
+
* buffered while resolving a position. `posRangeToIndexRange` and
|
|
19591
|
+
* `posRangeToPathRange` split text nodes to locate a position; when the
|
|
19592
|
+
* position lands inside a tombstoned node the split produces a
|
|
19593
|
+
* born-removed piece. Unlike edit/style/removeStyle, these read-path
|
|
19594
|
+
* conversions emit no operation, so the buffered pairs would otherwise
|
|
19595
|
+
* never reach the root and the piece would leak (invisible to GC).
|
|
19596
|
+
*/
|
|
19597
|
+
registerPendingGCPairs() {
|
|
19598
|
+
for (const pair of this.tree.drainPendingGCPairs()) {
|
|
19599
|
+
this.context.registerGCPair(pair);
|
|
19600
|
+
}
|
|
18969
19601
|
}
|
|
18970
19602
|
}
|
|
18971
19603
|
function createJSON(context, target) {
|
|
@@ -19208,6 +19840,10 @@ class CRDTRoot {
|
|
|
19208
19840
|
return;
|
|
19209
19841
|
}
|
|
19210
19842
|
this.gcPairMap.set(pair.child.toIDString(), pair);
|
|
19843
|
+
if (pair.gcOnlySize) {
|
|
19844
|
+
addDataSizes(this.docSize.gc, pair.gcOnlySize);
|
|
19845
|
+
return;
|
|
19846
|
+
}
|
|
19211
19847
|
const size = this.gcPairMap.get(pair.child.toIDString()).child.getDataSize();
|
|
19212
19848
|
addDataSizes(this.docSize.gc, size);
|
|
19213
19849
|
subDataSize(this.docSize.live, size);
|
|
@@ -19215,6 +19851,28 @@ class CRDTRoot {
|
|
|
19215
19851
|
this.docSize.live.meta += TimeTicketSize;
|
|
19216
19852
|
}
|
|
19217
19853
|
}
|
|
19854
|
+
/**
|
|
19855
|
+
* `unregisterGCPair` removes the given pair from the hash table. Called
|
|
19856
|
+
* when a tombstoned node is revived (un-tombstoned) by an
|
|
19857
|
+
* identity-preserving undo, so that a later re-registration (redo) is
|
|
19858
|
+
* not swallowed by the toggle in `registerGCPair`.
|
|
19859
|
+
*
|
|
19860
|
+
* NOTE: must be called AFTER the node's removedAt has been cleared, so
|
|
19861
|
+
* `getDataSize()` no longer includes the tombstone ticket.
|
|
19862
|
+
*/
|
|
19863
|
+
unregisterGCPair(pair) {
|
|
19864
|
+
const registered = this.gcPairMap.get(pair.child.toIDString());
|
|
19865
|
+
if (!registered) {
|
|
19866
|
+
return;
|
|
19867
|
+
}
|
|
19868
|
+
this.gcPairMap.delete(pair.child.toIDString());
|
|
19869
|
+
const size = pair.child.getDataSize();
|
|
19870
|
+
subDataSize(this.docSize.gc, size);
|
|
19871
|
+
addDataSizes(this.docSize.live, size);
|
|
19872
|
+
if (!(pair.child instanceof RHTNode)) {
|
|
19873
|
+
this.docSize.gc.meta -= TimeTicketSize;
|
|
19874
|
+
}
|
|
19875
|
+
}
|
|
19218
19876
|
/**
|
|
19219
19877
|
* `getElementMapSize` returns the size of element map.
|
|
19220
19878
|
*/
|
|
@@ -19277,6 +19935,10 @@ class CRDTRoot {
|
|
|
19277
19935
|
}
|
|
19278
19936
|
for (const [, pair] of this.gcPairMap) {
|
|
19279
19937
|
const removedAt = pair.child.getRemovedAt();
|
|
19938
|
+
if (!removedAt) {
|
|
19939
|
+
this.unregisterGCPair(pair);
|
|
19940
|
+
continue;
|
|
19941
|
+
}
|
|
19280
19942
|
if (removedAt && minSyncedVersionVector?.afterOrEqual(removedAt)) {
|
|
19281
19943
|
pair.parent.purge(pair.child);
|
|
19282
19944
|
subDataSize(this.docSize.gc, pair.child.getDataSize());
|
|
@@ -20099,6 +20761,17 @@ class Document {
|
|
|
20099
20761
|
// remote actors' version vectors into changeID, keeping each subsequent
|
|
20100
20762
|
// local Change's VV at O(1) for high-fan-out Counter workloads.
|
|
20101
20763
|
disableGC;
|
|
20764
|
+
// `disablePresence`, when true, declares that this document does not use
|
|
20765
|
+
// presence. The client sets it from the local option on construction and
|
|
20766
|
+
// overwrites it from the server-fixated value in the attach response. While
|
|
20767
|
+
// true, `Document.update`'s `presence.set` calls are silently dropped on
|
|
20768
|
+
// the way out (server enforcement is authoritative for the wire side).
|
|
20769
|
+
disablePresence;
|
|
20770
|
+
// `presenceDropWarned` ensures the silent-drop warning emitted by
|
|
20771
|
+
// `Document.update` for opt-in documents fires only once per document
|
|
20772
|
+
// lifetime. Otherwise long-lived counter-only documents would spam the
|
|
20773
|
+
// console on every well-meaning `presence.set` call.
|
|
20774
|
+
presenceDropWarned;
|
|
20102
20775
|
/**
|
|
20103
20776
|
* `history` is exposed to the user to manage undo/redo operations.
|
|
20104
20777
|
*/
|
|
@@ -20113,6 +20786,8 @@ class Document {
|
|
|
20113
20786
|
this.checkpoint = InitialCheckpoint;
|
|
20114
20787
|
this.localChanges = [];
|
|
20115
20788
|
this.disableGC = false;
|
|
20789
|
+
this.disablePresence = !!opts?.disablePresence;
|
|
20790
|
+
this.presenceDropWarned = false;
|
|
20116
20791
|
this.root = CRDTRoot.create();
|
|
20117
20792
|
this.presences = /* @__PURE__ */ new Map();
|
|
20118
20793
|
this.onlineClients = /* @__PURE__ */ new Set();
|
|
@@ -20160,6 +20835,16 @@ class Document {
|
|
|
20160
20835
|
} finally {
|
|
20161
20836
|
this.isUpdating = false;
|
|
20162
20837
|
}
|
|
20838
|
+
if (this.disablePresence && ctx.hasPresenceChange()) {
|
|
20839
|
+
ctx.dropPresenceChange();
|
|
20840
|
+
ctx.clearReversePresence();
|
|
20841
|
+
if (!this.presenceDropWarned) {
|
|
20842
|
+
this.presenceDropWarned = true;
|
|
20843
|
+
logger.warn(
|
|
20844
|
+
`[Document] "${this.key}" was attached with disablePresence=true; presence updates from Document.update are silently dropped.`
|
|
20845
|
+
);
|
|
20846
|
+
}
|
|
20847
|
+
}
|
|
20163
20848
|
const rules = this.getSchemaRules();
|
|
20164
20849
|
if (!ctx.isPresenceOnlyChange() && rules.length) {
|
|
20165
20850
|
const result = validateYorkieRuleset(this.clone?.root.getObject(), rules);
|
|
@@ -20529,6 +21214,24 @@ class Document {
|
|
|
20529
21214
|
setDisableGC(disableGC) {
|
|
20530
21215
|
this.disableGC = disableGC;
|
|
20531
21216
|
}
|
|
21217
|
+
/**
|
|
21218
|
+
* `setDisablePresence` records the server-fixated presence-disabled state
|
|
21219
|
+
* of this document. The client calls this on attach (before
|
|
21220
|
+
* `applyChangePack`) so any subsequent `Document.update` invocation sees
|
|
21221
|
+
* the gating state already settled. Flipping the flag at runtime is
|
|
21222
|
+
* supported: the next `update` honours the new value.
|
|
21223
|
+
*/
|
|
21224
|
+
setDisablePresence(disablePresence) {
|
|
21225
|
+
this.disablePresence = disablePresence;
|
|
21226
|
+
}
|
|
21227
|
+
/**
|
|
21228
|
+
* `isPresenceDisabled` returns the current presence-disabled state of
|
|
21229
|
+
* this document. Reflects the server-fixated value once attached;
|
|
21230
|
+
* before attach it reflects the local construction option.
|
|
21231
|
+
*/
|
|
21232
|
+
isPresenceDisabled() {
|
|
21233
|
+
return this.disablePresence;
|
|
21234
|
+
}
|
|
20532
21235
|
/**
|
|
20533
21236
|
* `isEnableDevtools` returns whether devtools is enabled or not.
|
|
20534
21237
|
*/
|
|
@@ -21266,6 +21969,14 @@ class Attachment {
|
|
|
21266
21969
|
* omit the response VersionVector. Documents only.
|
|
21267
21970
|
*/
|
|
21268
21971
|
disableGC;
|
|
21972
|
+
/**
|
|
21973
|
+
* `disablePresence` mirrors the server-fixated value returned by the
|
|
21974
|
+
* attach response. `pushPullChanges` does **not** read this — the
|
|
21975
|
+
* `disable_presence` wire field is request-only (set on the first
|
|
21976
|
+
* attach, ignored thereafter on the server side). Carried here for
|
|
21977
|
+
* devtools / debugging visibility. Documents only.
|
|
21978
|
+
*/
|
|
21979
|
+
disablePresence;
|
|
21269
21980
|
/**
|
|
21270
21981
|
* `unsubscribeLocalBroadcast` is set by `attachChannel` when it forwards
|
|
21271
21982
|
* a Channel's `local-broadcast` events to the RPC client, and consumed
|
|
@@ -21281,7 +21992,7 @@ class Attachment {
|
|
|
21281
21992
|
watchAbortController;
|
|
21282
21993
|
syncPromise;
|
|
21283
21994
|
_detaching = false;
|
|
21284
|
-
constructor(reconnectStreamDelay, resource, resourceID = "", syncMode, pollInterval = 0, pollIntervalPinned = false, disableGC = false) {
|
|
21995
|
+
constructor(reconnectStreamDelay, resource, resourceID = "", syncMode, pollInterval = 0, pollIntervalPinned = false, disableGC = false, disablePresence = false) {
|
|
21285
21996
|
this.reconnectStreamDelay = reconnectStreamDelay;
|
|
21286
21997
|
this.resource = resource;
|
|
21287
21998
|
this.resourceID = resourceID;
|
|
@@ -21291,6 +22002,7 @@ class Attachment {
|
|
|
21291
22002
|
this.pollInterval = pollInterval;
|
|
21292
22003
|
this.pollIntervalPinned = pollIntervalPinned;
|
|
21293
22004
|
this.disableGC = disableGC;
|
|
22005
|
+
this.disablePresence = disablePresence;
|
|
21294
22006
|
this.cancelled = false;
|
|
21295
22007
|
}
|
|
21296
22008
|
/**
|
|
@@ -21450,7 +22162,7 @@ function createAuthInterceptor(apiKey, token) {
|
|
|
21450
22162
|
};
|
|
21451
22163
|
}
|
|
21452
22164
|
const name$1 = "@yorkie-js/sdk";
|
|
21453
|
-
const version$1 = "0.7.
|
|
22165
|
+
const version$1 = "0.7.13";
|
|
21454
22166
|
const pkg$1 = {
|
|
21455
22167
|
name: name$1,
|
|
21456
22168
|
version: version$1
|
|
@@ -21751,7 +22463,8 @@ const DefaultClientOptions = {
|
|
|
21751
22463
|
syncLoopDuration: 50,
|
|
21752
22464
|
retrySyncLoopDelay: 1e3,
|
|
21753
22465
|
reconnectStreamDelay: 1e3,
|
|
21754
|
-
channelHeartbeatInterval: DefaultChannelHeartbeatMs
|
|
22466
|
+
channelHeartbeatInterval: DefaultChannelHeartbeatMs,
|
|
22467
|
+
deactivateOnUnload: true
|
|
21755
22468
|
};
|
|
21756
22469
|
const DefaultBroadcastOptions = {
|
|
21757
22470
|
maxRetries: Infinity,
|
|
@@ -21771,6 +22484,7 @@ class Client {
|
|
|
21771
22484
|
reconnectStreamDelay;
|
|
21772
22485
|
retrySyncLoopDelay;
|
|
21773
22486
|
channelHeartbeatInterval;
|
|
22487
|
+
deactivateOnUnload;
|
|
21774
22488
|
rpcClient;
|
|
21775
22489
|
setAuthToken;
|
|
21776
22490
|
taskQueue;
|
|
@@ -21804,6 +22518,7 @@ class Client {
|
|
|
21804
22518
|
this.reconnectStreamDelay = opts.reconnectStreamDelay ?? DefaultClientOptions.reconnectStreamDelay;
|
|
21805
22519
|
this.retrySyncLoopDelay = opts.retrySyncLoopDelay ?? DefaultClientOptions.retrySyncLoopDelay;
|
|
21806
22520
|
this.channelHeartbeatInterval = opts.channelHeartbeatInterval ?? DefaultClientOptions.channelHeartbeatInterval;
|
|
22521
|
+
this.deactivateOnUnload = opts.deactivateOnUnload ?? DefaultClientOptions.deactivateOnUnload;
|
|
21807
22522
|
const { authInterceptor, setToken } = createAuthInterceptor(this.apiKey);
|
|
21808
22523
|
this.setAuthToken = setToken;
|
|
21809
22524
|
const transportOptions = {
|
|
@@ -21882,9 +22597,14 @@ class Client {
|
|
|
21882
22597
|
this.deactivating = false;
|
|
21883
22598
|
this.runSyncLoop();
|
|
21884
22599
|
logger.info(`[AC] c:"${this.getKey()}" activated, id:"${this.id}"`);
|
|
21885
|
-
if (typeof window !== "undefined") {
|
|
21886
|
-
window.addEventListener("beforeunload",
|
|
21887
|
-
|
|
22600
|
+
if (typeof window !== "undefined" && this.deactivateOnUnload) {
|
|
22601
|
+
window.addEventListener("beforeunload", () => {
|
|
22602
|
+
void this.deactivate({ keepalive: true }).catch((err) => {
|
|
22603
|
+
logger.debug(
|
|
22604
|
+
`[DC] c:"${this.getKey()}" beforeunload deactivate failed:`,
|
|
22605
|
+
err
|
|
22606
|
+
);
|
|
22607
|
+
});
|
|
21888
22608
|
});
|
|
21889
22609
|
}
|
|
21890
22610
|
} catch (err) {
|
|
@@ -21972,7 +22692,10 @@ class Client {
|
|
|
21972
22692
|
);
|
|
21973
22693
|
}
|
|
21974
22694
|
doc.setActor(this.id);
|
|
21975
|
-
|
|
22695
|
+
const resolvedDisablePresence = opts.disablePresence ?? doc.isPresenceDisabled() ?? false;
|
|
22696
|
+
if (!resolvedDisablePresence) {
|
|
22697
|
+
doc.update((_, p) => p.set(opts.initialPresence || {}));
|
|
22698
|
+
}
|
|
21976
22699
|
const syncMode = opts.syncMode ?? "realtime";
|
|
21977
22700
|
if (opts.documentPollInterval !== void 0 && opts.documentPollInterval <= 0) {
|
|
21978
22701
|
throw new YorkieError(
|
|
@@ -21989,7 +22712,8 @@ class Client {
|
|
|
21989
22712
|
clientId: this.id,
|
|
21990
22713
|
changePack: converter.toChangePack(doc.createChangePack()),
|
|
21991
22714
|
schemaKey: opts.schema,
|
|
21992
|
-
disableGc: opts.disableGC ?? false
|
|
22715
|
+
disableGc: opts.disableGC ?? false,
|
|
22716
|
+
disablePresence: resolvedDisablePresence
|
|
21993
22717
|
},
|
|
21994
22718
|
{ headers: { "x-shard-key": `${this.apiKey}/${doc.getKey()}` } }
|
|
21995
22719
|
);
|
|
@@ -22002,6 +22726,7 @@ class Client {
|
|
|
22002
22726
|
}
|
|
22003
22727
|
const pack = converter.fromChangePack(res.changePack);
|
|
22004
22728
|
doc.setDisableGC(opts.disableGC ?? false);
|
|
22729
|
+
doc.setDisablePresence(res.disablePresence);
|
|
22005
22730
|
doc.applyChangePack(pack);
|
|
22006
22731
|
if (doc.getStatus() === DocStatus.Removed) {
|
|
22007
22732
|
return doc;
|
|
@@ -22016,7 +22741,8 @@ class Client {
|
|
|
22016
22741
|
syncMode,
|
|
22017
22742
|
pollInterval,
|
|
22018
22743
|
pollIntervalPinned,
|
|
22019
|
-
opts.disableGC ?? false
|
|
22744
|
+
opts.disableGC ?? false,
|
|
22745
|
+
res.disablePresence
|
|
22020
22746
|
)
|
|
22021
22747
|
);
|
|
22022
22748
|
if (syncMode !== "manual" && syncMode !== "polling") {
|
|
@@ -23534,7 +24260,7 @@ if (typeof globalThis !== "undefined") {
|
|
|
23534
24260
|
};
|
|
23535
24261
|
}
|
|
23536
24262
|
const name = "@yorkie-js/react";
|
|
23537
|
-
const version = "0.7.
|
|
24263
|
+
const version = "0.7.13";
|
|
23538
24264
|
const pkg = {
|
|
23539
24265
|
name,
|
|
23540
24266
|
version
|
|
@@ -23575,7 +24301,7 @@ function useYorkieClient(opts, activate = true) {
|
|
|
23575
24301
|
}
|
|
23576
24302
|
activateClient();
|
|
23577
24303
|
return () => {
|
|
23578
|
-
if (activate && client?.isActive()) {
|
|
24304
|
+
if (activate && client?.isActive() && opts.deactivateOnUnload !== false) {
|
|
23579
24305
|
client.deactivate({ keepalive: true });
|
|
23580
24306
|
}
|
|
23581
24307
|
};
|
|
@@ -23723,7 +24449,7 @@ function shallowEqual(valueA, valueB) {
|
|
|
23723
24449
|
valueB
|
|
23724
24450
|
);
|
|
23725
24451
|
}
|
|
23726
|
-
function useYorkieDocument(client, clientLoading, clientError, docKey, initialRoot, initialPresence, enableDevtools, syncMode, documentPollInterval, disableGC, docStore) {
|
|
24452
|
+
function useYorkieDocument(client, clientLoading, clientError, docKey, initialRoot, initialPresence, enableDevtools, syncMode, documentPollInterval, disableGC, disablePresence, docStore) {
|
|
23727
24453
|
const initialRootRef = useRef(initialRoot);
|
|
23728
24454
|
const initialPresenceRef = useRef(initialPresence);
|
|
23729
24455
|
const [didMount, setDidMount] = useState(false);
|
|
@@ -23751,7 +24477,10 @@ function useYorkieDocument(client, clientLoading, clientError, docKey, initialRo
|
|
|
23751
24477
|
loading: true,
|
|
23752
24478
|
error: void 0
|
|
23753
24479
|
}));
|
|
23754
|
-
const newDoc = new Document(docKey, {
|
|
24480
|
+
const newDoc = new Document(docKey, {
|
|
24481
|
+
enableDevtools,
|
|
24482
|
+
disablePresence
|
|
24483
|
+
});
|
|
23755
24484
|
const unsubs = [];
|
|
23756
24485
|
unsubs.push(
|
|
23757
24486
|
newDoc.subscribe(() => {
|
|
@@ -23784,7 +24513,8 @@ function useYorkieDocument(client, clientLoading, clientError, docKey, initialRo
|
|
|
23784
24513
|
initialPresence: initialPresenceRef.current,
|
|
23785
24514
|
syncMode,
|
|
23786
24515
|
documentPollInterval,
|
|
23787
|
-
disableGC
|
|
24516
|
+
disableGC,
|
|
24517
|
+
disablePresence
|
|
23788
24518
|
});
|
|
23789
24519
|
const update = (callback) => {
|
|
23790
24520
|
try {
|
|
@@ -23833,7 +24563,8 @@ function useYorkieDocument(client, clientLoading, clientError, docKey, initialRo
|
|
|
23833
24563
|
didMount,
|
|
23834
24564
|
syncMode,
|
|
23835
24565
|
documentPollInterval,
|
|
23836
|
-
disableGC
|
|
24566
|
+
disableGC,
|
|
24567
|
+
disablePresence
|
|
23837
24568
|
]);
|
|
23838
24569
|
}
|
|
23839
24570
|
const DocumentContext = createContext(void 0);
|
|
@@ -23845,6 +24576,7 @@ const DocumentProvider = ({
|
|
|
23845
24576
|
syncMode,
|
|
23846
24577
|
documentPollInterval,
|
|
23847
24578
|
disableGC,
|
|
24579
|
+
disablePresence,
|
|
23848
24580
|
children
|
|
23849
24581
|
}) => {
|
|
23850
24582
|
const { client, loading: clientLoading, error: clientError } = useYorkie();
|
|
@@ -23873,6 +24605,7 @@ const DocumentProvider = ({
|
|
|
23873
24605
|
syncMode,
|
|
23874
24606
|
documentPollInterval,
|
|
23875
24607
|
disableGC,
|
|
24608
|
+
disablePresence,
|
|
23876
24609
|
documentStore
|
|
23877
24610
|
);
|
|
23878
24611
|
return /* @__PURE__ */ jsx(DocumentContext.Provider, { value: documentStore, children });
|
|
@@ -23948,6 +24681,17 @@ const useRevisions = () => {
|
|
|
23948
24681
|
);
|
|
23949
24682
|
return { createRevision, listRevisions, getRevision, restoreRevision };
|
|
23950
24683
|
};
|
|
24684
|
+
const useRemoveDocument = () => {
|
|
24685
|
+
const { client } = useYorkie();
|
|
24686
|
+
const documentStore = useDocumentStore("useRemoveDocument");
|
|
24687
|
+
const doc = useSelector(documentStore, (store) => store.doc);
|
|
24688
|
+
return useCallback(async () => {
|
|
24689
|
+
if (!client || !doc) {
|
|
24690
|
+
throw new Error("Client or document is not ready");
|
|
24691
|
+
}
|
|
24692
|
+
await client.remove(doc);
|
|
24693
|
+
}, [client, doc]);
|
|
24694
|
+
};
|
|
23951
24695
|
const useDocumentStore = (hookName) => {
|
|
23952
24696
|
const documentStore = useContext(DocumentContext);
|
|
23953
24697
|
if (!documentStore) {
|
|
@@ -23993,6 +24737,7 @@ function useYorkieDoc(apiKey, docKey, opts) {
|
|
|
23993
24737
|
opts?.syncMode,
|
|
23994
24738
|
opts?.documentPollInterval,
|
|
23995
24739
|
opts?.disableGC,
|
|
24740
|
+
opts?.disablePresence,
|
|
23996
24741
|
documentStore
|
|
23997
24742
|
);
|
|
23998
24743
|
const documentState = useSelector(documentStore);
|
|
@@ -24260,6 +25005,7 @@ export {
|
|
|
24260
25005
|
useDocument,
|
|
24261
25006
|
usePeekChannel,
|
|
24262
25007
|
usePresences,
|
|
25008
|
+
useRemoveDocument,
|
|
24263
25009
|
useRevisions,
|
|
24264
25010
|
useRoot,
|
|
24265
25011
|
useYorkie,
|