@yorkie-js/react 0.7.12 → 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.
@@ -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 TimeTicketSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 28);
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";
@@ -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
- for (const [, removedNode] of removedNodes) {
9757
- pairs.push({ parent: this, child: removedNode });
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
+ }
9759
9925
  }
9760
- return [caretPos, pairs, diff, changes, removedValues];
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
+ }
10020
+ }
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
- removedNodes.set(node.getID().toIDString(), node);
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 [changes, pairs, diff, [caretPos, caretPos], removedValues];
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({ parent: this.rgaTreeSplit, child: node });
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(p);
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
- constructor(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp) {
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({ parent: this, child: node });
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.traverse((node) => {
13766
+ this.indexTree.traverseAll((node) => {
13230
13767
  if (node.getRemovedAt()) {
13231
- pairs.push({ parent: this, child: node });
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
- fromTimeTicket(pbEditOperation.executedAt)
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;
@@ -18978,7 +19563,9 @@ class Tree {
18978
19563
  CRDTTreePos.fromStruct(range[0]),
18979
19564
  CRDTTreePos.fromStruct(range[1])
18980
19565
  ];
18981
- return this.tree.posRangeToIndexRange(posRange);
19566
+ const indexRange = this.tree.posRangeToIndexRange(posRange);
19567
+ this.registerPendingGCPairs();
19568
+ return indexRange;
18982
19569
  }
18983
19570
  /**
18984
19571
  * `posRangeToPathRange` converts the position range into the path range.
@@ -18994,7 +19581,23 @@ class Tree {
18994
19581
  CRDTTreePos.fromStruct(range[0]),
18995
19582
  CRDTTreePos.fromStruct(range[1])
18996
19583
  ];
18997
- return this.tree.posRangeToPathRange(posRange);
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
+ }
18998
19601
  }
18999
19602
  }
19000
19603
  function createJSON(context, target) {
@@ -19237,6 +19840,10 @@ class CRDTRoot {
19237
19840
  return;
19238
19841
  }
19239
19842
  this.gcPairMap.set(pair.child.toIDString(), pair);
19843
+ if (pair.gcOnlySize) {
19844
+ addDataSizes(this.docSize.gc, pair.gcOnlySize);
19845
+ return;
19846
+ }
19240
19847
  const size = this.gcPairMap.get(pair.child.toIDString()).child.getDataSize();
19241
19848
  addDataSizes(this.docSize.gc, size);
19242
19849
  subDataSize(this.docSize.live, size);
@@ -19244,6 +19851,28 @@ class CRDTRoot {
19244
19851
  this.docSize.live.meta += TimeTicketSize;
19245
19852
  }
19246
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
+ }
19247
19876
  /**
19248
19877
  * `getElementMapSize` returns the size of element map.
19249
19878
  */
@@ -19306,6 +19935,10 @@ class CRDTRoot {
19306
19935
  }
19307
19936
  for (const [, pair] of this.gcPairMap) {
19308
19937
  const removedAt = pair.child.getRemovedAt();
19938
+ if (!removedAt) {
19939
+ this.unregisterGCPair(pair);
19940
+ continue;
19941
+ }
19309
19942
  if (removedAt && minSyncedVersionVector?.afterOrEqual(removedAt)) {
19310
19943
  pair.parent.purge(pair.child);
19311
19944
  subDataSize(this.docSize.gc, pair.child.getDataSize());
@@ -21529,7 +22162,7 @@ function createAuthInterceptor(apiKey, token) {
21529
22162
  };
21530
22163
  }
21531
22164
  const name$1 = "@yorkie-js/sdk";
21532
- const version$1 = "0.7.12";
22165
+ const version$1 = "0.7.13";
21533
22166
  const pkg$1 = {
21534
22167
  name: name$1,
21535
22168
  version: version$1
@@ -23627,7 +24260,7 @@ if (typeof globalThis !== "undefined") {
23627
24260
  };
23628
24261
  }
23629
24262
  const name = "@yorkie-js/react";
23630
- const version = "0.7.12";
24263
+ const version = "0.7.13";
23631
24264
  const pkg = {
23632
24265
  name,
23633
24266
  version