tg-map-vue3 4.1.3 → 4.1.5

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.
Files changed (54) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +9 -6
  3. package/dist/assets/404-D34FYbNB.js +2 -0
  4. package/dist/assets/404-D34FYbNB.js.map +1 -0
  5. package/dist/assets/ControlDemo-BvElkDpq.js +2 -0
  6. package/dist/assets/ControlDemo-BvElkDpq.js.map +1 -0
  7. package/dist/assets/CssPositionDemo-DbSCIYVw.js +2 -0
  8. package/dist/assets/CssPositionDemo-DbSCIYVw.js.map +1 -0
  9. package/dist/assets/HeatmapDemo-CKEH0W3g.js +2 -0
  10. package/dist/assets/HeatmapDemo-CKEH0W3g.js.map +1 -0
  11. package/dist/assets/InfoDemo-BSp_czCk.js +2 -0
  12. package/dist/assets/InfoDemo-BSp_czCk.js.map +1 -0
  13. package/dist/assets/LifecycleBugDemo-Bldh5GGg.js +2 -0
  14. package/dist/assets/LifecycleBugDemo-Bldh5GGg.js.map +1 -0
  15. package/dist/assets/Main-DGU58I8w.js +2 -0
  16. package/dist/assets/Main-DGU58I8w.js.map +1 -0
  17. package/dist/assets/MapDemo-Crw8VrAs.vue +155 -0
  18. package/dist/assets/MapDemo-Z4UTQNq5.js +2 -0
  19. package/dist/assets/MapDemo-Z4UTQNq5.js.map +1 -0
  20. package/dist/assets/MapTypeDemo-bv5WPraY.js +2 -0
  21. package/dist/assets/MapTypeDemo-bv5WPraY.js.map +1 -0
  22. package/dist/assets/MapUrlsDemo-D0075XSg.js +2 -0
  23. package/dist/assets/MapUrlsDemo-D0075XSg.js.map +1 -0
  24. package/dist/assets/MarkerDemo-D9YK-9Js.js +2 -0
  25. package/dist/assets/MarkerDemo-D9YK-9Js.js.map +1 -0
  26. package/dist/assets/MarkerDemo-D_C5RDUy.vue +200 -0
  27. package/dist/assets/MultiMapDemo-D-BWUDR1.js +2 -0
  28. package/dist/assets/MultiMapDemo-D-BWUDR1.js.map +1 -0
  29. package/dist/assets/OverlayDemo-BtSawKbN.js +2 -0
  30. package/dist/assets/OverlayDemo-BtSawKbN.js.map +1 -0
  31. package/dist/assets/PlaceDemo-DswQxAPt.js +2 -0
  32. package/dist/assets/PlaceDemo-DswQxAPt.js.map +1 -0
  33. package/dist/assets/ReactiveDemo-D5H5d9dh.js +2 -0
  34. package/dist/assets/ReactiveDemo-D5H5d9dh.js.map +1 -0
  35. package/dist/assets/ShapeDemo-CX9Jwa7y.js +2 -0
  36. package/dist/assets/ShapeDemo-CX9Jwa7y.js.map +1 -0
  37. package/dist/assets/ShapeDemo-t5GXEmrA.vue +162 -0
  38. package/dist/assets/TalksDemo-D0da45jA.js +2 -0
  39. package/dist/assets/TalksDemo-D0da45jA.js.map +1 -0
  40. package/dist/assets/V2Demo-vX7YCqCc.js +2 -0
  41. package/dist/assets/V2Demo-vX7YCqCc.js.map +1 -0
  42. package/dist/assets/index-C6IOkH7Y.css +1 -0
  43. package/dist/assets/index-DkG0ZlIx.js +352 -0
  44. package/dist/assets/index-DkG0ZlIx.js.map +1 -0
  45. package/dist/index.html +14 -0
  46. package/dist/src/components/TgMap.vue.d.ts +161 -153
  47. package/dist/src/components/controls/TgZoomControl.vue.d.ts +6 -0
  48. package/dist/src/components/overlays/TgInfoBox.vue.d.ts +2 -0
  49. package/package.json +6 -4
  50. package/dist/tg-map.cjs +0 -2
  51. package/dist/tg-map.cjs.map +0 -1
  52. package/dist/tg-map.css +0 -1
  53. package/dist/tg-map.js +0 -1421
  54. package/dist/tg-map.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"tg-map.js","sources":["../src/utils/vue-utils.ts","../src/components/map-mixin.ts","../src/components/TgMap.vue","../src/components/TgMapWidget.vue","../src/components/controls/TgCustomControl.vue","../src/components/controls/TgMapTypeControl.vue","../src/components/controls/TgScaleControl.vue","../src/utils/hooks.ts","../src/components/map-hooks.ts","../src/components/controls/TgStreetViewControl.vue","../src/components/controls/TgZoomControl.vue","../src/components/extra/TgHeatmap.vue","../src/components/extra/TgMarkerClusterer.vue","../src/components/layers/TgTrafficLayer.vue","../src/components/overlays/TgCircle.vue","../src/components/overlays/TgElementOverlay.vue","../src/components/overlays/TgMarker.vue","../src/components/overlays/TgInfoBox.vue","../src/components/overlays/TgInfoWindow.vue","../src/components/overlays/TgLabel.vue","../src/components/overlays/TgPolygon.vue","../src/components/overlays/TgPolyline.vue","../src/components/overlays/TgRectangle.vue","../src/utils/lifecycle-log.ts","../src/components/index.ts"],"sourcesContent":["import { noop } from 'tg-commons'\nimport { Strings, type AbstractConstructor, type EventCallback, type KeysMatching, type StringEnumLike, type StringEnumValue, type Thing } from 'tg-map-core'\nimport {\n computed,\n createCommentVNode,\n type Component,\n type ComponentOptions,\n type ComponentPublicInstance,\n type ComputedRef,\n type Prop,\n type PropType,\n type Ref,\n type RendererElement,\n type RendererNode,\n type Slots,\n type VNode,\n type WritableComputedOptions,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n type reactive,\n} from 'vue'\n/** 组件选项中的hook名 */\nexport type VueHookName = ExcludeSubtype<\n KeysMatching<OmitStartsWith<RemoveIndex<ComponentOptions>, '_'>, { (): void } | undefined>,\n 'serverPrefetch' | 'emits' | 'computed' | 'extends' | 'methods' | 'call' | undefined\n>\n\nexport type VueHookFunction = (this: ComponentPublicInstance) => void\n\n/**\n * 模仿Vue的计算属性的写法\n * @see ComputedOptions\n */\nexport type Property<T> = T | { (): T } | { get(): T, set?(value: T): void }\n\n/**\n * ## Vue2\n * 和typed()联合使用, 写成: `props: typed<Props<Options>>({...})`, 可以将`Options`作为属性的类型声明,\n * ### 注意\n * 1. 对于`Options`中可选的属性, 漏了VSCode不会报错...要小心\n * 2. `...`中理论上来说只要写Vue的纯js式的类型验证信息(Boolean/Number/String/Object/...)就行了, 并且还有ts的类型检查\n * 3. 对于`Options`中可选的`boolean`属性, 若将类型验证信息写为`Boolean`时, 该属性的默认值并不是`undefined`而是`false`, 这和它的类型声明(`boolean | undefined`)不匹配, 推荐写成`optionalProp(Boolean)`\n * 4. 因为存在上述特殊情况, 推荐使用{@link requiredProp},{@link optionalProp}等快捷方法写类型验证信息, 方法的传入参数直接写Vue的纯js式的类型验证信息, 就行了\n *\n * ## Vue3\n * 需要用`props: {...} satisfies Props<Options>`替代`typed()`, 防止{@link NotNullProp}被Vue看成必选的属性\n * */\nexport type Props<T> = {\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n [K in keyof T]-?: T[K] extends {} ? NotNullProp<T[K]> : Prop<Exclude<T[K], undefined>>\n}\n/** 表示一个非空的Prop, `required`为true 或者 设置了`default`的{@link Prop}, 才是非空的Prop */\ntype NotNullProp<T = any, D = T> = { type: PropType<T> } & ({ required: true } | { default: D | (() => D) })\n\nexport function stringEnumProp<E extends StringEnumLike>(enumObject: E, defaultValue: E[keyof E]): { type: PropType<StringEnumValue<E>>, default: E[keyof E] }\nexport function stringEnumProp<E extends StringEnumLike>(enumObject: E): { type: PropType<StringEnumValue<E>> }\n/**\n * 注意: 由于使用了`Object.values(enumObject)`来获取所有枚举值\n * - 若enumObject为数字枚举, 获取出来的值会同时包含枚举名和枚举值, 故不支持\n * - 若enumObject同时是命名空间名, 获取出来的值会包含命名空间上的方法, 应当避免\n *\n * @param enumObject 枚举对象\n * @param defaultValue 默认值\n * @see https://frontendsociety.com/using-a-typescript-interfaces-and-types-as-a-prop-type-in-vuejs-508ab3f83480\n * */\nexport function stringEnumProp<E extends StringEnumLike>(enumObject: E, defaultValue?: E[keyof E]): Prop<StringEnumValue<E>> {\n return {\n type: String as any,\n default: defaultValue,\n validator: (value: E[keyof E]) => Object.values(enumObject).includes(value),\n }\n}\n\nexport function stringUnionPropFromValues<T extends string>(values: readonly T[], defaultValue: T): { type: PropType<T[][number]>, default: T }\nexport function stringUnionPropFromValues<T extends string>(values: readonly T[]): { type: PropType<T[][number]> }\n/** 使用方法重载, 声明`是否提供defaultValue`和`返回值是否可undefined`的关系_(:3」∠)_ */\nexport function stringUnionPropFromValues<T extends string>(values: readonly T[], defaultValue?: T): Prop<T[][number]> {\n return {\n type: String as any,\n default: defaultValue,\n validator: (value: T) => values.includes(value),\n }\n}\n\nexport function requiredProp<T>(type: PropType<T>): { type: PropType<T>, required: true } {\n return {\n type: type,\n required: true,\n }\n}\n\nexport function optionalProp<T>(type: PropType<T>, defaultValue: T | (() => T)): { type: PropType<T>, default: T }\nexport function optionalProp<T>(type: PropType<T>): { type: PropType<T> }\nexport function optionalProp<T>(type: PropType<T>, defaultValue?: T | (() => T)): Prop<T> {\n return {\n type: type,\n default: defaultValue,\n }\n}\n\n/**\n * 保存在this上的属性\n * @param defaultValues 属性的默认值\n *\n * @deprecated Vue3中已经不支持`cache: false`的计算属性, 使用setup中返回普通的值替代\n */\nexport function computedSaveOnThis<T>(defaultValues: { [K in keyof T]: T[K] }): { [K in keyof T]: WritableComputedOptions<T[K]> } {\n const accessors: any = {}\n Object.entries(defaultValues).forEach(([key, defaultValue]) => {\n const name = `__${key}`\n accessors[key] = {\n get() {\n const value = this[name]\n return value === undefined ? defaultValue : value\n },\n set(value: any) {\n this[name] = value\n },\n // Vue3已经不支持该属性\n // cache: false\n }\n })\n return accessors\n}\n\n// 这个对象是可以共享的~~\nconst sharedPropertyDefinition: PropertyDescriptor = {\n enumerable: true,\n configurable: true,\n get: noop,\n set: noop,\n}\n\n/**\n * 模仿Vue的计算属性的写法, 将方法转换成属性\n * @deprecated 在Vue2时用来将provide的方法转换成属性, 方便使用, Vue3中不生效, 故废弃\n */\nexport function createPropertyObject(obj: any): any {\n Object.keys(obj).forEach(key => {\n const value = obj[key]\n let redefined = false\n if (typeof value === 'function') {\n sharedPropertyDefinition.get = value\n sharedPropertyDefinition.set = noop\n redefined = true\n } else if (typeof value === 'object' && typeof value.get === 'function') {\n sharedPropertyDefinition.get = value.get\n sharedPropertyDefinition.set = value.set\n redefined = true\n }\n if (redefined) {\n obj[key] = Object.defineProperty(obj, key, sharedPropertyDefinition)\n }\n })\n return obj\n}\n\n/**\n * 相比{@link createPropertyObject}增加类型信息\n * @see createPropertyObject\n * @deprecated Vue3中没用\n * */\nexport function createPropertyObjectTyped<T>(obj: { [K in keyof T]: Property<T[K]> }): T {\n return createPropertyObject(obj)\n}\n\n/**\n * 创建空节点\n *\n * Vue2中使用`this._e()`创建空节点: https://github.com/vuejs/vue/blob/b6247fc9d7442c50d60ccf366a7cb183a4d02129/src/core/instance/render-helpers/index.js#L28\n *\n * Vue3中等价的实现是{@link createCommentVNode}: https://github.com/vuejs/core/blob/650f5c26f464505d9e865bdb0eafb24350859528/packages/runtime-core/src/compat/instance.ts#L162\n */\nexport function createEmptyVNode(): VNode {\n return createCommentVNode()\n}\n/**\n * @see https://github.com/vuejs/vue/blob/43b98fe25151b0b6bacd36f3ee27c5d61add5fdb/packages/weex-vue-framework/factory.js/#L2906\n * */\nexport function callHook(vm: ComponentPublicInstance, hookName: VueHookName) {\n // $options中的每个hook函数被合并成一个数组了\n const hooks: Array<VueHookFunction> | undefined = (vm.$options as any)[hookName]\n if (!hooks) {\n return\n }\n for (const hook of hooks) {\n hook.call(vm)\n }\n}\n\n/**\n * {@link import('./mapped-types.ts').safeAsComponent}\n * @deprecated Vue3已经不能遍历子组件的实例了, 所以这个方法目前没用\n */\nexport function findByComponentType<T extends Component & AbstractConstructor>(\n arr: ComponentPublicInstance[],\n component: T,\n): InstanceType<T> | undefined {\n for (const item of arr) {\n // TO-DO: 2023/03/16 ipcjs 有没有更好的判断组件实例的方式?\n // => 目前没找到\n if (item.$options.name === component.name) {\n return item as InstanceType<T>\n }\n }\n return undefined\n}\n\n/**\n * 通过构造slots内容的方式, 提取出slots中对应{@link component}的VNode, {@link VNode.props}就是当前给组件设置的属性值\n *\n * 注意, 该方法并无法获取到{@link component}的实例\n *\n * @see https://stackoverflow.com/questions/64154002/vue-3-how-to-get-information-about-children\n */\nexport function extractVNodeFromSlotsByComponent<Props>(slots: Slots, component: ComponentOptions<Props>) {\n if (!slots.default) return undefined\n\n const nodeList = slots.default()\n for (const node of nodeList) {\n if ((node?.type as Component).name === component.name) {\n return node as VNode<RendererNode, RendererElement, Props>\n }\n }\n return undefined\n}\n\n/**\n * Vue3中 class/style/未声明的事件/未声明的属性 都会集合到`this.$attrs`中\n * 默认情况下(`inheritAttrs`为true), 将被透传给组件的根节点\n *\n * 而Vue2, `this.$attrs`值包含 未声明的属性, 所有事件放到了`this.$listeners`中\n *\n * 这里模仿Vue2的行为, 从{@link attrs}中拆分出未声明的事件, 方便将他们透传给地图的对象\n * 同时若传入{@link props}, 也会从它里面拆分出 声明的事件类型的属性\n *\n * ## 如何给事件添加类型信息\n *\n * - 声明在`emits`中的事件, 会给emit方法添加类型信息, 但没办法在运行时判断是否有被设置\n * - 声明在`props`中的事件, 不会.................. , 但可以通过读取`this.$props`判断是否被设置\n *\n * 所有我们最终选择用{@link EventProps}在`props`中声明事件, 同时用{@link EventEmits}在`emits`上声明事件的类型,\n * 达到既有类型信息, 又能判断是否存在的效果, 写法如下:\n * ```\n * {\n * props: {...} satisfies EventProps<TgMapEmits>,\n * emits: undefined as any as EventEmits<TgMapEmits>,\n * }\n * ```\n *\n * ## 参考\n * - https://cn.vuejs.org/guide/components/attrs.html#disabling-attribute-inheritance\n * - https://v3-migration.vuejs.org/zh/breaking-changes/listeners-removed.html\n * - https://eslint.vuejs.org/rules/require-explicit-emits.html#options\n */\nexport function splitAttrs(attrs: Record<string, unknown>, props?: Record<string, unknown>) {\n const listeners: Record<string, unknown> = {}\n const binds: Record<string, unknown> = {}\n const listenerProps: Record<string, unknown> = {}\n Object.keys(attrs).forEach(key => {\n if (key.startsWith('on')) {\n listeners[Strings.pascal2kebab(key.substring(2))] = attrs[key]\n } else {\n binds[key] = attrs[key]\n }\n })\n if (props) {\n Object.keys(props).forEach(key => {\n if (key.startsWith('on')) {\n listenerProps[Strings.pascal2kebab(key.substring(2))] = props[key]\n }\n })\n }\n return {\n /** class/style/未声明的属性 等 */\n binds,\n /** 未声明的事件 */\n listeners,\n /** 声明在`props`中的事件 */\n listenerProps,\n }\n}\n\n/** 响应式的{@link splitAttrs} */\nexport function useSplittedAttrs(attrs: Record<string, unknown>, props?: Record<string, unknown>) {\n return computed(() => splitAttrs(attrs, props))\n}\n\n/**\n * 事件类型的属性\n * @see splitAttrs\n * */\nexport type EventProps<Emits> = Emits extends string\n // 转换 简单的String Union, 类型使用Function, 是为了简便, 省得写详细的类型信息\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n ? { [K in Emits as `on${Capitalize<K>}`]: Prop<Function> }\n // 转换 事件名=>事件类型的映射\n : {\n [K in keyof Emits as K extends string ? `on${Capitalize<K>}` : never]: Prop<EventCallback<Emits[K]>>\n }\n\n/**\n * 用来声明事件的类型信息\n * @see splitAttrs\n * */\nexport type EventEmits<T> = {\n [K in keyof T]: (event: T[K]) => boolean\n}\n\n/** 给事件类型的属性标注类型 */\nexport function eventProp<E = any>(): Prop<EventCallback<E>> {\n return Function as PropType<EventCallback<E>>\n}\n\nexport const useEventLogMethods = () => {\n let prevType: Thing | undefined\n let prevTime: number | undefined\n /**\n * @event 一般来说传{@link Tg.Event}对象, 但传其他对象也不会报错\n */\n function eventLog(event: Thing | null | undefined) {\n console.log(event)\n prevType = event && (event as any).type\n prevTime = Date.now()\n }\n /** @see eventLog */\n function eventLogLess(this: any, event: Thing | null | undefined) {\n if ((event && (event as any).type) !== prevType || Date.now() - (prevTime ?? 0) > 1000) {\n eventLog(event)\n }\n }\n return { eventLog, eventLogLess }\n}\n\n/**\n * 值可能是Ref的对象\n * 可以用来给{@link reactive}的参数做类型约束\n * */\nexport type MaybeWrapRefs<T> = {\n [P in keyof T]: Ref<T[P]> | T[P] | ComputedRef<T[P]>\n}\n\n/** 判断{@link instance}是否是{@link component}的实例 */\nexport function isComponentByType<C extends Component & AbstractConstructor>(\n instance: ComponentPublicInstance | null,\n component: C,\n): instance is InstanceType<C> {\n // TODO: 2023/03/15 ipcjs 看有没有其他更好的方式判断组件类型\n return instance?.$options.name === component.name\n}\n\n/** 安全转换组件类型, 若不能转换会返回`undefined` */\nexport function safeAsComponent<C extends Component & AbstractConstructor>(\n instance: ComponentPublicInstance | null,\n component: C,\n): InstanceType<C> | undefined {\n return isComponentByType(instance, component) ? instance : undefined\n}\n\n/**\n * 查找[startInstance, endComponent)之间的第一个类型为{@link component}的父组件\n * @param component 查找的组件\n * @param startInstance 查找的开始实例, 包含\n * @param endComponent 查找的终止组件, 不包含\n * @returns\n */\nexport function findAncestorComponentByType<C extends Component & AbstractConstructor>(\n component: C,\n startInstance: ComponentPublicInstance | null,\n endComponent?: Component & AbstractConstructor,\n): InstanceType<C> | undefined {\n let instance = startInstance\n while (instance) {\n if (isComponentByType(instance, component)) {\n return instance\n } else if (endComponent && isComponentByType(instance, endComponent)) {\n return undefined\n } else {\n instance = instance.$parent\n }\n }\n return undefined\n}\n","import type { BaseMap } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { callHook, createEmptyVNode } from '../utils/vue-utils'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { useTgMapInner } from './map-hooks'\n\nexport const MIXIN_MAP_NAME = '$map'\nexport const MIXIN_HOOK_CREATE = 'onCreate'\nexport const MIXIN_HOOK_DESTROY = 'onDestroy'\n\ndeclare module 'vue' {\n interface ComponentCustomProperties {\n /** 混合了MapMixin的Vue才会有该属性 */\n [MIXIN_MAP_NAME]: BaseMap,\n /** 混合了MapMixin的Vue才会有该属性, 会依次调用onDestroy + onCreate, 你应该在这两个hook中分别实现 移除 和 创建并添加 覆盖物的逻辑 */\n recreate: () => void,\n }\n\n interface ComponentCustomOptions {\n [MIXIN_HOOK_CREATE]?(): void\n [MIXIN_HOOK_DESTROY]?(): void\n }\n}\n\n/** @deprecated 使用{@link useTgMapInner}替代 */\nconst MapMixin = defineComponent({\n inject: [MIXIN_MAP_NAME],\n mounted() {\n // children先执行, parent后执行\n // parent中可以读取到this.$children, 参见: TgMarkerClusterer\n callHook(this, MIXIN_HOOK_CREATE)\n },\n beforeUnmount() {\n // parent先执行, children后执行\n callHook(this, MIXIN_HOOK_DESTROY)\n },\n methods: {\n recreate() {\n callHook(this, MIXIN_HOOK_DESTROY)\n callHook(this, MIXIN_HOOK_CREATE)\n },\n },\n render() {\n return createEmptyVNode()\n },\n})\n\nexport default MapMixin\n","<template>\n <div class=\"tg-map\" v-bind=\"attrs.binds\">\n <div\n ref=\"map\"\n :class=\"{\n 'tg-map__map': true,\n [`tg-map__map--hide-logo-${type}`]: hideLogo\n }\"\n ></div>\n <div v-if=\"false\" style=\"position:absolute;right:0px;top:0px;\">\n props:{{ propsJson }}\n </div>\n <template v-if=\"map\">\n <slot></slot>\n </template>\n <slot name=\"overlay\"></slot>\n </div>\n</template>\n<script lang=\"ts\">\nimport { typed } from 'tg-commons'\nimport { bindEvents, BuildInMapTypeId, GestureHandlingOptions, InfoWindowModeValues, LatLng, loadCachedMap, MapType, Objects, TgMapFactory, TgMapType, unwrapStringEnumValue, type AbstractMap, type AbstractMapEventMap, type BaseMap, type MapOptions, type MapStyle, type StringEnumValue, type WrapStringEnumValue } from 'tg-map-core'\nimport { computed, defineComponent, markRaw, watch, type PropType } from 'vue'\nimport { eventProp, optionalProp, requiredProp, stringEnumProp, stringUnionPropFromValues, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../utils/vue-utils'\nimport { MIXIN_MAP_NAME } from './map-mixin'\n\ntype TgMapEmits = {\n load: AbstractMap,\n error: any,\n 'update:center': LatLng,\n 'update:current-center': LatLng,\n 'update:zoom': number,\n 'update:map-type': MapType,\n 'update:map-type-id': string,\n 'update:last-center': LatLng,\n}\n\nexport const tgMapProps = {\n /** type没做响应式, 但外部可以把type作为tg-map的key, 让type修改时完全重建tg-map */\n type: stringEnumProp(TgMapType, TgMapType.google),\n /**\n * 当对该属性使用双向绑定时, 改变center将触发update:center又反过来触发center改变, 最终导致无限循环...\n * 当前通过setCenter()时判断center是否有改变来避免该问题, 但为了避免可能存在的问题, 另外设计了如下机制:\n * - :center-sync-delay=\"300\": 延时同步center, 防止center的值更新过快\n * - :current-center.sync=\"currentCenter\": 实时获取center的值\n * - :last-center.sync=\"center\": 获取tg-map销毁时的最后的center的值, 使用这种方式可以做到type切换时保留中心点位置\n * @see AbstractMapEventMap.center-changed\n */\n center: requiredProp(LatLng),\n /**\n * 同步center的延时\n * @default 300\n * @see center\n */\n centerSyncDelay: optionalProp(Number, 300),\n /**\n * 仅用来获取center的值, 需要设置center的值请使用`center`属性\n * @see center\n * @deprecated 用的太少, 故maptalks未实现该属性, 要实时获取中心点, 请将{@link centerSyncDelay}设为0\n */\n currentCenter: optionalProp(LatLng),\n /**\n * 仅用于获取tg-map销毁时的最后的center的值\n * @see center\n * @deprecated 用的太少, 故maptalks未实现该属性\n */\n lastCenter: optionalProp(LatLng),\n zoom: requiredProp(Number),\n /**\n * 该属性不会响应式更新, 要让它立即生效, 请参考{@link file://./../views/map/InfoDemo.vue#L3}\n * @see MapOptions.infoWindowMode\n */\n infoWindowMode: stringUnionPropFromValues(InfoWindowModeValues),\n gestureHandling: stringEnumProp(GestureHandlingOptions),\n minZoom: optionalProp(Number),\n maxZoom: optionalProp(Number),\n mapStyle: optionalProp(Object as PropType<MapStyle>),\n mapTypeId: stringEnumProp(BuildInMapTypeId),\n /** 地图类型对象, 优先级比mapTypeId高 */\n mapType: optionalProp(Object),\n hideLogo: optionalProp(Boolean),\n onLoad: eventProp(),\n 'onUpdate:center': eventProp(),\n 'onUpdate:current-center': eventProp(),\n 'onUpdate:last-center': eventProp(),\n 'onUpdate:map-type': eventProp(),\n 'onUpdate:map-type-id': eventProp(),\n 'onUpdate:zoom': eventProp(),\n onError: eventProp(),\n} satisfies Props<WrapStringEnumValue<Omit<MapOptions, 'buildInMapTypeId'>, {\n gestureHandling: typeof GestureHandlingOptions,\n}> & {\n type: StringEnumValue<typeof TgMapType>,\n currentCenter?: LatLng,\n lastCenter?: LatLng,\n centerSyncDelay: number,\n mapTypeId?: StringEnumValue<typeof BuildInMapTypeId>,\n mapType?: MapType\n hideLogo?: boolean\n}> & EventProps<TgMapEmits>\n\nexport type TgMapEventEmits = EventEmits<AbstractMapEventMap & TgMapEmits>\n\nexport default defineComponent({\n name: 'tg-map',\n provide() {\n return {\n [MIXIN_MAP_NAME]: computed(() => this.map),\n }\n },\n inheritAttrs: false,\n props: tgMapProps,\n /** 声明事件的类型信息, 详见: {@link splitAttrs} */\n emits: undefined as any as TgMapEventEmits,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n centerSyncTimeoutId: undefined as TimeoutId | undefined,\n }\n },\n data() {\n return {\n map: typed<BaseMap>(),\n isDestroyed: false,\n }\n },\n computed: {\n propsJson() {\n return Objects.toJsonSafely(this.$props)\n },\n },\n watch: {\n gestureHandling(value?: StringEnumValue<typeof GestureHandlingOptions>) {\n if (value) {\n this.map?.setGestureHandling(unwrapStringEnumValue(value, GestureHandlingOptions))\n }\n },\n minZoom(value) {\n this.map?.setMinZoom(value)\n },\n maxZoom(value) {\n this.map?.setMaxZoom(value)\n },\n mapStyle(value?: MapStyle) {\n this.map?.setMapStyle(value)\n },\n mapTypeId(value?: StringEnumValue<typeof BuildInMapTypeId>) {\n if (value) {\n this.map?.setBuildInMapTypeId(unwrapStringEnumValue(value, BuildInMapTypeId))\n }\n },\n mapType(value?: MapType) {\n this.map?.setMapType(value ?? MapType.NORMAL)\n },\n },\n async mounted() {\n // type的值需要局部化, 防止外部修改\n const type = unwrapStringEnumValue(this.type, TgMapType)\n try {\n await loadCachedMap(type)\n } catch (e) {\n this.$emit('error', e)\n return\n }\n if (this.isDestroyed) {\n console.warn(`tg-map(type=${type})已销毁, 不需要继续执行`)\n return\n }\n // options不要直接传this, 因为createMap方法内部会修改options...\n const map = TgMapFactory.createMap(type, this.$refs.map as HTMLElement, /* options: */{\n center: this.center,\n zoom: this.zoom,\n infoWindowMode: this.infoWindowMode,\n gestureHandling: unwrapStringEnumValue(this.gestureHandling, GestureHandlingOptions),\n minZoom: this.minZoom,\n maxZoom: this.maxZoom,\n mapStyle: this.mapStyle,\n buildInMapTypeId: unwrapStringEnumValue(this.mapTypeId, BuildInMapTypeId),\n })\n // map是复杂对象, 不需要转换成响应式对象\n this.map = markRaw(map)\n if (this.mapType) {\n map.setMapType(this.mapType)\n }\n\n // 未声明ready事件, 所以需要从attrs.listeners中查找是否存在\n if ('ready' in this.attrs.listeners) {\n console.error('地图载入完成的事件已经从ready改为了load, 请手动修改')\n }\n bindEvents(this.attrs.listeners, map, /* excludes: */['load'])\n // 需要先发送load(载入完成)事件, 保证外部能够获取到map对象\n this.$emit('load', map)\n\n // Baidu地图的setZoom/Center是区分顺序的, 若同时修改它们, 必须先setZoom再setCenter, 否则中心点会出现偏移\n // Google地图没这个问题\n // 为了规避该问题, 同时监听它们两个, 并按顺序执行set方法\n watch([\n () => this.zoom,\n () => this.center, //\n ], ([zoom, center], [oldZoom, oldCenter]) => {\n if (zoom !== oldZoom) {\n import.meta.env.DEV && console.debug('<tg-map> setZoom', center)\n map.setZoom(zoom)\n }\n if (center !== oldCenter) {\n const currentCenter = map.getCenter()\n if (!currentCenter.equals(center)) {\n import.meta.env.DEV && console.debug('<tg-map> setCenter', center)\n map.setCenter(center)\n }\n }\n })\n\n // 处理v-model(双向绑定)\n if (this.attrs.listenerProps['update:center']) {\n const updateCenter = () => this.$emit('update:center', map.getCenter())\n map.addEventListener('center-changed', () => {\n if (this.centerSyncDelay > 0) {\n clearTimeout(this.centerSyncTimeoutId)\n this.centerSyncTimeoutId = setTimeout(updateCenter, this.centerSyncDelay)\n } else {\n updateCenter()\n }\n })\n }\n if (this.attrs.listenerProps['update:current-center']) {\n // 初始值也得emit出去\n this.$emit('update:current-center', this.center)\n map.addEventListener('center-changed', () => {\n this.$emit('update:current-center', map.getCenter())\n })\n }\n if (this.attrs.listenerProps['update:zoom']) {\n map.addEventListener('zoom-changed', () => {\n this.$emit('update:zoom', map.getZoom())\n })\n }\n const isUpdateMapType = this.attrs.listenerProps['update:map-type']\n const isUpdateMapTypeId = this.attrs.listenerProps['update:map-type-id']\n if (isUpdateMapType || isUpdateMapTypeId) {\n map.addEventListener('map-type-changed', () => {\n const mapType = map.getMapType()\n isUpdateMapType && this.$emit('update:map-type', mapType)\n isUpdateMapTypeId && this.$emit('update:map-type-id', mapType.id)\n })\n }\n },\n unmounted() {\n this.isDestroyed = true\n if (this.map) {\n if (this.attrs.listenerProps['update:last-center']) {\n this.$emit('update:last-center', this.map.getCenter())\n }\n if (this.attrs.listenerProps['update:center']) {\n clearTimeout(this.centerSyncTimeoutId)\n // 最终的值一定要更新出去, 保证切换地图时center的位置能够保持\n this.$emit('update:center', this.map.getCenter())\n }\n }\n },\n methods: {\n },\n})\n</script>\n\n<style lang=\"scss\">\n.tg-map {\n height: 100%;\n position: relative;\n\n &__map {\n width: 100%;\n height: 100%;\n\n &--hide-logo-google {\n .gm-style {\n // 隐藏logo\n a[target=\"_blank\"]:has(>div>img) {\n display: none !important;\n }\n\n // 隐藏右下角的Keyboard shortcuts/Terms of Use等\n &>div:last-child>div:last-child>div {\n display: none;\n }\n }\n }\n\n &--hide-logo-baidu {\n // 隐藏logo\n div.anchorBL>a[target=\"_blank\"]>img {\n display: none;\n }\n\n // 隐藏左下角的版权信息\n div.BMap_cpyCtrl {\n display: none;\n }\n }\n }\n}\n</style>\n","<template>\n <div :class=\"$options.name\" :style=\"{ left: dimen(left), top: dimen(topValue), right: dimen(right), bottom: dimen(bottom) }\">\n <slot></slot>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { dimen } from 'tg-map-core'\nimport { defineComponent } from 'vue'\n/** TgMap上的Widget, 只是对绝对布局进行简单的封装 */\nexport default defineComponent({\n name: 'tg-map-widget',\n props: {\n left: {\n type: [Number, String],\n default: null,\n },\n top: {\n type: [Number, String],\n default: null,\n },\n right: {\n type: [Number, String],\n default: null,\n },\n bottom: {\n type: [Number, String],\n default: null,\n },\n },\n computed: {\n topValue() {\n // 防止默认看不到组件\n return this.top == null && this.bottom == null ? 0 : this.top\n },\n },\n methods: {\n dimen,\n },\n})\n</script>\n<style lang=\"scss\">\n.tg-map-widget {\n position: absolute;\n}\n</style>\n","<template>\n <div :class=\"$options.name\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { ControlPosition, CustomControl, type StringEnumValue, unwrapStringEnumValue } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { type Props, safeAsComponent, stringEnumProp } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nimport TgMap from '../TgMap.vue'\n\nexport default defineComponent({\n name: 'tg-custom-control',\n mixins: [MapMixin],\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.RIGHT_BOTTOM),\n } satisfies Props<{\n position: StringEnumValue<typeof ControlPosition>\n }>,\n setup() {\n return {\n control: lateinit<CustomControl>(),\n }\n },\n watch: {\n position() {\n this.recreate()\n },\n },\n onCreate() {\n if (!safeAsComponent(this.$parent, TgMap)) {\n console.warn('请将tg-custom-control放到tg-map中')\n }\n const { $el } = this\n const C = class extends CustomControl {\n onCreateElement() {\n return $el as HTMLElement\n }\n }\n this.control = new C(unwrapStringEnumValue(this.position, ControlPosition))\n this.$map.addCustomControl(this.control)\n },\n onDestroy() {\n this.$map.removeCustomControl(this.control)\n },\n})\n</script>\n<style lang=\"scss\">\n// 当作为tg-map的直接child时不显示\n.tg-map > .tg-custom-control {\n display: none;\n}\n</style>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { ControlPosition, type MapTypeControl, type MapTypeControlOptions, MapTypeControlType, unwrapStringEnumValue, type WrapStringEnumValue } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { optionalProp, type Props, stringEnumProp } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\n\nexport default defineComponent({\n name: 'tg-map-type-control',\n mixins: [MapMixin],\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.TOP_LEFT),\n type: stringEnumProp(MapTypeControlType),\n mapTypes: optionalProp(Array as any),\n } satisfies Props<WrapStringEnumValue<MapTypeControlOptions, {\n position: typeof ControlPosition,\n type: typeof MapTypeControlType\n }>>,\n setup() {\n return {\n control: lateinit<MapTypeControl>(),\n }\n },\n watch: {\n position(value) {\n this.control.setPosition(value)\n },\n type() {\n this.recreate()\n },\n mapTypes: {\n handler() {\n this.recreate()\n },\n deep: true,\n },\n },\n onCreate() {\n this.control = this.$map.createMapTypeControl(unwrapStringEnumValue(this))\n this.$map.addControl(this.control)\n },\n onDestroy() {\n this.$map.removeControl(this.control)\n },\n})\n\n</script>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { ControlPosition, type ScaleControl, type ScaleControlOptions, type WrapStringEnumValue, unwrapStringEnumValue } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { type Props, stringEnumProp } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nexport default defineComponent({\n name: 'tg-scale-control',\n mixins: [MapMixin],\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.BOTTOM_RIGHT),\n } satisfies Props<WrapStringEnumValue<ScaleControlOptions, {\n position: typeof ControlPosition\n }>>,\n setup() {\n return {\n control: lateinit<ScaleControl>(),\n }\n },\n watch: {\n position(value) {\n this.control.setPosition(value)\n },\n },\n onCreate() {\n this.control = this.$map.createScaleControl(unwrapStringEnumValue(this))\n this.$map.addControl(this.control)\n },\n onDestroy() {\n this.$map.removeControl(this.control)\n },\n})\n\n</script>\n","import { path } from 'tg-commons'\nimport { customRef, getCurrentInstance, toRaw, watch } from 'vue'\n\n/** 获取当前组件的名字 */\nexport function useComponentName(): string | undefined {\n const type = getCurrentInstance()?.type\n let name = type?.name ?? type?.__name\n if (!name) {\n const file = type?.__file\n if (file) {\n name = path.basename(file, '.vue')\n }\n }\n return name\n}\n\n/**\n * 将v-model转换成Ref变量, 并防止递归调用\n */\nexport function useLocalModel<P extends object, K extends keyof P & string, Name extends string>(\n props: P,\n key: K,\n emit: (name: Name, ...args: any[]) => void,\n) {\n return customRef<P[K]>((track, trigger) => {\n let local = props[key]\n watch(() => props[key], (v) => {\n if (local === toRaw(v)) {\n // 防止emit出去的值, 被设置回来\n return\n }\n local = v\n trigger()\n })\n\n return {\n get: () => {\n track()\n return local\n },\n set: (v) => {\n local = v\n emit(`update:${key}` as Name, v)\n },\n }\n })\n}\n","import { throwError } from 'tg-commons'\nimport type { AbstractMap } from 'tg-map-core'\nimport { inject, onBeforeUnmount, onMounted, type Ref } from 'vue'\nimport { useComponentName } from '../utils/hooks'\nimport { MIXIN_HOOK_CREATE, MIXIN_HOOK_DESTROY, MIXIN_MAP_NAME } from './map-mixin'\n\n/** 作为Vue3下, `MapMixin`的替代 */\nexport function useTgMapInner<MAP extends AbstractMap = AbstractMap>() {\n const mapRef = inject<Ref<MAP | undefined>>(MIXIN_MAP_NAME)\n let onCreate: VoidFunction | undefined\n let onDestroy: VoidFunction | undefined\n if (mapRef == null) throwError(`<${useComponentName() || 'unknown'}>必须作为<tg-map>的子代组件`)\n\n return {\n mapRef,\n /** 读取map对象, 只要放在<tg-map>里面的组件(除#overlay插槽外)都能够立即读取到map对象 */\n get map() {\n return mapRef.value ?? throwError('map尚未初始化')\n },\n /** 地图元素创建回调 */\n [MIXIN_HOOK_CREATE](hook: VoidFunction) {\n onMounted(hook)\n if (onCreate) throwError(`${MIXIN_HOOK_CREATE}只能调用一次`)\n onCreate = hook\n },\n /** 地图元素销毁回调 */\n [MIXIN_HOOK_DESTROY](hook: VoidFunction) {\n onBeforeUnmount(hook)\n if (onDestroy) throwError(`${MIXIN_HOOK_DESTROY}只能调用一次`)\n onDestroy = hook\n },\n /** 重新创建地图元素 */\n recreate() {\n onDestroy?.()\n onCreate?.()\n },\n }\n}\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { ControlPosition, unwrapStringEnumValue, type BaseMap, type StreetViewControl, type StreetViewControlOptions, type WrapStringEnumValue } from 'tg-map-core'\nimport { defineComponent, watch } from 'vue'\nimport { createEmptyVNode, stringEnumProp, type Props } from '../../utils/vue-utils'\nimport { useTgMapInner } from '../map-hooks'\n/**\n * 街景控件, 当前只有google支持\n * */\nexport default defineComponent({\n name: 'tg-street-view-control',\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.RIGHT_BOTTOM),\n } satisfies Props<WrapStringEnumValue<StreetViewControlOptions, {\n position: typeof ControlPosition,\n }>>,\n setup(props) {\n let control = lateinit<StreetViewControl>()\n\n const { map, onCreate, onDestroy } = useTgMapInner<BaseMap>()\n\n onCreate(() => {\n control = map.createStreetViewControl(unwrapStringEnumValue(props))\n map.addControl(control)\n })\n\n onDestroy(() => {\n map.removeControl(control)\n })\n\n watch(() => props.position, (value) => {\n control.setPosition(unwrapStringEnumValue(value, ControlPosition))\n })\n return createEmptyVNode\n },\n})\n</script>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { ControlPosition, unwrapStringEnumValue, type BaseMap, type WrapStringEnumValue, type ZoomControl, type ZoomControlOptions } from 'tg-map-core'\nimport { defineComponent, watch } from 'vue'\nimport { createEmptyVNode, stringEnumProp, type Props } from '../../utils/vue-utils'\nimport { useTgMapInner } from '../map-hooks'\n\nexport default defineComponent({\n name: 'tg-zoom-control',\n props: {\n position: stringEnumProp(ControlPosition, ControlPosition.RIGHT_BOTTOM),\n } satisfies Props<WrapStringEnumValue<ZoomControlOptions, {\n position: typeof ControlPosition,\n }>>,\n setup(props) {\n let control = lateinit<ZoomControl>()\n\n const { map, onCreate, onDestroy } = useTgMapInner<BaseMap>()\n\n onCreate(() => {\n control = map.createZoomControl(unwrapStringEnumValue(props))\n map.addControl(control)\n })\n\n onDestroy(() => {\n map.removeControl(control)\n })\n\n watch(() => props.position, (value) => {\n control.setPosition(unwrapStringEnumValue(value, ControlPosition))\n })\n return createEmptyVNode\n },\n})\n</script>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { BaseMap, Heatmap, type HeatmapOptions } from 'tg-map-core'\nimport { defineComponent, watch } from 'vue'\nimport { createEmptyVNode, optionalProp, requiredProp, type Props } from '../../utils/vue-utils'\nimport { useTgMapInner } from '../map-hooks'\n\nexport default defineComponent({\n name: 'tg-heatmap',\n props: {\n maxIntensity: optionalProp(Number),\n gradient: optionalProp(Object),\n opacity: optionalProp(Number),\n radius: optionalProp(Number),\n data: requiredProp(Array as any),\n } satisfies Props<HeatmapOptions>,\n setup(props) {\n const { map, onCreate, onDestroy } = useTgMapInner<BaseMap>()\n let heatmap = lateinit<Heatmap>()\n\n onCreate(() => {\n heatmap = map.createHeatmap(props)\n })\n onDestroy(() => {\n heatmap.remove()\n })\n\n watch(() => props.data, (v) => heatmap.setData(v))\n watch(\n [() => props.maxIntensity, () => props.gradient, () => props.opacity, () => props.radius],\n () => heatmap.setOptions(props),\n )\n\n return createEmptyVNode\n },\n})\n</script>\n","<template>\n <div :class=\"$options.name\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { Arrays, lateinit, typed } from 'tg-commons'\nimport type { MarkerClusterer, MarkerClustererOptions, MarkerOverlay } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { type Props, optionalProp } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nconst TgMarkerClusterer = defineComponent({\n name: 'tg-marker-clusterer',\n mixins: [MapMixin],\n // markers从this.$children中读取, 故需要省略(Omit)\n props: {\n gridSize: optionalProp(Number),\n maxZoom: optionalProp(Number),\n minClusterSize: optionalProp(Number),\n averageCenter: optionalProp(Boolean),\n styles: optionalProp(Array as any),\n stylesIndexCalculator: optionalProp(Function as any),\n zIndex: optionalProp(Number),\n } satisfies Props<Omit<MarkerClustererOptions, 'markers'>>,\n setup() {\n return {\n clusterer: lateinit<MarkerClusterer>(),\n markers: typed<MarkerOverlay[]>([]),\n }\n },\n watch: {\n gridSize() {\n this.recreate()\n },\n maxZoom() {\n this.recreate()\n },\n minClusterSize() {\n this.recreate()\n },\n averageCenter() {\n this.recreate()\n },\n styles: {\n handler() {\n this.recreate()\n },\n deep: true,\n },\n stylesIndexCalculator() {\n this.recreate()\n },\n zIndex() {\n this.recreate()\n },\n },\n onCreate() {\n // console.log('TgMarkerClusterer.onCreate', this.markers)\n this.clusterer = this.$map.createMarkerClusterer(this)\n },\n onDestroy() {\n this.clusterer.clearMarkers()\n },\n methods: {\n /** TgMarker有可能在该组件未初始化之前调用, 需要通过该方法判断 */\n isInitiated(): boolean {\n return this.clusterer != null\n },\n onAddMarker(marker: MarkerOverlay) {\n this.markers.push(marker)\n if (this.isInitiated()) {\n // TODO: 优化大量marker时的添加移除逻辑\n this.clusterer.addMarker(marker)\n }\n },\n onRemoveMarker(marker: MarkerOverlay) {\n if (this.isInitiated()) {\n this.clusterer.removeMarker(marker)\n }\n Arrays.remove(this.markers, marker)\n },\n },\n})\n/** TgMarkerClusterer作为构造器, 创建的Vue实例类型 */\ntype TgMarkerClusterer = InstanceType<typeof TgMarkerClusterer>\nexport default TgMarkerClusterer\n</script>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { TrafficLayer } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport MapMixin from '../map-mixin'\nexport default defineComponent({\n name: 'tg-traffic-layer',\n mixins: [MapMixin],\n // 请直接使用v-if来控制它的显隐\n // 没有属性时, 写`{}`类型推断会有问题, 故注释掉\n // props: {} satisfies Props<{}>,\n setup() {\n return {\n layer: lateinit<TrafficLayer>(),\n }\n },\n watch: {\n\n },\n onCreate() {\n this.layer = new TrafficLayer()\n this.$map.addLayer(this.layer)\n },\n onDestroy() {\n this.$map.removeLayer(this.layer)\n },\n})\n\n</script>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { bindEvents, LatLng, type CircleEventMap, type CircleOptions, type CircleOverlay } from 'tg-map-core'\nimport { defineComponent, toRaw } from 'vue'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\ntype TgCircleEmits = {\n 'update:center': LatLng,\n 'update:radius': number,\n}\nexport default defineComponent({\n name: 'tg-circle',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n center: requiredProp(LatLng),\n radius: requiredProp(Number),\n clickable: optionalProp(Boolean),\n editable: optionalProp(Boolean),\n strokeColor: optionalProp(String),\n strokeOpacity: optionalProp(Number),\n strokeWeight: optionalProp(Number),\n visible: optionalProp(Boolean),\n zIndex: optionalProp(Number),\n fillColor: optionalProp(String),\n fillOpacity: optionalProp(Number),\n 'onUpdate:center': eventProp(),\n 'onUpdate:radius': eventProp(),\n } satisfies Props<CircleOptions> & EventProps<TgCircleEmits>,\n emits: undefined as any as EventEmits<CircleEventMap & TgCircleEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<CircleOverlay>(),\n emittedRadius: undefined as number | undefined,\n emittedCenter: undefined as LatLng | undefined,\n }\n },\n watch: {\n center(value) {\n if (this.emittedCenter != null) {\n const center = this.emittedCenter\n this.emittedCenter = undefined\n if (center === toRaw(value)) {\n // 防止emit出的center被设置回来\n return\n }\n }\n this.overlay.setCenter(value)\n },\n radius(value) {\n if (this.emittedRadius != null) {\n const radius = this.emittedRadius\n this.emittedRadius = undefined\n if (radius === value) {\n // 防止emit出的radius被设置回来\n return\n }\n }\n this.overlay.setRadius(value)\n },\n clickable() {\n this.recreate()\n },\n editable(value) {\n this.overlay.setEditable(value)\n },\n strokeColor(value) {\n this.overlay.setStrokeColor(value)\n },\n strokeOpacity(value) {\n this.overlay.setStrokeOpacity(value)\n },\n strokeWeight(value) {\n this.overlay.setStrokeWeight(value)\n },\n fillColor(value) {\n this.overlay.setFillColor(value)\n },\n fillOpacity(value) {\n this.overlay.setFillOpacity(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n zIndex(value) {\n this.overlay.setZIndex(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createCircle(this)\n this.$map.addOverlay(this.overlay)\n bindEvents(this.attrs.listeners, this.overlay)\n if (this.attrs.listenerProps['update:center']) {\n this.overlay.addEventListener('center-changed', () => {\n this.$emit('update:center', this.emittedCenter = this.overlay.getCenter())\n })\n }\n if (this.attrs.listenerProps['update:radius']) {\n this.overlay.addEventListener('radius-changed', () => {\n this.$emit('update:radius', this.emittedRadius = this.overlay.getRadius())\n })\n }\n },\n onDestroy() {\n this.$map.removeOverlay(this.overlay)\n },\n})\n</script>\n","<template>\n <div :class=\"$options.name\" v-bind=\"$attrs\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { ElementOverlay, LatLng, MapPane, unwrapStringEnumValue, type BaseMap, type ElementOverlayOptions, type OverlayProjection, type WrapStringEnumValue } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { requiredProp, stringEnumProp, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\n\n/** ElementOverlay的简单实现 */\nclass SimpleElementOverlay extends ElementOverlay {\n constructor(\n map: BaseMap,\n options: ElementOverlayOptions,\n public content: HTMLElement,\n private position: LatLng,\n ) {\n super(map, options)\n }\n protected onCreate(): HTMLElement {\n return this.content\n }\n protected onDraw(projection: OverlayProjection): void {\n const point = projection.fromLatLngToOverlayPoint(this.position)\n this.content.style.left = point.x + 'px'\n this.content.style.top = point.y + 'px'\n }\n setPosition(position: LatLng) {\n this.position = position\n this.draw()\n }\n}\n\nconst TgElementOverlay = defineComponent({\n name: 'tg-element-overlay',\n mixins: [MapMixin],\n props: {\n mapPane: stringEnumProp(MapPane, MapPane.overlayMouseTarget),\n position: requiredProp(LatLng),\n } satisfies Props<WrapStringEnumValue<ElementOverlayOptions, {\n mapPane: typeof MapPane,\n }> & { position: LatLng }>,\n setup() {\n return {\n overlay: lateinit<SimpleElementOverlay>(),\n }\n },\n watch: {\n position(value) {\n this.overlay.setPosition(value)\n },\n mapPane() {\n this.recreate()\n },\n },\n methods: {\n content(): HTMLElement {\n return this.$el as HTMLElement\n },\n },\n onCreate() {\n this.overlay = new SimpleElementOverlay(this.$map, unwrapStringEnumValue(this), this.content(), this.position)\n this.$map.addElementOverlay(this.overlay)\n },\n onDestroy() {\n this.$map.removeElementOverlay(this.overlay)\n },\n})\ntype TgElementOverlay = InstanceType<typeof TgElementOverlay>\nexport default TgElementOverlay\n</script>\n<style lang=\"scss\">\n// 只有移到.tg-map__map里面时才显示\n.tg-map .tg-element-overlay {\n display: none;\n}\n.tg-map__map .tg-element-overlay {\n display: block;\n}\n</style>\n","<template>\n <slot></slot>\n</template>\n<script lang=\"ts\">\nimport { deepEqual, lateinit, typed } from 'tg-commons'\nimport { BaiduMarker, bindEvents, LatLng, type MarkerEventMap, type MarkerLabel, type MarkerOptions, type MarkerOverlay, type UnionIcon } from 'tg-map-core'\nimport { defineComponent, toRaw, type PropType } from 'vue'\nimport { eventProp, optionalProp, requiredProp, safeAsComponent, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport TgMarkerClusterer from '../extra/TgMarkerClusterer.vue'\nimport MapMixin from '../map-mixin'\nimport type TgInfoBox from './TgInfoBox.vue'\nimport type TgInfoWindow from './TgInfoWindow.vue'\nimport type TgLabel from './TgLabel.vue'\n\ntype TgMarkerEmits = {\n 'update:position': LatLng,\n}\n\nexport type TgMarkerEventEmits = EventEmits<MarkerEventMap & TgMarkerEmits>\n\nexport const tgMarkerProps = {\n position: requiredProp(LatLng),\n title: optionalProp(String),\n label: optionalProp(Object as PropType<MarkerLabel>),\n icon: optionalProp(Object as PropType<UnionIcon>),\n clickable: optionalProp(Boolean),\n draggable: optionalProp(Boolean),\n crossOnDrag: optionalProp(Boolean),\n cursor: optionalProp(String),\n zIndex: optionalProp(Number),\n visible: optionalProp(Boolean),\n normalizePositionForBaidu: optionalProp(Boolean),\n /**\n * 是否自动添加到TgMarkerClusterer中去\n * @default true\n */\n autoAddToClusterer: optionalProp(Boolean, true),\n 'onUpdate:position': eventProp(),\n} satisfies Props<MarkerOptions & {\n autoAddToClusterer?: boolean\n}> & EventProps<TgMarkerEmits>\n\nconst TgMarker = defineComponent({\n name: 'tg-marker',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: tgMarkerProps,\n emits: undefined as any as TgMarkerEventEmits,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n marker: lateinit<MarkerOverlay>(),\n labelOverlay: typed<TgLabel>(),\n info: typed<TgInfo>(),\n emittedPosition: undefined as LatLng | undefined,\n autoAddToClustererWhenCreate: props.autoAddToClusterer,\n }\n },\n watch: {\n position(value: LatLng) {\n if (this.emittedPosition != null) {\n const position = this.emittedPosition\n this.emittedPosition = undefined\n if (position === toRaw(value)) {\n // 防止emit出的值被设置回来\n return\n }\n }\n this.marker.setPosition(value)\n },\n title(value: string) {\n this.marker.setTitle(value)\n },\n label(value?: MarkerLabel, oldValue?: MarkerLabel) {\n if (deepEqual(value, oldValue)) {\n // MarkerLabel是对象, 并且大部分时候都是直接在模板里面创建的, 很多时候创建的是内容相同的对象, 此时不需要更新\n return\n }\n if (value) {\n this.marker.setLabel(value)\n } else {\n this.recreate()\n }\n },\n icon(value?: UnionIcon) {\n if (value) {\n this.marker.setIcon(value)\n } else {\n this.recreate()\n }\n },\n clickable(value: boolean) {\n if (this.marker instanceof BaiduMarker) {\n this.recreate() // baidu不支持setClickable(), 故只能recreate()\n } else {\n this.marker.setClickable(value)\n }\n },\n draggable(value: boolean) {\n this.marker.setDraggable(value)\n },\n crossOnDrag() {\n this.recreate()\n },\n cursor() {\n this.recreate()\n },\n zIndex(value?: number) {\n if (this.marker instanceof BaiduMarker) {\n this.recreate() // 当前版本, baidu调用setZIndex()无效\n } else {\n this.marker.setZIndex(value)\n }\n },\n visible(value: boolean) {\n this.marker.setVisible(value)\n },\n normalizePositionForBaidu() {\n this.recreate()\n },\n autoAddToClusterer() {\n this.recreate()\n },\n },\n onCreate() {\n // 结构化类型, this包含MarkerOptions的所有属性, 故可以直接传进去\n this.marker = this.$map.createMarker(this)\n if (this.labelOverlay) {\n this.marker.attachLabelOverlay(this.labelOverlay.overlay)\n }\n\n if (this.$clusterer() && this.autoAddToClusterer) {\n this.$clusterer()!.onAddMarker(this.marker)\n } else {\n this.$map.addOverlay(this.marker)\n }\n // 保存创建时autoAddToClusterer的值, 销毁时需要使用它\n this.autoAddToClustererWhenCreate = this.autoAddToClusterer\n\n // baidu, 只有marker被添加到地图之后, 才能在它上面打开infoWindow\n // infoBox似乎没有这个限制, 但目前不区分infoWindow和infoBox, 故统一放在这里处理\n if (this.info) {\n this.info.show && this.info.overlay.open(this.marker)\n }\n\n bindEvents(this.attrs.listeners, this.marker)\n\n if (this.attrs.listenerProps['update:position']) {\n this.marker.addEventListener('dragend', (event) => {\n this.$emit('update:position', this.emittedPosition = event.position)\n })\n }\n },\n onDestroy() {\n if (this.$clusterer() && this.autoAddToClustererWhenCreate) {\n this.$clusterer()!.onRemoveMarker(this.marker)\n } else {\n this.$map.removeOverlay(this.marker)\n }\n },\n methods: {\n $clusterer(): TgMarkerClusterer | undefined {\n return safeAsComponent(this.$parent, TgMarkerClusterer)\n },\n onAddLabel(label: TgLabel) {\n this.labelOverlay = label\n // onAdd方法可能在创建this.marker前调用, 需要判断下\n if (this.marker) {\n this.marker.attachLabelOverlay(label.overlay)\n }\n },\n onRemoveLabel(_label: TgLabel) {\n this.marker.attachLabelOverlay(undefined)\n this.labelOverlay = undefined\n },\n onAddInfo(info: TgInfo) {\n this.info = info\n // @see {@link onAddLabel}\n if (this.marker) {\n info.show && info.overlay.open(this.marker)\n }\n },\n onRemoveInfo(info: TgInfo) {\n info.overlay.close()\n this.info = undefined\n },\n onInfoShowChanged(info: TgInfo, isShow: boolean) {\n isShow ? info.overlay.open(this.marker) : info.overlay.close()\n },\n },\n})\ntype TgMarker = InstanceType<typeof TgMarker>\nexport default TgMarker\n\nexport type TgInfo = TgInfoWindow | TgInfoBox\n\nexport type TgMarkerPublicInstance = {\n marker: MarkerOverlay\n\n onAddInfo(info: TgInfo): void\n onRemoveInfo(info: TgInfo): void\n onInfoShowChanged(info: TgInfo, isShow: boolean): void\n\n onAddLabel(label: TgLabel): void\n onRemoveLabel(label: TgLabel): void\n}\n</script>\n","<template>\n <div :class=\"$options.name\" v-bind=\"attrs.binds\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { bindEvents, LatLng, type InfoBoxOptions, type InfoBoxOverlay, type MarkerOverlay } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { TgMap } from '..'\nimport { eventProp, findAncestorComponentByType, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nimport TgMarker, { type TgMarkerPublicInstance } from './TgMarker.vue'\ntype TgInfoBoxEmits = {\n 'update:show': boolean\n}\nconst TgInfoBox = defineComponent({\n name: 'tg-info-box',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n show: requiredProp(Boolean),\n position: optionalProp(LatLng),\n offset: optionalProp(Object),\n maxWidth: optionalProp(Number),\n borderClass: optionalProp(String),\n zIndex: optionalProp(Number),\n 'onUpdate:show': eventProp(),\n } satisfies Props<Omit<InfoBoxOptions, 'content'> & {\n show: boolean\n }> & EventProps<TgInfoBoxEmits>,\n emits: undefined as any as EventEmits<TgInfoBoxEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<InfoBoxOverlay>(),\n }\n },\n watch: {\n show(isShow: boolean) {\n if (this.$marker()) {\n this.$marker()!.onInfoShowChanged(this, isShow)\n } else {\n isShow ? this.overlay.open() : this.overlay.close()\n }\n },\n position(value) {\n this.overlay.setPosition(value)\n },\n offset() {\n this.recreate()\n },\n maxWidth(value) {\n this.overlay.setMaxWidth(value)\n },\n borderClass() {\n this.recreate()\n },\n zIndex(value) {\n this.overlay.setZIndex(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createInfoBox(this.getOptions())\n if (this.$marker()) {\n this.$marker()!.onAddInfo(this)\n } else {\n this.show && this.overlay.open()\n }\n\n if (this.attrs.listenerProps['update:show']) {\n this.overlay.addEventListener('closeclick', () => {\n this.$emit('update:show', false)\n })\n }\n\n bindEvents(this.attrs.listeners, this.overlay)\n },\n onDestroy() {\n if (this.$marker()) {\n this.$marker()!.onRemoveInfo(this)\n } else {\n this.overlay.close()\n }\n },\n methods: {\n getOptions(): InfoBoxOptions {\n return {\n content: this.content(),\n position: this.position,\n offset: this.offset,\n zIndex: this.zIndex,\n maxWidth: this.maxWidth,\n borderClass: this.borderClass,\n }\n },\n content(): HTMLElement {\n return this.$el as HTMLElement\n },\n $marker(): TgMarkerPublicInstance | undefined {\n return findAncestorComponentByType(TgMarker, this.$parent, TgMap)\n },\n open(marker?: MarkerOverlay) {\n this.overlay.open(marker)\n },\n close() {\n this.overlay.close()\n },\n },\n})\ntype TgInfoBox = Omit<InstanceType<typeof TgInfoBox>, '$options'>\nexport default TgInfoBox\n</script>\n<style lang=\"scss\">\n// 只有移到.tg-map__map里面时才显示\n.tg-map .tg-info-box {\n display: none;\n}\n\n.tg-map__map .tg-info-box {\n display: block;\n}\n</style>\n","<template>\n <div v-show=\"show\" :class=\"$options.name\" v-bind=\"attrs.binds\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { bindEvents, LatLng, type InfoWindowEventMap, type InfoWindowOptions, type InfoWindowOverlay } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { TgMap } from '..'\nimport { eventProp, findAncestorComponentByType, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\nimport TgMarker, { type TgMarkerPublicInstance } from './TgMarker.vue'\n\ntype TgInfoWindowEmits = {\n 'update:show': boolean\n}\nconst TgInfoWindow = defineComponent({\n name: 'tg-info-window',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n show: requiredProp(Boolean),\n position: optionalProp(LatLng),\n maxWidth: optionalProp(Number),\n offset: optionalProp(Object),\n disableAutoPan: optionalProp(Boolean),\n 'onUpdate:show': eventProp(),\n } satisfies Props<Omit<InfoWindowOptions, 'content'> & { show: boolean }> & EventProps<TgInfoWindowEmits>,\n emits: undefined as any as EventEmits<InfoWindowEventMap & TgInfoWindowEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<InfoWindowOverlay>(),\n }\n },\n watch: {\n show(isShow: boolean) {\n if (this.$marker()) {\n this.$marker()!.onInfoShowChanged(this, isShow)\n } else {\n isShow ? this.overlay.open() : this.overlay.close()\n }\n },\n position(value) {\n this.overlay.setPosition(value)\n },\n maxWidth() {\n this.recreate()\n },\n offset() {\n this.recreate()\n },\n disableAutoPan() {\n this.recreate()\n },\n },\n methods: {\n content(): HTMLElement {\n return this.$el as HTMLElement\n },\n $marker(): TgMarkerPublicInstance | undefined {\n return findAncestorComponentByType(TgMarker, this.$parent, TgMap)\n },\n getOptions(): InfoWindowOptions {\n return {\n content: this.content(),\n position: this.position,\n maxWidth: this.maxWidth,\n offset: this.offset,\n disableAutoPan: this.disableAutoPan,\n }\n },\n },\n onCreate() {\n this.overlay = this.$map.createInfoWindow(this.getOptions())\n if (this.$marker()) {\n this.$marker()!.onAddInfo(this)\n } else {\n this.show && this.overlay.open()\n }\n\n // 监听open/close\n this.overlay.addEventListener('open', () => {\n this.$emit('update:show', true)\n })\n this.overlay.addEventListener('close', () => {\n this.$emit('update:show', false)\n })\n\n bindEvents(this.attrs.listeners, this.overlay)\n },\n onDestroy() {\n if (this.$marker()) {\n this.$marker()!.onRemoveInfo(this)\n } else {\n this.overlay.close()\n }\n },\n})\ntype TgInfoWindow = Omit<InstanceType<typeof TgInfoWindow>, '$options'>\nexport default TgInfoWindow\n</script>\n","<template>\n <div :class=\"$options.name\" v-bind=\"attrs.binds\">\n <slot />\n </div>\n</template>\n<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { bindEvents, LatLng, MapPane, unwrapStringEnumValue, type LabelEventMap, type LabelOptions, type LabelOverlay, type Marker, type WrapStringEnumValue } from 'tg-map-core'\nimport { defineComponent } from 'vue'\nimport { findAncestorComponentByType, optionalProp, stringEnumProp, useSplittedAttrs, type EventEmits, type Props } from '../../utils/vue-utils'\nimport TgMap from '../TgMap.vue'\nimport MapMixin from '../map-mixin'\nimport TgMarker, { type TgMarkerPublicInstance } from './TgMarker.vue'\n\nconst TgLabel = defineComponent({\n name: 'tg-label',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n position: optionalProp(LatLng),\n offset: optionalProp(Object),\n zIndex: optionalProp(Number),\n mapPane: stringEnumProp(MapPane),\n } satisfies Props<WrapStringEnumValue<\n Omit<LabelOptions, 'content'>,\n { mapPane: typeof MapPane }\n >>,\n emits: undefined as any as EventEmits<LabelEventMap>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs),\n overlay: lateinit<LabelOverlay>(),\n }\n },\n watch: {\n position(value) {\n this.overlay.setPosition(value)\n },\n offset(value) {\n this.overlay.setOffset(value)\n },\n zIndex(value) {\n this.overlay.setZIndex(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n mapPane() {\n this.recreate()\n },\n },\n methods: {\n content(): HTMLElement {\n return this.$el as HTMLElement\n },\n marker(): Marker | undefined {\n return this.$marker()?.marker\n },\n $marker(): TgMarkerPublicInstance | undefined {\n return findAncestorComponentByType(TgMarker, this.$parent, TgMap)\n },\n getOptions(): LabelOptions {\n return {\n content: this.content(),\n position: this.position,\n offset: this.offset,\n zIndex: this.zIndex,\n mapPane: unwrapStringEnumValue(this.mapPane, MapPane),\n }\n },\n },\n onCreate() {\n this.overlay = this.$map.createLabel(this.getOptions())\n // 若父节点为marker, 则交由marker管理\n if (this.$marker()) {\n this.$marker()!.onAddLabel(this)\n } else {\n this.$map.addOverlay(this.overlay)\n }\n bindEvents(this.attrs.listeners, this.overlay)\n },\n onDestroy() {\n if (this.$marker()) {\n this.$marker()!.onRemoveLabel(this)\n } else {\n this.$map.removeOverlay(this.overlay)\n }\n },\n})\ntype TgLabel = Omit<InstanceType<typeof TgLabel>, '$options'>\nexport default TgLabel\n</script>\n<style lang=\"scss\">\n// 只有移到.tg-map__map里面时才显示\n.tg-map .tg-label {\n display: none;\n}\n.tg-map__map .tg-label {\n display: block;\n}\n</style>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { bindEvents, type LatLng, type PolygonEventMap, type PolygonOptions, type PolygonOverlay } from 'tg-map-core'\nimport { defineComponent, toRaw, type PropType } from 'vue'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\n\ntype TgPolygonEmits = {\n 'update:paths': LatLng[][],\n}\n\nexport const tgPolygonProps = {\n paths: requiredProp(Array as PropType<LatLng[][]>),\n clickable: optionalProp(Boolean),\n editable: optionalProp(Boolean),\n strokeColor: optionalProp(String),\n strokeOpacity: optionalProp(Number),\n strokeWeight: optionalProp(Number),\n visible: optionalProp(Boolean),\n zIndex: optionalProp(Number),\n fillColor: optionalProp(String),\n fillOpacity: optionalProp(Number),\n 'onUpdate:paths': eventProp(),\n} satisfies Props<PolygonOptions> & EventProps<TgPolygonEmits>\n\nexport type TgPolygonEventEmits = EventEmits<PolygonEventMap & TgPolygonEmits>\n\nexport default defineComponent({\n name: 'tg-polygon',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: tgPolygonProps,\n emits: undefined as any as TgPolygonEventEmits,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<PolygonOverlay>(),\n emittedPaths: undefined as LatLng[][] | undefined,\n }\n },\n watch: {\n paths: {\n handler(value: LatLng[][]) {\n if (this.emittedPaths != null) {\n const paths = this.emittedPaths\n this.emittedPaths = undefined\n // 由于paths数组绝大多数时候长度都是1, 故这里可以浅层比较它\n if (paths.length === value.length && paths.every((v, i) => v === toRaw(value[i]))) {\n // 防止emit出的paths被设置回来\n return\n }\n }\n this.overlay.setPaths(value)\n },\n deep: true,\n },\n clickable() {\n this.recreate()\n },\n editable(value) {\n this.overlay.setEditable(value)\n },\n strokeColor(value) {\n this.overlay.setStrokeColor(value)\n },\n strokeOpacity(value) {\n this.overlay.setStrokeOpacity(value)\n },\n strokeWeight(value) {\n this.overlay.setStrokeWeight(value)\n },\n fillColor(value) {\n this.overlay.setFillColor(value)\n },\n fillOpacity(value) {\n this.overlay.setFillOpacity(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n zIndex(value) {\n this.overlay.setZIndex(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createPolygon(this)\n this.$map.addOverlay(this.overlay)\n bindEvents(this.attrs.listeners, this.overlay)\n if (this.attrs.listenerProps['update:paths']) {\n this.overlay.addEventListener('paths-edited', () => {\n this.$emit('update:paths', this.emittedPaths = this.overlay.getPaths())\n })\n }\n },\n onDestroy() {\n this.$map.removeOverlay(this.overlay)\n },\n\n})\n</script>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { bindEvents, LatLng, type IconSequence, type PolylineEventMap, type PolylineOptions, type PolylineOverlay } from 'tg-map-core'\nimport { defineComponent, toRaw, type PropType } from 'vue'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\n\ntype TgPolylineEmits = {\n 'update:path': LatLng[],\n}\nexport default defineComponent({\n name: 'tg-polyline',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n path: requiredProp(Array as PropType<LatLng[]>),\n icons: optionalProp(Array as PropType<IconSequence[]>),\n clickable: optionalProp(Boolean),\n editable: optionalProp(Boolean),\n strokeColor: optionalProp(String),\n strokeOpacity: optionalProp(Number),\n strokeWeight: optionalProp(Number),\n visible: optionalProp(Boolean),\n zIndex: optionalProp(Number),\n 'onUpdate:path': eventProp(),\n } satisfies Props<PolylineOptions> & EventProps<TgPolylineEmits>,\n emits: undefined as any as EventEmits<PolylineEventMap & TgPolylineEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<PolylineOverlay>(),\n emittedPath: undefined as LatLng[] | undefined,\n }\n },\n watch: {\n path: {\n handler(value) {\n if (this.emittedPath != null) {\n const path = this.emittedPath\n this.emittedPath = undefined\n if (path === toRaw(value)) {\n // 防止emit出的path又被设置回去, 导致Google地图移动点后的撤销功能无效\n return\n }\n }\n this.overlay.setPath(value)\n },\n deep: true,\n },\n icons: {\n handler() {\n this.recreate()\n },\n deep: true,\n },\n clickable() {\n this.recreate()\n },\n editable(value) {\n this.overlay.setEditable(value)\n },\n strokeColor(value) {\n this.overlay.setStrokeColor(value)\n },\n strokeOpacity(value) {\n this.overlay.setStrokeOpacity(value)\n },\n strokeWeight(value) {\n this.overlay.setStrokeWeight(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n zIndex(value) {\n this.overlay.setZIndex(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createPolyline(this)\n this.$map.addOverlay(this.overlay)\n bindEvents(this.attrs.listeners, this.overlay)\n\n if (this.attrs.listenerProps['update:path']) {\n this.overlay.addEventListener('path-edited', () => {\n this.$emit('update:path', this.emittedPath = this.overlay.getPath())\n })\n }\n },\n onDestroy() {\n this.overlay.remove()\n },\n})\n</script>\n","<script lang=\"ts\">\nimport { lateinit } from 'tg-commons'\nimport { bindEvents, type LatLngBounds, type RectangleEventMap, type RectangleOptions, type RectangleOverlay } from 'tg-map-core'\nimport { defineComponent, type PropType } from 'vue'\nimport { eventProp, optionalProp, requiredProp, useSplittedAttrs, type EventEmits, type EventProps, type Props } from '../../utils/vue-utils'\nimport MapMixin from '../map-mixin'\ntype TgRectangleEmits = {\n 'update:bounds': LatLngBounds,\n}\nexport default defineComponent({\n name: 'tg-rectangle',\n mixins: [MapMixin],\n inheritAttrs: false,\n props: {\n bounds: requiredProp(Object as PropType<LatLngBounds>),\n clickable: optionalProp(Boolean),\n editable: optionalProp(Boolean),\n strokeColor: optionalProp(String),\n strokeOpacity: optionalProp(Number),\n strokeWeight: optionalProp(Number),\n visible: optionalProp(Boolean),\n zIndex: optionalProp(Number),\n fillColor: optionalProp(String),\n fillOpacity: optionalProp(Number),\n 'onUpdate:bounds': eventProp(),\n } satisfies Props<RectangleOptions> & EventProps<TgRectangleEmits>,\n emits: undefined as any as EventEmits<RectangleEventMap & TgRectangleEmits>,\n setup(props, { attrs }) {\n return {\n attrs: useSplittedAttrs(attrs, props),\n overlay: lateinit<RectangleOverlay>(),\n emittedBounds: undefined as LatLngBounds | undefined,\n }\n },\n watch: {\n bounds(value: LatLngBounds) {\n if (this.emittedBounds != null) {\n const bounds = this.emittedBounds\n this.emittedBounds = undefined\n // bounds很大可能会被重新创建, 故需要严格比较相等\n if (bounds.equals(value)) {\n // 防止emit出的值又被设置回来\n return\n }\n }\n this.overlay.setBounds(value)\n },\n clickable() {\n this.recreate()\n },\n editable(value) {\n this.overlay.setEditable(value)\n },\n strokeColor(value) {\n this.overlay.setStrokeColor(value)\n },\n strokeOpacity(value) {\n this.overlay.setStrokeOpacity(value)\n },\n strokeWeight(value) {\n this.overlay.setStrokeWeight(value)\n },\n fillColor(value) {\n this.overlay.setFillColor(value)\n },\n fillOpacity(value) {\n this.overlay.setFillOpacity(value)\n },\n visible(value) {\n this.overlay.setVisible(value)\n },\n zIndex(value) {\n this.overlay.setZIndex(value)\n },\n },\n onCreate() {\n this.overlay = this.$map.createRectangle(this)\n this.$map.addOverlay(this.overlay)\n bindEvents(this.attrs.listeners, this.overlay)\n if (this.attrs.listenerProps['update:bounds']) {\n this.overlay.addEventListener('bounds-changed', () => {\n this.$emit('update:bounds', this.emittedBounds = this.overlay.getBounds())\n })\n }\n },\n onDestroy() {\n this.$map.removeOverlay(this.overlay)\n },\n\n})\n</script>\n","import { noop } from 'tg-commons'\nimport { defineComponent, type App } from 'vue'\nimport { useComponentName } from './hooks'\nimport type { VueHookName } from './vue-utils'\n\nconst DEFAULT_EXCLUDE_HOOK_NAMES: VueHookName[] = ['beforeUpdate', 'updated']\n\nexport interface LifecycleLogOptions {\n /** @default /^[A-Z]/ 匹配大写字母开头的组件名 */\n nameRegex?: RegExp\n /** @default true 开启log */\n enable?: boolean,\n /** @default 除 updated, beforeUpdate 外的所有hook */\n hookNames?: VueHookName[]\n}\n\nconst LifecycleLogPlugin = {\n install(app: App, options: LifecycleLogOptions = {}) {\n if (options.enable !== false) {\n const lifecycleLogMixin = defineComponent({\n beforeCreate() {\n const componentName = useComponentName() ?? ''\n const matched = (options.nameRegex || /^[A-Z]/).test(componentName)\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const __life = matched\n ? (hookName: VueHookName) => {\n if (options.hookNames) {\n if (options.hookNames.includes(hookName)) {\n console.debug('[lifecycle]', componentName, hookName)\n }\n } else if (!DEFAULT_EXCLUDE_HOOK_NAMES.includes(hookName)) {\n console.debug('[lifecycle]', componentName, hookName)\n }\n }\n : noop\n // `beforeCreate`触发在data/props/methods等组件状态初始化之前, 所以若`__life`方法直接在methods中实现, 在这里是调用不到的(\n __life('beforeCreate')\n ; (this as any).__life_impl = __life\n },\n created() {\n this.__life('created')\n },\n beforeMount() {\n this.__life('beforeMount')\n },\n mounted() {\n this.__life('mounted')\n },\n beforeUpdate() {\n this.__life('beforeUpdate')\n },\n updated() {\n this.__life('updated')\n },\n beforeUnmount() {\n this.__life('beforeUnmount')\n },\n unmounted() {\n this.__life('unmounted')\n },\n methods: {\n __life(hookName: VueHookName) {\n (this as any).__life_impl(hookName)\n },\n },\n onCreate() {\n this.__life('onCreate')\n },\n onDestroy() {\n this.__life('onDestroy')\n },\n })\n app.mixin(lifecycleLogMixin as any)\n }\n },\n}\nexport default LifecycleLogPlugin\n","import { throwError } from 'tg-commons'\nimport { type PartialTgMapConfig, setTgMapConfig } from 'tg-map-core'\nimport 'tg-map-core/dist/tg-map-core.css'\nimport type { App, Component } from 'vue'\n\nimport MapMixin, { MIXIN_HOOK_CREATE, MIXIN_HOOK_DESTROY, MIXIN_MAP_NAME } from './map-mixin'\n\nconst TgMapPlugin = {\n install(app: App, config?: PartialTgMapConfig) {\n setTgMapConfig(config)\n // Vue3中提倡在需要用的地方导入组件, 对tree-shrink更友好\n if (import.meta.env.VITE_FALSE) {\n // 注册所有Tg开头的Vue\n // ## webpack:\n // const views = require.context('./', true, /Tg.*\\.vue$/)\n // ## vite:\n const views = import.meta.glob('./**/Tg*.vue', { eager: true, import: 'default' })\n Object.keys(views).forEach(key => {\n const TgVue = views[key] as Component\n app.component(TgVue.name ?? throwError(`Tg开头的组件必须设置name: ${key}`), TgVue)\n })\n }\n\n const strategies = app.config.optionMergeStrategies\n // Vue3中必须自己写合并策略: https://github.com/vuejs/core/issues/861\n strategies[MIXIN_HOOK_CREATE] = strategies[MIXIN_HOOK_DESTROY] = (to, from) => {\n // 依照Vue2的风格, 将方法合并成数组\n // 参考:\n // - Vue3兼容模式: https://github.com/vuejs/core/blob/650f5c26f464505d9e865bdb0eafb24350859528/packages/runtime-core/src/componentOptions.ts#L1065\n // - Vue2: https://github.com/vuejs/vue/blob/a9ca2d85193e435e668ba25ace481bfb176b0c6e/src/core/util/options.ts#L154\n return to\n ? [...new Set([].concat(to as any, from as any))]\n : Array.isArray(from)\n ? from\n : [from]\n }\n },\n}\n\n/* 导出变量, 外部应该只使用从这里导出的变量 */\nexport default TgMapPlugin\n// 导出map和utils目录\nexport * from 'tg-map-core'\nexport { default as LifecycleLogPlugin, type LifecycleLogOptions } from '../utils/lifecycle-log'\nexport * from '../utils/vue-utils'\n// 导出vue文件\nexport { default as TgCustomControl } from './controls/TgCustomControl.vue'\nexport { default as TgMapTypeControl } from './controls/TgMapTypeControl.vue'\nexport { default as TgScaleControl } from './controls/TgScaleControl.vue'\nexport { default as TgStreetViewControl } from './controls/TgStreetViewControl.vue'\nexport { default as TgZoomControl } from './controls/TgZoomControl.vue'\nexport { default as TgHeatmap } from './extra/TgHeatmap.vue'\nexport { default as TgMarkerClusterer } from './extra/TgMarkerClusterer.vue'\nexport { default as TgTrafficLayer } from './layers/TgTrafficLayer.vue'\nexport * from './map-hooks'\nexport { default as TgCircle } from './overlays/TgCircle.vue'\nexport { default as TgElementOverlay } from './overlays/TgElementOverlay.vue'\nexport { default as TgInfoBox } from './overlays/TgInfoBox.vue'\nexport { default as TgInfoWindow } from './overlays/TgInfoWindow.vue'\nexport { default as TgLabel } from './overlays/TgLabel.vue'\nexport { default as TgMarker } from './overlays/TgMarker.vue'\nexport { default as TgPolygon } from './overlays/TgPolygon.vue'\nexport { default as TgPolyline } from './overlays/TgPolyline.vue'\nexport { default as TgRectangle } from './overlays/TgRectangle.vue'\nexport { default as TgMap } from './TgMap.vue'\nexport { default as TgMapWidget } from './TgMapWidget.vue'\nexport {\n MapMixin, MIXIN_HOOK_CREATE,\n MIXIN_HOOK_DESTROY,\n MIXIN_MAP_NAME,\n}\n// END\n"],"names":["stringEnumProp","enumObject","defaultValue","value","stringUnionPropFromValues","values","requiredProp","type","optionalProp","computedSaveOnThis","defaultValues","accessors","key","name","sharedPropertyDefinition","noop","createPropertyObject","obj","redefined","createPropertyObjectTyped","createEmptyVNode","createCommentVNode","callHook","vm","hookName","hooks","hook","findByComponentType","arr","component","item","extractVNodeFromSlotsByComponent","slots","nodeList","node","splitAttrs","attrs","props","listeners","binds","listenerProps","Strings","useSplittedAttrs","computed","eventProp","useEventLogMethods","prevType","prevTime","eventLog","event","eventLogLess","isComponentByType","instance","safeAsComponent","findAncestorComponentByType","startInstance","endComponent","MIXIN_MAP_NAME","MIXIN_HOOK_CREATE","MIXIN_HOOK_DESTROY","MapMixin","defineComponent","tgMapProps","TgMapType","LatLng","InfoWindowModeValues","GestureHandlingOptions","BuildInMapTypeId","_sfc_main$c","typed","Objects","_a","unwrapStringEnumValue","MapType","loadCachedMap","e","map","TgMapFactory","markRaw","bindEvents","watch","zoom","center","oldZoom","oldCenter","updateCenter","isUpdateMapType","isUpdateMapTypeId","mapType","_openBlock","_createElementBlock","_mergeProps","_ctx","_createElementVNode","_normalizeClass","_createCommentVNode","_renderSlot","_sfc_main$b","dimen","_normalizeStyle","_sfc_main$a","ControlPosition","lateinit","TgMap","$el","C","CustomControl","_sfc_main$9","MapTypeControlType","_sfc_main$8","useComponentName","getCurrentInstance","file","path","useTgMapInner","mapRef","inject","onCreate","onDestroy","throwError","onMounted","onBeforeUnmount","_sfc_main$7","control","_sfc_main$6","_sfc_main$5","heatmap","v","TgMarkerClusterer","marker","Arrays","_sfc_main$4","TrafficLayer","_sfc_main$3","toRaw","radius","SimpleElementOverlay","ElementOverlay","options","content","position","projection","point","TgElementOverlay","MapPane","tgMarkerProps","TgMarker","oldValue","deepEqual","BaiduMarker","label","_label","info","isShow","TgInfoBox","TgInfoWindow","_withDirectives","TgLabel","tgPolygonProps","_sfc_main$2","paths","_sfc_main$1","_sfc_main","bounds","DEFAULT_EXCLUDE_HOOK_NAMES","LifecycleLogPlugin","app","lifecycleLogMixin","componentName","__life","TgMapPlugin","config","setTgMapConfig","strategies","to","from"],"mappings":";;;;;AAgEgB,SAAAA,EAAyCC,GAAeC,GAAqD;AACpH,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAASA;AAAA,IACT,WAAW,CAACC,MAAsB,OAAO,OAAOF,CAAU,EAAE,SAASE,CAAK;AAAA,EAC5E;AACF;AAKgB,SAAAC,GAA4CC,GAAsBH,GAAqC;AAC9G,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAASA;AAAA,IACT,WAAW,CAACC,MAAaE,EAAO,SAASF,CAAK;AAAA,EAChD;AACF;AAEO,SAASG,EAAgBC,GAA0D;AACjF,SAAA;AAAA,IACL,MAAAA;AAAA,IACA,UAAU;AAAA,EACZ;AACF;AAIgB,SAAAC,EAAgBD,GAAmBL,GAAuC;AACjF,SAAA;AAAA,IACL,MAAAK;AAAA,IACA,SAASL;AAAA,EACX;AACF;AAQO,SAASO,GAAsBC,GAA4F;AAChI,QAAMC,IAAiB,CAAC;AACjB,gBAAA,QAAQD,CAAa,EAAE,QAAQ,CAAC,CAACE,GAAKV,CAAY,MAAM;AACvD,UAAAW,IAAO,KAAKD,CAAG;AACrB,IAAAD,EAAUC,CAAG,IAAI;AAAA,MACf,MAAM;AACE,cAAAT,IAAQ,KAAKU,CAAI;AAChB,eAAAV,MAAU,SAAYD,IAAeC;AAAA,MAC9C;AAAA,MACA,IAAIA,GAAY;AACd,aAAKU,CAAI,IAAIV;AAAA,MAAA;AAAA;AAAA;AAAA,IAIjB;AAAA,EAAA,CACD,GACMQ;AACT;AAGA,MAAMG,IAA+C;AAAA,EACnD,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,KAAKC;AAAA,EACL,KAAKA;AACP;AAMO,SAASC,GAAqBC,GAAe;AAClD,gBAAO,KAAKA,CAAG,EAAE,QAAQ,CAAOL,MAAA;AACxB,UAAAT,IAAQc,EAAIL,CAAG;AACrB,QAAIM,IAAY;AACZ,IAAA,OAAOf,KAAU,cACnBW,EAAyB,MAAMX,GAC/BW,EAAyB,MAAMC,GACnBG,IAAA,MACH,OAAOf,KAAU,YAAY,OAAOA,EAAM,OAAQ,eAC3DW,EAAyB,MAAMX,EAAM,KACrCW,EAAyB,MAAMX,EAAM,KACzBe,IAAA,KAEVA,MACFD,EAAIL,CAAG,IAAI,OAAO,eAAeK,GAAKL,GAAKE,CAAwB;AAAA,EACrE,CACD,GACMG;AACT;AAOO,SAASE,GAA6BF,GAA4C;AACvF,SAAOD,GAAqBC,CAAG;AACjC;AASO,SAASG,IAA0B;AACxC,SAAOC,EAAmB;AAC5B;AAIgB,SAAAC,EAASC,GAA6BC,GAAuB;AAErE,QAAAC,IAA6CF,EAAG,SAAiBC,CAAQ;AAC/E,MAAKC;AAGL,eAAWC,KAAQD;AACjB,MAAAC,EAAK,KAAKH,CAAE;AAEhB;AAMgB,SAAAI,GACdC,GACAC,GAC6B;AAC7B,aAAWC,KAAQF;AAGjB,QAAIE,EAAK,SAAS,SAASD,EAAU;AAC5B,aAAAC;AAIb;AASgB,SAAAC,GAAwCC,GAAcH,GAAoC;AACpG,MAAA,CAACG,EAAM,QAAgB;AAErB,QAAAC,IAAWD,EAAM,QAAQ;AAC/B,aAAWE,KAAQD;AACjB,SAAKC,KAAA,gBAAAA,EAAM,MAAmB,SAASL,EAAU;AACxC,aAAAK;AAIb;AA8BgB,SAAAC,GAAWC,GAAgCC,GAAiC;AAC1F,QAAMC,IAAqC,CAAC,GACtCC,IAAiC,CAAC,GAClCC,IAAyC,CAAC;AAChD,gBAAO,KAAKJ,CAAK,EAAE,QAAQ,CAAOxB,MAAA;AAC5B,IAAAA,EAAI,WAAW,IAAI,IACX0B,EAAAG,EAAQ,aAAa7B,EAAI,UAAU,CAAC,CAAC,CAAC,IAAIwB,EAAMxB,CAAG,IAEvD2B,EAAA3B,CAAG,IAAIwB,EAAMxB,CAAG;AAAA,EACxB,CACD,GACGyB,KACF,OAAO,KAAKA,CAAK,EAAE,QAAQ,CAAOzB,MAAA;AAC5B,IAAAA,EAAI,WAAW,IAAI,MACP4B,EAAAC,EAAQ,aAAa7B,EAAI,UAAU,CAAC,CAAC,CAAC,IAAIyB,EAAMzB,CAAG;AAAA,EACnE,CACD,GAEI;AAAA;AAAA,IAEL,OAAA2B;AAAA;AAAA,IAEA,WAAAD;AAAA;AAAA,IAEA,eAAAE;AAAA,EACF;AACF;AAGgB,SAAAE,EAAiBN,GAAgCC,GAAiC;AAChG,SAAOM,EAAS,MAAMR,GAAWC,GAAOC,CAAK,CAAC;AAChD;AAwBO,SAASO,IAA6C;AACpD,SAAA;AACT;AAEO,MAAMC,KAAqB,MAAM;AAClC,MAAAC,GACAC;AAIJ,WAASC,EAASC,GAAiC;AACjD,YAAQ,IAAIA,CAAK,GACjBH,IAAWG,KAAUA,EAAc,MACnCF,IAAW,KAAK,IAAI;AAAA,EAAA;AAGtB,WAASG,EAAwBD,GAAiC;AAC3D,MAAAA,KAAUA,EAAc,UAAUH,KAAY,KAAK,SAASC,KAAY,KAAK,QAChFC,EAASC,CAAK;AAAA,EAChB;AAEK,SAAA,EAAE,UAAAD,GAAU,cAAAE,EAAa;AAClC;AAWgB,SAAAC,EACdC,GACAvB,GAC6B;AAEtB,UAAAuB,KAAA,gBAAAA,EAAU,SAAS,UAASvB,EAAU;AAC/C;AAGgB,SAAAwB,EACdD,GACAvB,GAC6B;AAC7B,SAAOsB,EAAkBC,GAAUvB,CAAS,IAAIuB,IAAW;AAC7D;AASgB,SAAAE,EACdzB,GACA0B,GACAC,GAC6B;AAC7B,MAAIJ,IAAWG;AACf,SAAOH,KAAU;AACX,QAAAD,EAAkBC,GAAUvB,CAAS;AAChC,aAAAuB;AACE,QAAAI,KAAgBL,EAAkBC,GAAUI,CAAY;AAC1D;AAEP,IAAAJ,IAAWA,EAAS;AAAA,EACtB;AAGJ;ACvXO,MAAMK,IAAiB,QACjBC,IAAoB,YACpBC,IAAqB,aAiB5BC,IAAWC,EAAgB;AAAA,EAC/B,QAAQ,CAACJ,CAAc;AAAA,EACvB,UAAU;AAGR,IAAAnC,EAAS,MAAMoC,CAAiB;AAAA,EAClC;AAAA,EACA,gBAAgB;AAEd,IAAApC,EAAS,MAAMqC,CAAkB;AAAA,EACnC;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AACT,MAAArC,EAAS,MAAMqC,CAAkB,GACjCrC,EAAS,MAAMoC,CAAiB;AAAA,IAAA;AAAA,EAEpC;AAAA,EACA,SAAS;AACP,WAAOtC,EAAiB;AAAA,EAAA;AAE5B,CAAC,GCTY0C,KAAa;AAAA;AAAA,EAExB,MAAM9D,EAAe+D,GAAWA,EAAU,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShD,QAAQzD,EAAa0D,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM3B,iBAAiBxD,EAAa,QAAQ,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzC,eAAeA,EAAawD,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlC,YAAYxD,EAAawD,CAAM;AAAA,EAC/B,MAAM1D,EAAa,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAKzB,gBAAgBF,GAA0B6D,EAAoB;AAAA,EAC9D,iBAAiBjE,EAAekE,CAAsB;AAAA,EACtD,SAAS1D,EAAa,MAAM;AAAA,EAC5B,SAASA,EAAa,MAAM;AAAA,EAC5B,UAAUA,EAAa,MAA4B;AAAA,EACnD,WAAWR,EAAemE,CAAgB;AAAA;AAAA,EAE1C,SAAS3D,EAAa,MAAM;AAAA,EAC5B,UAAUA,EAAa,OAAO;AAAA,EAC9B,QAAQoC,EAAU;AAAA,EAClB,mBAAmBA,EAAU;AAAA,EAC7B,2BAA2BA,EAAU;AAAA,EACrC,wBAAwBA,EAAU;AAAA,EAClC,qBAAqBA,EAAU;AAAA,EAC/B,wBAAwBA,EAAU;AAAA,EAClC,iBAAiBA,EAAU;AAAA,EAC3B,SAASA,EAAU;AACrB,GAcAwB,KAAeP,EAAgB;AAAA,EAC7B,MAAM;AAAA,EACN,UAAU;AACD,WAAA;AAAA,MACL,CAACJ,CAAc,GAAGd,EAAS,MAAM,KAAK,GAAG;AAAA,IAC3C;AAAA,EACF;AAAA,EACA,cAAc;AAAA,EACd,OAAOmB;AAAA;AAAA,EAEP,OAAO;AAAA,EACP,MAAMzB,GAAO,EAAE,OAAAD,KAAS;AACf,WAAA;AAAA,MACL,OAAOM,EAAiBN,GAAOC,CAAK;AAAA,MACpC,qBAAqB;AAAA,IACvB;AAAA,EACF;AAAA,EACA,OAAO;AACE,WAAA;AAAA,MACL,KAAKgC,EAAe;AAAA,MACpB,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,YAAY;AACH,aAAAC,GAAQ,aAAa,KAAK,MAAM;AAAA,IAAA;AAAA,EAE3C;AAAA,EACA,OAAO;AAAA,IACL,gBAAgBnE,GAAwD;;AACtE,MAAIA,OACFoE,IAAA,KAAK,QAAL,QAAAA,EAAU,mBAAmBC,EAAsBrE,GAAO+D,CAAsB;AAAA,IAEpF;AAAA,IACA,QAAQ/D,GAAO;;AACR,OAAAoE,IAAA,KAAA,QAAA,QAAAA,EAAK,WAAWpE;AAAA,IACvB;AAAA,IACA,QAAQA,GAAO;;AACR,OAAAoE,IAAA,KAAA,QAAA,QAAAA,EAAK,WAAWpE;AAAA,IACvB;AAAA,IACA,SAASA,GAAkB;;AACpB,OAAAoE,IAAA,KAAA,QAAA,QAAAA,EAAK,YAAYpE;AAAA,IACxB;AAAA,IACA,UAAUA,GAAkD;;AAC1D,MAAIA,OACFoE,IAAA,KAAK,QAAL,QAAAA,EAAU,oBAAoBC,EAAsBrE,GAAOgE,CAAgB;AAAA,IAE/E;AAAA,IACA,QAAQhE,GAAiB;;AACvB,OAAAoE,IAAA,KAAK,QAAL,QAAAA,EAAU,WAAWpE,KAASsE,GAAQ;AAAA,IAAM;AAAA,EAEhD;AAAA,EACA,MAAM,UAAU;AAEd,UAAMlE,IAAOiE,EAAsB,KAAK,MAAMT,CAAS;AACnD,QAAA;AACF,YAAMW,GAAcnE,CAAI;AAAA,aACjBoE,GAAG;AACL,WAAA,MAAM,SAASA,CAAC;AACrB;AAAA,IAAA;AAEF,QAAI,KAAK,aAAa;AACZ,cAAA,KAAK,eAAepE,CAAI,eAAe;AAC/C;AAAA,IAAA;AAGF,UAAMqE,IAAMC,GAAa;AAAA,MAAUtE;AAAA,MAAM,KAAK,MAAM;AAAA;AAAA,MAAkC;AAAA,QACpF,QAAQ,KAAK;AAAA,QACb,MAAM,KAAK;AAAA,QACX,gBAAgB,KAAK;AAAA,QACrB,iBAAiBiE,EAAsB,KAAK,iBAAiBN,CAAsB;AAAA,QACnF,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,QACd,UAAU,KAAK;AAAA,QACf,kBAAkBM,EAAsB,KAAK,WAAWL,CAAgB;AAAA,MAAA;AAAA,IACzE;AAoCD,QAlCK,KAAA,MAAMW,GAAQF,CAAG,GAClB,KAAK,WACHA,EAAA,WAAW,KAAK,OAAO,GAIzB,WAAW,KAAK,MAAM,aACxB,QAAQ,MAAM,iCAAiC,GAEjDG;AAAA,MAAW,KAAK,MAAM;AAAA,MAAWH;AAAA;AAAA,MAAoB,CAAC,MAAM;AAAA,IAAC,GAExD,KAAA,MAAM,QAAQA,CAAG,GAKhBI,EAAA;AAAA,MACJ,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA;AAAA,IAAA,GACV,CAAC,CAACC,GAAMC,CAAM,GAAG,CAACC,GAASC,CAAS,MAAM;AAC3C,MAAIH,MAASE,KAEXP,EAAI,QAAQK,CAAI,GAEdC,MAAWE,MACSR,EAAI,UAAU,EACjB,OAAOM,CAAM,KAE9BN,EAAI,UAAUM,CAAM;AAAA,IAExB,CACD,GAGG,KAAK,MAAM,cAAc,eAAe,GAAG;AAC7C,YAAMG,IAAe,MAAM,KAAK,MAAM,iBAAiBT,EAAI,WAAW;AAClE,MAAAA,EAAA,iBAAiB,kBAAkB,MAAM;AACvC,QAAA,KAAK,kBAAkB,KACzB,aAAa,KAAK,mBAAmB,GACrC,KAAK,sBAAsB,WAAWS,GAAc,KAAK,eAAe,KAE3DA,EAAA;AAAA,MACf,CACD;AAAA,IAAA;AAEH,IAAI,KAAK,MAAM,cAAc,uBAAuB,MAE7C,KAAA,MAAM,yBAAyB,KAAK,MAAM,GAC3CT,EAAA,iBAAiB,kBAAkB,MAAM;AAC3C,WAAK,MAAM,yBAAyBA,EAAI,UAAA,CAAW;AAAA,IAAA,CACpD,IAEC,KAAK,MAAM,cAAc,aAAa,KACpCA,EAAA,iBAAiB,gBAAgB,MAAM;AACzC,WAAK,MAAM,eAAeA,EAAI,QAAA,CAAS;AAAA,IAAA,CACxC;AAEH,UAAMU,IAAkB,KAAK,MAAM,cAAc,iBAAiB,GAC5DC,IAAoB,KAAK,MAAM,cAAc,oBAAoB;AACvE,KAAID,KAAmBC,MACjBX,EAAA,iBAAiB,oBAAoB,MAAM;AACvC,YAAAY,IAAUZ,EAAI,WAAW;AACZ,MAAAU,KAAA,KAAK,MAAM,mBAAmBE,CAAO,GACxDD,KAAqB,KAAK,MAAM,sBAAsBC,EAAQ,EAAE;AAAA,IAAA,CACjE;AAAA,EAEL;AAAA,EACA,YAAY;AACV,SAAK,cAAc,IACf,KAAK,QACH,KAAK,MAAM,cAAc,oBAAoB,KAC/C,KAAK,MAAM,sBAAsB,KAAK,IAAI,WAAW,GAEnD,KAAK,MAAM,cAAc,eAAe,MAC1C,aAAa,KAAK,mBAAmB,GAErC,KAAK,MAAM,iBAAiB,KAAK,IAAI,WAAW;AAAA,EAGtD;AAAA,EACA,SAAS,CAAA;AAEX,CAAC;;;;;;;AApQC,SAAAC,EAAA,GAAAC,EAeM,OAfNC,EAeM,EAfD,OAAM,YAAiBC,QAAM,KAAK,GAAA;AAAA,IACrCC,GAMO,OAAA;AAAA,MALL,KAAI;AAAA,MACH,OAAKC,EAAA;AAAA,QAAA,eAAA;AAAA,QAAoE,CAAA,0BAAAF,EAAA,IAAI,EAAK,GAAAA,EAAA;AAAA,MAAA,CAAA;AAAA;IAMjEG,EAAA,IAAA,EAAA;AAAA,IAEJH,EAAA,MACdI,EAAaJ,EAAA,QAAA,WAAA,EAAA,KAAA,EAAA,CAAA,IAAAG,EAAA,IAAA,EAAA;AAAA,IAEfC,EAA4BJ,EAAA,QAAA,SAAA;AAAA,EAAA,GAAA,EAAA;;mDCLhCK,KAAepC,EAAgB;AAAA,EAC7B,MAAM;AAAA,EACN,OAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM,CAAC,QAAQ,MAAM;AAAA,MACrB,SAAS;AAAA,IACX;AAAA,IACA,KAAK;AAAA,MACH,MAAM,CAAC,QAAQ,MAAM;AAAA,MACrB,SAAS;AAAA,IACX;AAAA,IACA,OAAO;AAAA,MACL,MAAM,CAAC,QAAQ,MAAM;AAAA,MACrB,SAAS;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,MACN,MAAM,CAAC,QAAQ,MAAM;AAAA,MACrB,SAAS;AAAA,IAAA;AAAA,EAEb;AAAA,EACA,UAAU;AAAA,IACR,WAAW;AAET,aAAO,KAAK,OAAO,QAAQ,KAAK,UAAU,OAAO,IAAI,KAAK;AAAA,IAAA;AAAA,EAE9D;AAAA,EACA,SAAS;AAAA,IACP,OAAAqC;AAAA,EAAA;AAEJ,CAAC;;cAtCCR,EAEM,OAAA;AAAA,IAFA,OAAKI,EAAEF,EAAA,SAAS,IAAI;AAAA,IAAG,OAAKO,GAAA,EAAA,MAAUP,EAAM,MAAAA,EAAA,IAAI,GAAQ,KAAAA,EAAA,MAAMA,EAAQ,QAAA,GAAA,OAAUA,EAAM,MAAAA,EAAA,KAAK,GAAW,QAAAA,EAAA,MAAMA,EAAM,MAAA,EAAA,CAAA;AAAA,EAAA,GAAA;AAAA,IACtHI,EAAaJ,EAAA,QAAA,SAAA;AAAA,EAAA,GAAA,CAAA;;oDCWjBQ,KAAevC,EAAgB;AAAA,EAC7B,MAAM;AAAA,EACN,QAAQ,CAACD,CAAQ;AAAA,EACjB,OAAO;AAAA,IACL,UAAU5D,EAAeqG,GAAiBA,EAAgB,YAAY;AAAA,EACxE;AAAA,EAGA,QAAQ;AACC,WAAA;AAAA,MACL,SAASC,EAAwB;AAAA,IACnC;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AACT,WAAK,SAAS;AAAA,IAAA;AAAA,EAElB;AAAA,EACA,WAAW;AACT,IAAKjD,EAAgB,KAAK,SAASkD,CAAK,KACtC,QAAQ,KAAK,8BAA8B;AAEvC,UAAA,EAAE,KAAAC,MAAQ,MACVC,IAAI,cAAcC,GAAc;AAAA,MACpC,kBAAkB;AACT,eAAAF;AAAA,MAAA;AAAA,IAEX;AACA,SAAK,UAAU,IAAIC,EAAEjC,EAAsB,KAAK,UAAU6B,CAAe,CAAC,GACrE,KAAA,KAAK,iBAAiB,KAAK,OAAO;AAAA,EACzC;AAAA,EACA,YAAY;AACL,SAAA,KAAK,oBAAoB,KAAK,OAAO;AAAA,EAAA;AAE9C,CAAC;;cA9CCX,EAEM,OAAA;AAAA,IAFA,OAAKI,EAAEF,EAAA,SAAS,IAAI;AAAA,EAAA,GAAA;AAAA,IACxBI,EAAQJ,EAAA,QAAA,SAAA;AAAA,EAAA,GAAA,CAAA;;oDCKZe,KAAe9C,EAAgB;AAAA,EAC7B,MAAM;AAAA,EACN,QAAQ,CAACD,CAAQ;AAAA,EACjB,OAAO;AAAA,IACL,UAAU5D,EAAeqG,GAAiBA,EAAgB,QAAQ;AAAA,IAClE,MAAMrG,EAAe4G,EAAkB;AAAA,IACvC,UAAUpG,EAAa,KAAY;AAAA,EACrC;AAAA,EAIA,QAAQ;AACC,WAAA;AAAA,MACL,SAAS8F,EAAyB;AAAA,IACpC;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,SAASnG,GAAO;AACT,WAAA,QAAQ,YAAYA,CAAK;AAAA,IAChC;AAAA,IACA,OAAO;AACL,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,UAAU;AAAA,MACR,UAAU;AACR,aAAK,SAAS;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IAAA;AAAA,EAEV;AAAA,EACA,WAAW;AACT,SAAK,UAAU,KAAK,KAAK,qBAAqBqE,EAAsB,IAAI,CAAC,GACpE,KAAA,KAAK,WAAW,KAAK,OAAO;AAAA,EACnC;AAAA,EACA,YAAY;AACL,SAAA,KAAK,cAAc,KAAK,OAAO;AAAA,EAAA;AAExC,CAAC,GCtCDqC,KAAehD,EAAgB;AAAA,EAC7B,MAAM;AAAA,EACN,QAAQ,CAACD,CAAQ;AAAA,EACjB,OAAO;AAAA,IACL,UAAU5D,EAAeqG,GAAiBA,EAAgB,YAAY;AAAA,EACxE;AAAA,EAGA,QAAQ;AACC,WAAA;AAAA,MACL,SAASC,EAAuB;AAAA,IAClC;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,SAASnG,GAAO;AACT,WAAA,QAAQ,YAAYA,CAAK;AAAA,IAAA;AAAA,EAElC;AAAA,EACA,WAAW;AACT,SAAK,UAAU,KAAK,KAAK,mBAAmBqE,EAAsB,IAAI,CAAC,GAClE,KAAA,KAAK,WAAW,KAAK,OAAO;AAAA,EACnC;AAAA,EACA,YAAY;AACL,SAAA,KAAK,cAAc,KAAK,OAAO;AAAA,EAAA;AAExC,CAAC;AC3BM,SAASsC,IAAuC;;AAC/C,QAAAvG,KAAOgE,IAAAwC,SAAA,gBAAAxC,EAAsB;AAC/B,MAAA1D,KAAON,KAAA,gBAAAA,EAAM,UAAQA,KAAA,gBAAAA,EAAM;AAC/B,MAAI,CAACM,GAAM;AACT,UAAMmG,IAAOzG,KAAA,gBAAAA,EAAM;AACnB,IAAIyG,MACKnG,IAAAoG,EAAK,SAASD,GAAM,MAAM;AAAA,EACnC;AAEK,SAAAnG;AACT;ACPO,SAASqG,IAAuD;AAC/D,QAAAC,IAASC,GAA6B3D,CAAc;AACtD,MAAA4D,GACAC;AACJ,SAAIH,KAAU,QAAMI,EAAW,IAAIT,EAAiB,KAAK,SAAS,oBAAoB,GAE/E;AAAA,IACL,QAAAK;AAAA;AAAA,IAEA,IAAI,MAAM;AACD,aAAAA,EAAO,SAASI,EAAW,UAAU;AAAA,IAC9C;AAAA;AAAA,IAEA,CAAC7D,CAAiB,EAAEhC,GAAoB;AACtC,MAAA8F,GAAU9F,CAAI,GACV2F,KAAUE,EAAW,GAAG7D,CAAiB,QAAQ,GAC1C2D,IAAA3F;AAAA,IACb;AAAA;AAAA,IAEA,CAACiC,CAAkB,EAAEjC,GAAoB;AACvC,MAAA+F,GAAgB/F,CAAI,GAChB4F,KAAWC,EAAW,GAAG5D,CAAkB,QAAQ,GAC3C2D,IAAA5F;AAAA,IACd;AAAA;AAAA,IAEA,WAAW;AACG,MAAA4F,KAAA,QAAAA,KACDD,KAAA,QAAAA;AAAA,IAAA;AAAA,EAEf;AACF;AC5BA,MAAAK,KAAe7D,EAAgB;AAAA,EAC7B,MAAM;AAAA,EACN,OAAO;AAAA,IACL,UAAU7D,EAAeqG,GAAiBA,EAAgB,YAAY;AAAA,EACxE;AAAA,EAGA,MAAMhE,GAAO;AACX,QAAIsF,IAAUrB,EAA4B;AAE1C,UAAM,EAAE,KAAA1B,GAAK,UAAAyC,GAAU,WAAAC,EAAA,IAAcJ,EAAuB;AAE5D,WAAAG,EAAS,MAAM;AACb,MAAAM,IAAU/C,EAAI,wBAAwBJ,EAAsBnC,CAAK,CAAC,GAClEuC,EAAI,WAAW+C,CAAO;AAAA,IAAA,CACvB,GAEDL,EAAU,MAAM;AACd,MAAA1C,EAAI,cAAc+C,CAAO;AAAA,IAAA,CAC1B,GAED3C,EAAM,MAAM3C,EAAM,UAAU,CAAClC,MAAU;AACrC,MAAAwH,EAAQ,YAAYnD,EAAsBrE,GAAOkG,CAAe,CAAC;AAAA,IAAA,CAClE,GACMjF;AAAA,EAAA;AAEX,CAAC,GC5BDwG,KAAe/D,EAAgB;AAAA,EAC7B,MAAM;AAAA,EACN,OAAO;AAAA,IACL,UAAU7D,EAAeqG,GAAiBA,EAAgB,YAAY;AAAA,EACxE;AAAA,EAGA,MAAMhE,GAAO;AACX,QAAIsF,IAAUrB,EAAsB;AAEpC,UAAM,EAAE,KAAA1B,GAAK,UAAAyC,GAAU,WAAAC,EAAA,IAAcJ,EAAuB;AAE5D,WAAAG,EAAS,MAAM;AACb,MAAAM,IAAU/C,EAAI,kBAAkBJ,EAAsBnC,CAAK,CAAC,GAC5DuC,EAAI,WAAW+C,CAAO;AAAA,IAAA,CACvB,GAEDL,EAAU,MAAM;AACd,MAAA1C,EAAI,cAAc+C,CAAO;AAAA,IAAA,CAC1B,GAED3C,EAAM,MAAM3C,EAAM,UAAU,CAAClC,MAAU;AACrC,MAAAwH,EAAQ,YAAYnD,EAAsBrE,GAAOkG,CAAe,CAAC;AAAA,IAAA,CAClE,GACMjF;AAAA,EAAA;AAEX,CAAC,GC1BDyG,KAAehE,EAAgB;AAAA,EAC7B,MAAM;AAAA,EACN,OAAO;AAAA,IACL,cAAcrD,EAAa,MAAM;AAAA,IACjC,UAAUA,EAAa,MAAM;AAAA,IAC7B,SAASA,EAAa,MAAM;AAAA,IAC5B,QAAQA,EAAa,MAAM;AAAA,IAC3B,MAAMF,EAAa,KAAY;AAAA,EACjC;AAAA,EACA,MAAM+B,GAAO;AACX,UAAM,EAAE,KAAAuC,GAAK,UAAAyC,GAAU,WAAAC,EAAA,IAAcJ,EAAuB;AAC5D,QAAIY,IAAUxB,EAAkB;AAEhC,WAAAe,EAAS,MAAM;AACH,MAAAS,IAAAlD,EAAI,cAAcvC,CAAK;AAAA,IAAA,CAClC,GACDiF,EAAU,MAAM;AACd,MAAAQ,EAAQ,OAAO;AAAA,IAAA,CAChB,GAEK9C,EAAA,MAAM3C,EAAM,MAAM,CAAC0F,MAAMD,EAAQ,QAAQC,CAAC,CAAC,GACjD/C;AAAA,MACE,CAAC,MAAM3C,EAAM,cAAc,MAAMA,EAAM,UAAU,MAAMA,EAAM,SAAS,MAAMA,EAAM,MAAM;AAAA,MACxF,MAAMyF,EAAQ,WAAWzF,CAAK;AAAA,IAChC,GAEOjB;AAAA,EAAA;AAEX,CAAC,GCxBK4G,KAAoBnE,EAAgB;AAAA,EACxC,MAAM;AAAA,EACN,QAAQ,CAACD,CAAQ;AAAA;AAAA,EAEjB,OAAO;AAAA,IACL,UAAUpD,EAAa,MAAM;AAAA,IAC7B,SAASA,EAAa,MAAM;AAAA,IAC5B,gBAAgBA,EAAa,MAAM;AAAA,IACnC,eAAeA,EAAa,OAAO;AAAA,IACnC,QAAQA,EAAa,KAAY;AAAA,IACjC,uBAAuBA,EAAa,QAAe;AAAA,IACnD,QAAQA,EAAa,MAAM;AAAA,EAC7B;AAAA,EACA,QAAQ;AACC,WAAA;AAAA,MACL,WAAW8F,EAA0B;AAAA,MACrC,SAASjC,EAAuB,CAAE,CAAA;AAAA,IACpC;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AACT,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,UAAU;AACR,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,iBAAiB;AACf,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,gBAAgB;AACd,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,QAAQ;AAAA,MACN,UAAU;AACR,aAAK,SAAS;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR;AAAA,IACA,wBAAwB;AACtB,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,SAAS;AACP,WAAK,SAAS;AAAA,IAAA;AAAA,EAElB;AAAA,EACA,WAAW;AAET,SAAK,YAAY,KAAK,KAAK,sBAAsB,IAAI;AAAA,EACvD;AAAA,EACA,YAAY;AACV,SAAK,UAAU,aAAa;AAAA,EAC9B;AAAA,EACA,SAAS;AAAA;AAAA,IAEP,cAAuB;AACrB,aAAO,KAAK,aAAa;AAAA,IAC3B;AAAA,IACA,YAAY4D,GAAuB;AAC5B,WAAA,QAAQ,KAAKA,CAAM,GACpB,KAAK,iBAEF,KAAA,UAAU,UAAUA,CAAM;AAAA,IAEnC;AAAA,IACA,eAAeA,GAAuB;AAChC,MAAA,KAAK,iBACF,KAAA,UAAU,aAAaA,CAAM,GAE7BC,EAAA,OAAO,KAAK,SAASD,CAAM;AAAA,IAAA;AAAA,EACpC;AAEJ,CAAC;;cAjFCvC,EAEM,OAAA;AAAA,IAFA,OAAKI,EAAEF,EAAA,SAAS,IAAI;AAAA,EAAA,GAAA;AAAA,IACxBI,EAAQJ,EAAA,QAAA,SAAA;AAAA,EAAA,GAAA,CAAA;;oDCGZuC,KAAetE,EAAgB;AAAA,EAC7B,MAAM;AAAA,EACN,QAAQ,CAACD,CAAQ;AAAA;AAAA;AAAA;AAAA,EAIjB,QAAQ;AACC,WAAA;AAAA,MACL,OAAO0C,EAAuB;AAAA,IAChC;AAAA,EACF;AAAA,EACA,OAAO,CAEP;AAAA,EACA,WAAW;AACJ,SAAA,QAAQ,IAAI8B,GAAa,GACzB,KAAA,KAAK,SAAS,KAAK,KAAK;AAAA,EAC/B;AAAA,EACA,YAAY;AACL,SAAA,KAAK,YAAY,KAAK,KAAK;AAAA,EAAA;AAEpC,CAAC,GChBDC,KAAexE,EAAgB;AAAA,EAC7B,MAAM;AAAA,EACN,QAAQ,CAACD,CAAQ;AAAA,EACjB,cAAc;AAAA,EACd,OAAO;AAAA,IACL,QAAQtD,EAAa0D,CAAM;AAAA,IAC3B,QAAQ1D,EAAa,MAAM;AAAA,IAC3B,WAAWE,EAAa,OAAO;AAAA,IAC/B,UAAUA,EAAa,OAAO;AAAA,IAC9B,aAAaA,EAAa,MAAM;AAAA,IAChC,eAAeA,EAAa,MAAM;AAAA,IAClC,cAAcA,EAAa,MAAM;AAAA,IACjC,SAASA,EAAa,OAAO;AAAA,IAC7B,QAAQA,EAAa,MAAM;AAAA,IAC3B,WAAWA,EAAa,MAAM;AAAA,IAC9B,aAAaA,EAAa,MAAM;AAAA,IAChC,mBAAmBoC,EAAU;AAAA,IAC7B,mBAAmBA,EAAU;AAAA,EAC/B;AAAA,EACA,OAAO;AAAA,EACP,MAAMP,GAAO,EAAE,OAAAD,KAAS;AACf,WAAA;AAAA,MACL,OAAOM,EAAiBN,GAAOC,CAAK;AAAA,MACpC,SAASiE,EAAwB;AAAA,MACjC,eAAe;AAAA,MACf,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,OAAOnG,GAAO;AACR,UAAA,KAAK,iBAAiB,MAAM;AAC9B,cAAM+E,IAAS,KAAK;AAEhB,YADJ,KAAK,gBAAgB,QACjBA,MAAWoD,EAAMnI,CAAK;AAExB;AAAA,MACF;AAEG,WAAA,QAAQ,UAAUA,CAAK;AAAA,IAC9B;AAAA,IACA,OAAOA,GAAO;AACR,UAAA,KAAK,iBAAiB,MAAM;AAC9B,cAAMoI,IAAS,KAAK;AAEpB,YADA,KAAK,gBAAgB,QACjBA,MAAWpI;AAEb;AAAA,MACF;AAEG,WAAA,QAAQ,UAAUA,CAAK;AAAA,IAC9B;AAAA,IACA,YAAY;AACV,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,SAASA,GAAO;AACT,WAAA,QAAQ,YAAYA,CAAK;AAAA,IAChC;AAAA,IACA,YAAYA,GAAO;AACZ,WAAA,QAAQ,eAAeA,CAAK;AAAA,IACnC;AAAA,IACA,cAAcA,GAAO;AACd,WAAA,QAAQ,iBAAiBA,CAAK;AAAA,IACrC;AAAA,IACA,aAAaA,GAAO;AACb,WAAA,QAAQ,gBAAgBA,CAAK;AAAA,IACpC;AAAA,IACA,UAAUA,GAAO;AACV,WAAA,QAAQ,aAAaA,CAAK;AAAA,IACjC;AAAA,IACA,YAAYA,GAAO;AACZ,WAAA,QAAQ,eAAeA,CAAK;AAAA,IACnC;AAAA,IACA,QAAQA,GAAO;AACR,WAAA,QAAQ,WAAWA,CAAK;AAAA,IAC/B;AAAA,IACA,OAAOA,GAAO;AACP,WAAA,QAAQ,UAAUA,CAAK;AAAA,IAAA;AAAA,EAEhC;AAAA,EACA,WAAW;AACT,SAAK,UAAU,KAAK,KAAK,aAAa,IAAI,GACrC,KAAA,KAAK,WAAW,KAAK,OAAO,GACjC4E,EAAW,KAAK,MAAM,WAAW,KAAK,OAAO,GACzC,KAAK,MAAM,cAAc,eAAe,KACrC,KAAA,QAAQ,iBAAiB,kBAAkB,MAAM;AACpD,WAAK,MAAM,iBAAiB,KAAK,gBAAgB,KAAK,QAAQ,WAAW;AAAA,IAAA,CAC1E,GAEC,KAAK,MAAM,cAAc,eAAe,KACrC,KAAA,QAAQ,iBAAiB,kBAAkB,MAAM;AACpD,WAAK,MAAM,iBAAiB,KAAK,gBAAgB,KAAK,QAAQ,WAAW;AAAA,IAAA,CAC1E;AAAA,EAEL;AAAA,EACA,YAAY;AACL,SAAA,KAAK,cAAc,KAAK,OAAO;AAAA,EAAA;AAExC,CAAC;AC9FD,MAAMyD,WAA6BC,GAAe;AAAA,EAChD,YACE7D,GACA8D,GACOC,GACCC,GACR;AACA,UAAMhE,GAAK8D,CAAO,GAHX,KAAA,UAAAC,GACC,KAAA,WAAAC;AAAA,EAAA;AAAA,EAIA,WAAwB;AAChC,WAAO,KAAK;AAAA,EAAA;AAAA,EAEJ,OAAOC,GAAqC;AACpD,UAAMC,IAAQD,EAAW,yBAAyB,KAAK,QAAQ;AAC/D,SAAK,QAAQ,MAAM,OAAOC,EAAM,IAAI,MACpC,KAAK,QAAQ,MAAM,MAAMA,EAAM,IAAI;AAAA,EAAA;AAAA,EAErC,YAAYF,GAAkB;AAC5B,SAAK,WAAWA,GAChB,KAAK,KAAK;AAAA,EAAA;AAEd;AAEA,MAAMG,KAAmBlF,EAAgB;AAAA,EACvC,MAAM;AAAA,EACN,QAAQ,CAACD,CAAQ;AAAA,EACjB,OAAO;AAAA,IACL,SAAS5D,EAAegJ,GAASA,EAAQ,kBAAkB;AAAA,IAC3D,UAAU1I,EAAa0D,CAAM;AAAA,EAC/B;AAAA,EAGA,QAAQ;AACC,WAAA;AAAA,MACL,SAASsC,EAA+B;AAAA,IAC1C;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,SAASnG,GAAO;AACT,WAAA,QAAQ,YAAYA,CAAK;AAAA,IAChC;AAAA,IACA,UAAU;AACR,WAAK,SAAS;AAAA,IAAA;AAAA,EAElB;AAAA,EACA,SAAS;AAAA,IACP,UAAuB;AACrB,aAAO,KAAK;AAAA,IAAA;AAAA,EAEhB;AAAA,EACA,WAAW;AACT,SAAK,UAAU,IAAIqI,GAAqB,KAAK,MAAMhE,EAAsB,IAAI,GAAG,KAAK,WAAW,KAAK,QAAQ,GACxG,KAAA,KAAK,kBAAkB,KAAK,OAAO;AAAA,EAC1C;AAAA,EACA,YAAY;AACL,SAAA,KAAK,qBAAqB,KAAK,OAAO;AAAA,EAAA;AAE/C,CAAC;;AArEC,SAAAiB,EAAA,GAAAC,EAEM,OAFNC,EAEM;AAAA,IAFA,OAAOC,EAAS,SAAA;AAAA,EAAA,GAAcA,EAAM,MAAA,GAAA;AAAA,IACxCI,EAAQJ,EAAA,QAAA,SAAA;AAAA,EAAA,GAAA,EAAA;;oDCkBCqD,KAAgB;AAAA,EAC3B,UAAU3I,EAAa0D,CAAM;AAAA,EAC7B,OAAOxD,EAAa,MAAM;AAAA,EAC1B,OAAOA,EAAa,MAA+B;AAAA,EACnD,MAAMA,EAAa,MAA6B;AAAA,EAChD,WAAWA,EAAa,OAAO;AAAA,EAC/B,WAAWA,EAAa,OAAO;AAAA,EAC/B,aAAaA,EAAa,OAAO;AAAA,EACjC,QAAQA,EAAa,MAAM;AAAA,EAC3B,QAAQA,EAAa,MAAM;AAAA,EAC3B,SAASA,EAAa,OAAO;AAAA,EAC7B,2BAA2BA,EAAa,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAK/C,oBAAoBA,EAAa,SAAS,EAAI;AAAA,EAC9C,qBAAqBoC,EAAU;AACjC,GAIMsG,KAAWrF,EAAgB;AAAA,EAC/B,MAAM;AAAA,EACN,QAAQ,CAACD,CAAQ;AAAA,EACjB,cAAc;AAAA,EACd,OAAOqF;AAAA,EACP,OAAO;AAAA,EACP,MAAM5G,GAAO,EAAE,OAAAD,KAAS;AACf,WAAA;AAAA,MACL,OAAOM,EAAiBN,GAAOC,CAAK;AAAA,MACpC,QAAQiE,EAAwB;AAAA,MAChC,cAAcjC,EAAe;AAAA,MAC7B,MAAMA,EAAc;AAAA,MACpB,iBAAiB;AAAA,MACjB,8BAA8BhC,EAAM;AAAA,IACtC;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,SAASlC,GAAe;AAClB,UAAA,KAAK,mBAAmB,MAAM;AAChC,cAAMyI,IAAW,KAAK;AAElB,YADJ,KAAK,kBAAkB,QACnBA,MAAaN,EAAMnI,CAAK;AAE1B;AAAA,MACF;AAEG,WAAA,OAAO,YAAYA,CAAK;AAAA,IAC/B;AAAA,IACA,MAAMA,GAAe;AACd,WAAA,OAAO,SAASA,CAAK;AAAA,IAC5B;AAAA,IACA,MAAMA,GAAqBgJ,GAAwB;AAC7C,MAAAC,GAAUjJ,GAAOgJ,CAAQ,MAIzBhJ,IACG,KAAA,OAAO,SAASA,CAAK,IAE1B,KAAK,SAAS;AAAA,IAElB;AAAA,IACA,KAAKA,GAAmB;AACtB,MAAIA,IACG,KAAA,OAAO,QAAQA,CAAK,IAEzB,KAAK,SAAS;AAAA,IAElB;AAAA,IACA,UAAUA,GAAgB;AACpB,MAAA,KAAK,kBAAkBkJ,IACzB,KAAK,SAAS,IAET,KAAA,OAAO,aAAalJ,CAAK;AAAA,IAElC;AAAA,IACA,UAAUA,GAAgB;AACnB,WAAA,OAAO,aAAaA,CAAK;AAAA,IAChC;AAAA,IACA,cAAc;AACZ,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,SAAS;AACP,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,OAAOA,GAAgB;AACjB,MAAA,KAAK,kBAAkBkJ,IACzB,KAAK,SAAS,IAET,KAAA,OAAO,UAAUlJ,CAAK;AAAA,IAE/B;AAAA,IACA,QAAQA,GAAgB;AACjB,WAAA,OAAO,WAAWA,CAAK;AAAA,IAC9B;AAAA,IACA,4BAA4B;AAC1B,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,qBAAqB;AACnB,WAAK,SAAS;AAAA,IAAA;AAAA,EAElB;AAAA,EACA,WAAW;AAET,SAAK,SAAS,KAAK,KAAK,aAAa,IAAI,GACrC,KAAK,gBACP,KAAK,OAAO,mBAAmB,KAAK,aAAa,OAAO,GAGtD,KAAK,gBAAgB,KAAK,qBAC5B,KAAK,WAAW,EAAG,YAAY,KAAK,MAAM,IAErC,KAAA,KAAK,WAAW,KAAK,MAAM,GAGlC,KAAK,+BAA+B,KAAK,oBAIrC,KAAK,QACP,KAAK,KAAK,QAAQ,KAAK,KAAK,QAAQ,KAAK,KAAK,MAAM,GAGtD4E,EAAW,KAAK,MAAM,WAAW,KAAK,MAAM,GAExC,KAAK,MAAM,cAAc,iBAAiB,KAC5C,KAAK,OAAO,iBAAiB,WAAW,CAAC9B,MAAU;AACjD,WAAK,MAAM,mBAAmB,KAAK,kBAAkBA,EAAM,QAAQ;AAAA,IAAA,CACpE;AAAA,EAEL;AAAA,EACA,YAAY;AACV,IAAI,KAAK,gBAAgB,KAAK,+BAC5B,KAAK,WAAW,EAAG,eAAe,KAAK,MAAM,IAExC,KAAA,KAAK,cAAc,KAAK,MAAM;AAAA,EAEvC;AAAA,EACA,SAAS;AAAA,IACP,aAA4C;AACnC,aAAAI,EAAgB,KAAK,SAAS2E,EAAiB;AAAA,IACxD;AAAA,IACA,WAAWsB,GAAgB;AACzB,WAAK,eAAeA,GAEhB,KAAK,UACF,KAAA,OAAO,mBAAmBA,EAAM,OAAO;AAAA,IAEhD;AAAA,IACA,cAAcC,GAAiB;AACxB,WAAA,OAAO,mBAAmB,MAAS,GACxC,KAAK,eAAe;AAAA,IACtB;AAAA,IACA,UAAUC,GAAc;AACtB,WAAK,OAAOA,GAER,KAAK,UACPA,EAAK,QAAQA,EAAK,QAAQ,KAAK,KAAK,MAAM;AAAA,IAE9C;AAAA,IACA,aAAaA,GAAc;AACzB,MAAAA,EAAK,QAAQ,MAAM,GACnB,KAAK,OAAO;AAAA,IACd;AAAA,IACA,kBAAkBA,GAAcC,GAAiB;AACtC,MAAAA,IAAAD,EAAK,QAAQ,KAAK,KAAK,MAAM,IAAIA,EAAK,QAAQ,MAAM;AAAA,IAAA;AAAA,EAC/D;AAEJ,CAAC;;SA7LCxD,EAAaJ,EAAA,QAAA,SAAA;;mDCeT8D,KAAY7F,EAAgB;AAAA,EAChC,MAAM;AAAA,EACN,QAAQ,CAACD,CAAQ;AAAA,EACjB,cAAc;AAAA,EACd,OAAO;AAAA,IACL,MAAMtD,EAAa,OAAO;AAAA,IAC1B,UAAUE,EAAawD,CAAM;AAAA,IAC7B,QAAQxD,EAAa,MAAM;AAAA,IAC3B,UAAUA,EAAa,MAAM;AAAA,IAC7B,aAAaA,EAAa,MAAM;AAAA,IAChC,QAAQA,EAAa,MAAM;AAAA,IAC3B,iBAAiBoC,EAAU;AAAA,EAC7B;AAAA,EAGA,OAAO;AAAA,EACP,MAAMP,GAAO,EAAE,OAAAD,KAAS;AACf,WAAA;AAAA,MACL,OAAOM,EAAiBN,GAAOC,CAAK;AAAA,MACpC,SAASiE,EAAyB;AAAA,IACpC;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,KAAKmD,GAAiB;AAChB,MAAA,KAAK,YACP,KAAK,QAAQ,EAAG,kBAAkB,MAAMA,CAAM,IAE9CA,IAAS,KAAK,QAAQ,KAAS,IAAA,KAAK,QAAQ,MAAM;AAAA,IAEtD;AAAA,IACA,SAAStJ,GAAO;AACT,WAAA,QAAQ,YAAYA,CAAK;AAAA,IAChC;AAAA,IACA,SAAS;AACP,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,SAASA,GAAO;AACT,WAAA,QAAQ,YAAYA,CAAK;AAAA,IAChC;AAAA,IACA,cAAc;AACZ,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,OAAOA,GAAO;AACP,WAAA,QAAQ,UAAUA,CAAK;AAAA,IAAA;AAAA,EAEhC;AAAA,EACA,WAAW;AACT,SAAK,UAAU,KAAK,KAAK,cAAc,KAAK,YAAY,GACpD,KAAK,YACF,KAAA,QAAA,EAAW,UAAU,IAAI,IAEzB,KAAA,QAAQ,KAAK,QAAQ,KAAK,GAG7B,KAAK,MAAM,cAAc,aAAa,KACnC,KAAA,QAAQ,iBAAiB,cAAc,MAAM;AAC3C,WAAA,MAAM,eAAe,EAAK;AAAA,IAAA,CAChC,GAGH4E,EAAW,KAAK,MAAM,WAAW,KAAK,OAAO;AAAA,EAC/C;AAAA,EACA,YAAY;AACN,IAAA,KAAK,YACF,KAAA,QAAA,EAAW,aAAa,IAAI,IAEjC,KAAK,QAAQ,MAAM;AAAA,EAEvB;AAAA,EACA,SAAS;AAAA,IACP,aAA6B;AACpB,aAAA;AAAA,QACL,SAAS,KAAK,QAAQ;AAAA,QACtB,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,aAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,UAAuB;AACrB,aAAO,KAAK;AAAA,IACd;AAAA,IACA,UAA8C;AAC5C,aAAOzB,EAA4B4F,GAAU,KAAK,SAAS3C,CAAK;AAAA,IAClE;AAAA,IACA,KAAK0B,GAAwB;AACtB,WAAA,QAAQ,KAAKA,CAAM;AAAA,IAC1B;AAAA,IACA,QAAQ;AACN,WAAK,QAAQ,MAAM;AAAA,IAAA;AAAA,EACrB;AAEJ,CAAC;;AA5GC,SAAAxC,EAAA,GAAAC,EAEM,OAFNC,EAEM;AAAA,IAFA,OAAOC,EAAS,SAAA;AAAA,EAAA,GAAcA,QAAM,KAAK,GAAA;AAAA,IAC7CI,EAAQJ,EAAA,QAAA,SAAA;AAAA,EAAA,GAAA,EAAA;;oDCeN+D,KAAe9F,EAAgB;AAAA,EACnC,MAAM;AAAA,EACN,QAAQ,CAACD,CAAQ;AAAA,EACjB,cAAc;AAAA,EACd,OAAO;AAAA,IACL,MAAMtD,EAAa,OAAO;AAAA,IAC1B,UAAUE,EAAawD,CAAM;AAAA,IAC7B,UAAUxD,EAAa,MAAM;AAAA,IAC7B,QAAQA,EAAa,MAAM;AAAA,IAC3B,gBAAgBA,EAAa,OAAO;AAAA,IACpC,iBAAiBoC,EAAU;AAAA,EAC7B;AAAA,EACA,OAAO;AAAA,EACP,MAAMP,GAAO,EAAE,OAAAD,KAAS;AACf,WAAA;AAAA,MACL,OAAOM,EAAiBN,GAAOC,CAAK;AAAA,MACpC,SAASiE,EAA4B;AAAA,IACvC;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,KAAKmD,GAAiB;AAChB,MAAA,KAAK,YACP,KAAK,QAAQ,EAAG,kBAAkB,MAAMA,CAAM,IAE9CA,IAAS,KAAK,QAAQ,KAAS,IAAA,KAAK,QAAQ,MAAM;AAAA,IAEtD;AAAA,IACA,SAAStJ,GAAO;AACT,WAAA,QAAQ,YAAYA,CAAK;AAAA,IAChC;AAAA,IACA,WAAW;AACT,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,SAAS;AACP,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,iBAAiB;AACf,WAAK,SAAS;AAAA,IAAA;AAAA,EAElB;AAAA,EACA,SAAS;AAAA,IACP,UAAuB;AACrB,aAAO,KAAK;AAAA,IACd;AAAA,IACA,UAA8C;AAC5C,aAAOmD,EAA4B4F,GAAU,KAAK,SAAS3C,CAAK;AAAA,IAClE;AAAA,IACA,aAAgC;AACvB,aAAA;AAAA,QACL,SAAS,KAAK,QAAQ;AAAA,QACtB,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,gBAAgB,KAAK;AAAA,MACvB;AAAA,IAAA;AAAA,EAEJ;AAAA,EACA,WAAW;AACT,SAAK,UAAU,KAAK,KAAK,iBAAiB,KAAK,YAAY,GACvD,KAAK,YACF,KAAA,QAAA,EAAW,UAAU,IAAI,IAEzB,KAAA,QAAQ,KAAK,QAAQ,KAAK,GAI5B,KAAA,QAAQ,iBAAiB,QAAQ,MAAM;AACrC,WAAA,MAAM,eAAe,EAAI;AAAA,IAAA,CAC/B,GACI,KAAA,QAAQ,iBAAiB,SAAS,MAAM;AACtC,WAAA,MAAM,eAAe,EAAK;AAAA,IAAA,CAChC,GAEDxB,EAAW,KAAK,MAAM,WAAW,KAAK,OAAO;AAAA,EAC/C;AAAA,EACA,YAAY;AACN,IAAA,KAAK,YACF,KAAA,QAAA,EAAW,aAAa,IAAI,IAEjC,KAAK,QAAQ,MAAM;AAAA,EACrB;AAEJ,CAAC;;AAlGC,SAAA6E,IAAAnE,EAAA,GAAAC,EAEM,OAFNC,EAEM;AAAA,IAFc,OAAOC,EAAS,SAAA;AAAA,EAAA,GAAcA,QAAM,KAAK,GAAA;AAAA,IAC3DI,EAAQJ,EAAA,QAAA,SAAA;AAAA,EAAA,GAAA,EAAA,IAAA;AAAA,SADGA,EAAI,IAAA;AAAA,EAAA,CAAA;;oDCabiE,KAAUhG,EAAgB;AAAA,EAC9B,MAAM;AAAA,EACN,QAAQ,CAACD,CAAQ;AAAA,EACjB,cAAc;AAAA,EACd,OAAO;AAAA,IACL,UAAUpD,EAAawD,CAAM;AAAA,IAC7B,QAAQxD,EAAa,MAAM;AAAA,IAC3B,QAAQA,EAAa,MAAM;AAAA,IAC3B,SAASR,EAAegJ,CAAO;AAAA,EACjC;AAAA,EAIA,OAAO;AAAA,EACP,MAAM3G,GAAO,EAAE,OAAAD,KAAS;AACf,WAAA;AAAA,MACL,OAAOM,EAAiBN,CAAK;AAAA,MAC7B,SAASkE,EAAuB;AAAA,IAClC;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,SAASnG,GAAO;AACT,WAAA,QAAQ,YAAYA,CAAK;AAAA,IAChC;AAAA,IACA,OAAOA,GAAO;AACP,WAAA,QAAQ,UAAUA,CAAK;AAAA,IAC9B;AAAA,IACA,OAAOA,GAAO;AACP,WAAA,QAAQ,UAAUA,CAAK;AAAA,IAC9B;AAAA,IACA,QAAQA,GAAO;AACR,WAAA,QAAQ,WAAWA,CAAK;AAAA,IAC/B;AAAA,IACA,UAAU;AACR,WAAK,SAAS;AAAA,IAAA;AAAA,EAElB;AAAA,EACA,SAAS;AAAA,IACP,UAAuB;AACrB,aAAO,KAAK;AAAA,IACd;AAAA,IACA,SAA6B;;AACpB,cAAAoE,IAAA,KAAK,cAAL,gBAAAA,EAAgB;AAAA,IACzB;AAAA,IACA,UAA8C;AAC5C,aAAOjB,EAA4B4F,GAAU,KAAK,SAAS3C,CAAK;AAAA,IAClE;AAAA,IACA,aAA2B;AAClB,aAAA;AAAA,QACL,SAAS,KAAK,QAAQ;AAAA,QACtB,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,SAAS/B,EAAsB,KAAK,SAASwE,CAAO;AAAA,MACtD;AAAA,IAAA;AAAA,EAEJ;AAAA,EACA,WAAW;AACT,SAAK,UAAU,KAAK,KAAK,YAAY,KAAK,YAAY,GAElD,KAAK,YACF,KAAA,QAAA,EAAW,WAAW,IAAI,IAE1B,KAAA,KAAK,WAAW,KAAK,OAAO,GAEnCjE,EAAW,KAAK,MAAM,WAAW,KAAK,OAAO;AAAA,EAC/C;AAAA,EACA,YAAY;AACN,IAAA,KAAK,YACF,KAAA,QAAA,EAAW,cAAc,IAAI,IAE7B,KAAA,KAAK,cAAc,KAAK,OAAO;AAAA,EACtC;AAEJ,CAAC;;AAvFC,SAAAU,EAAA,GAAAC,EAEM,OAFNC,EAEM;AAAA,IAFA,OAAOC,EAAS,SAAA;AAAA,EAAA,GAAcA,QAAM,KAAK,GAAA;AAAA,IAC7CI,EAAQJ,EAAA,QAAA,SAAA;AAAA,EAAA,GAAA,EAAA;;oDCSCkE,KAAiB;AAAA,EAC5B,OAAOxJ,EAAa,KAA6B;AAAA,EACjD,WAAWE,EAAa,OAAO;AAAA,EAC/B,UAAUA,EAAa,OAAO;AAAA,EAC9B,aAAaA,EAAa,MAAM;AAAA,EAChC,eAAeA,EAAa,MAAM;AAAA,EAClC,cAAcA,EAAa,MAAM;AAAA,EACjC,SAASA,EAAa,OAAO;AAAA,EAC7B,QAAQA,EAAa,MAAM;AAAA,EAC3B,WAAWA,EAAa,MAAM;AAAA,EAC9B,aAAaA,EAAa,MAAM;AAAA,EAChC,kBAAkBoC,EAAU;AAC9B,GAIAmH,KAAelG,EAAgB;AAAA,EAC7B,MAAM;AAAA,EACN,QAAQ,CAACD,CAAQ;AAAA,EACjB,cAAc;AAAA,EACd,OAAOkG;AAAA,EACP,OAAO;AAAA,EACP,MAAMzH,GAAO,EAAE,OAAAD,KAAS;AACf,WAAA;AAAA,MACL,OAAOM,EAAiBN,GAAOC,CAAK;AAAA,MACpC,SAASiE,EAAyB;AAAA,MAClC,cAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,MACL,QAAQnG,GAAmB;AACrB,YAAA,KAAK,gBAAgB,MAAM;AAC7B,gBAAM6J,IAAQ,KAAK;AAGnB,cAFA,KAAK,eAAe,QAEhBA,EAAM,WAAW7J,EAAM,UAAU6J,EAAM,MAAM,CAACjC,GAAG,MAAMA,MAAMO,EAAMnI,EAAM,CAAC,CAAC,CAAC;AAE9E;AAAA,QACF;AAEG,aAAA,QAAQ,SAASA,CAAK;AAAA,MAC7B;AAAA,MACA,MAAM;AAAA,IACR;AAAA,IACA,YAAY;AACV,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,SAASA,GAAO;AACT,WAAA,QAAQ,YAAYA,CAAK;AAAA,IAChC;AAAA,IACA,YAAYA,GAAO;AACZ,WAAA,QAAQ,eAAeA,CAAK;AAAA,IACnC;AAAA,IACA,cAAcA,GAAO;AACd,WAAA,QAAQ,iBAAiBA,CAAK;AAAA,IACrC;AAAA,IACA,aAAaA,GAAO;AACb,WAAA,QAAQ,gBAAgBA,CAAK;AAAA,IACpC;AAAA,IACA,UAAUA,GAAO;AACV,WAAA,QAAQ,aAAaA,CAAK;AAAA,IACjC;AAAA,IACA,YAAYA,GAAO;AACZ,WAAA,QAAQ,eAAeA,CAAK;AAAA,IACnC;AAAA,IACA,QAAQA,GAAO;AACR,WAAA,QAAQ,WAAWA,CAAK;AAAA,IAC/B;AAAA,IACA,OAAOA,GAAO;AACP,WAAA,QAAQ,UAAUA,CAAK;AAAA,IAAA;AAAA,EAEhC;AAAA,EACA,WAAW;AACT,SAAK,UAAU,KAAK,KAAK,cAAc,IAAI,GACtC,KAAA,KAAK,WAAW,KAAK,OAAO,GACjC4E,EAAW,KAAK,MAAM,WAAW,KAAK,OAAO,GACzC,KAAK,MAAM,cAAc,cAAc,KACpC,KAAA,QAAQ,iBAAiB,gBAAgB,MAAM;AAClD,WAAK,MAAM,gBAAgB,KAAK,eAAe,KAAK,QAAQ,UAAU;AAAA,IAAA,CACvE;AAAA,EAEL;AAAA,EACA,YAAY;AACL,SAAA,KAAK,cAAc,KAAK,OAAO;AAAA,EAAA;AAGxC,CAAC,GCxFDkF,KAAepG,EAAgB;AAAA,EAC7B,MAAM;AAAA,EACN,QAAQ,CAACD,CAAQ;AAAA,EACjB,cAAc;AAAA,EACd,OAAO;AAAA,IACL,MAAMtD,EAAa,KAA2B;AAAA,IAC9C,OAAOE,EAAa,KAAiC;AAAA,IACrD,WAAWA,EAAa,OAAO;AAAA,IAC/B,UAAUA,EAAa,OAAO;AAAA,IAC9B,aAAaA,EAAa,MAAM;AAAA,IAChC,eAAeA,EAAa,MAAM;AAAA,IAClC,cAAcA,EAAa,MAAM;AAAA,IACjC,SAASA,EAAa,OAAO;AAAA,IAC7B,QAAQA,EAAa,MAAM;AAAA,IAC3B,iBAAiBoC,EAAU;AAAA,EAC7B;AAAA,EACA,OAAO;AAAA,EACP,MAAMP,GAAO,EAAE,OAAAD,KAAS;AACf,WAAA;AAAA,MACL,OAAOM,EAAiBN,GAAOC,CAAK;AAAA,MACpC,SAASiE,EAA0B;AAAA,MACnC,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,MACJ,QAAQnG,GAAO;AACT,YAAA,KAAK,eAAe,MAAM;AAC5B,gBAAM8G,IAAO,KAAK;AAEd,cADJ,KAAK,cAAc,QACfA,MAASqB,EAAMnI,CAAK;AAEtB;AAAA,QACF;AAEG,aAAA,QAAQ,QAAQA,CAAK;AAAA,MAC5B;AAAA,MACA,MAAM;AAAA,IACR;AAAA,IACA,OAAO;AAAA,MACL,UAAU;AACR,aAAK,SAAS;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR;AAAA,IACA,YAAY;AACV,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,SAASA,GAAO;AACT,WAAA,QAAQ,YAAYA,CAAK;AAAA,IAChC;AAAA,IACA,YAAYA,GAAO;AACZ,WAAA,QAAQ,eAAeA,CAAK;AAAA,IACnC;AAAA,IACA,cAAcA,GAAO;AACd,WAAA,QAAQ,iBAAiBA,CAAK;AAAA,IACrC;AAAA,IACA,aAAaA,GAAO;AACb,WAAA,QAAQ,gBAAgBA,CAAK;AAAA,IACpC;AAAA,IACA,QAAQA,GAAO;AACR,WAAA,QAAQ,WAAWA,CAAK;AAAA,IAC/B;AAAA,IACA,OAAOA,GAAO;AACP,WAAA,QAAQ,UAAUA,CAAK;AAAA,IAAA;AAAA,EAEhC;AAAA,EACA,WAAW;AACT,SAAK,UAAU,KAAK,KAAK,eAAe,IAAI,GACvC,KAAA,KAAK,WAAW,KAAK,OAAO,GACjC4E,EAAW,KAAK,MAAM,WAAW,KAAK,OAAO,GAEzC,KAAK,MAAM,cAAc,aAAa,KACnC,KAAA,QAAQ,iBAAiB,eAAe,MAAM;AACjD,WAAK,MAAM,eAAe,KAAK,cAAc,KAAK,QAAQ,SAAS;AAAA,IAAA,CACpE;AAAA,EAEL;AAAA,EACA,YAAY;AACV,SAAK,QAAQ,OAAO;AAAA,EAAA;AAExB,CAAC,GClFDmF,KAAerG,EAAgB;AAAA,EAC7B,MAAM;AAAA,EACN,QAAQ,CAACD,CAAQ;AAAA,EACjB,cAAc;AAAA,EACd,OAAO;AAAA,IACL,QAAQtD,EAAa,MAAgC;AAAA,IACrD,WAAWE,EAAa,OAAO;AAAA,IAC/B,UAAUA,EAAa,OAAO;AAAA,IAC9B,aAAaA,EAAa,MAAM;AAAA,IAChC,eAAeA,EAAa,MAAM;AAAA,IAClC,cAAcA,EAAa,MAAM;AAAA,IACjC,SAASA,EAAa,OAAO;AAAA,IAC7B,QAAQA,EAAa,MAAM;AAAA,IAC3B,WAAWA,EAAa,MAAM;AAAA,IAC9B,aAAaA,EAAa,MAAM;AAAA,IAChC,mBAAmBoC,EAAU;AAAA,EAC/B;AAAA,EACA,OAAO;AAAA,EACP,MAAMP,GAAO,EAAE,OAAAD,KAAS;AACf,WAAA;AAAA,MACL,OAAOM,EAAiBN,GAAOC,CAAK;AAAA,MACpC,SAASiE,EAA2B;AAAA,MACpC,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,OAAOnG,GAAqB;AACtB,UAAA,KAAK,iBAAiB,MAAM;AAC9B,cAAMgK,IAAS,KAAK;AAGhB,YAFJ,KAAK,gBAAgB,QAEjBA,EAAO,OAAOhK,CAAK;AAErB;AAAA,MACF;AAEG,WAAA,QAAQ,UAAUA,CAAK;AAAA,IAC9B;AAAA,IACA,YAAY;AACV,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,SAASA,GAAO;AACT,WAAA,QAAQ,YAAYA,CAAK;AAAA,IAChC;AAAA,IACA,YAAYA,GAAO;AACZ,WAAA,QAAQ,eAAeA,CAAK;AAAA,IACnC;AAAA,IACA,cAAcA,GAAO;AACd,WAAA,QAAQ,iBAAiBA,CAAK;AAAA,IACrC;AAAA,IACA,aAAaA,GAAO;AACb,WAAA,QAAQ,gBAAgBA,CAAK;AAAA,IACpC;AAAA,IACA,UAAUA,GAAO;AACV,WAAA,QAAQ,aAAaA,CAAK;AAAA,IACjC;AAAA,IACA,YAAYA,GAAO;AACZ,WAAA,QAAQ,eAAeA,CAAK;AAAA,IACnC;AAAA,IACA,QAAQA,GAAO;AACR,WAAA,QAAQ,WAAWA,CAAK;AAAA,IAC/B;AAAA,IACA,OAAOA,GAAO;AACP,WAAA,QAAQ,UAAUA,CAAK;AAAA,IAAA;AAAA,EAEhC;AAAA,EACA,WAAW;AACT,SAAK,UAAU,KAAK,KAAK,gBAAgB,IAAI,GACxC,KAAA,KAAK,WAAW,KAAK,OAAO,GACjC4E,EAAW,KAAK,MAAM,WAAW,KAAK,OAAO,GACzC,KAAK,MAAM,cAAc,eAAe,KACrC,KAAA,QAAQ,iBAAiB,kBAAkB,MAAM;AACpD,WAAK,MAAM,iBAAiB,KAAK,gBAAgB,KAAK,QAAQ,WAAW;AAAA,IAAA,CAC1E;AAAA,EAEL;AAAA,EACA,YAAY;AACL,SAAA,KAAK,cAAc,KAAK,OAAO;AAAA,EAAA;AAGxC,CAAC,GCpFKqF,KAA4C,CAAC,gBAAgB,SAAS,GAWtEC,KAAqB;AAAA,EACzB,QAAQC,GAAU5B,IAA+B,IAAI;AAC/C,QAAAA,EAAQ,WAAW,IAAO;AAC5B,YAAM6B,IAAoB1G,EAAgB;AAAA,QACxC,eAAe;AACP,gBAAA2G,IAAgB1D,OAAsB,IAGtC2D,KAFW/B,EAAQ,aAAa,UAAU,KAAK8B,CAAa,IAG9D,CAAChJ,MAA0B;AACzB,YAAIkH,EAAQ,YACNA,EAAQ,UAAU,SAASlH,CAAQ,KAC7B,QAAA,MAAM,eAAegJ,GAAehJ,CAAQ,IAE5C4I,GAA2B,SAAS5I,CAAQ,KAC9C,QAAA,MAAM,eAAegJ,GAAehJ,CAAQ;AAAA,UACtD,IAEFT;AAEJ,UAAA0J,EAAO,cAAc,GAClB,KAAa,cAAcA;AAAA,QAChC;AAAA,QACA,UAAU;AACR,eAAK,OAAO,SAAS;AAAA,QACvB;AAAA,QACA,cAAc;AACZ,eAAK,OAAO,aAAa;AAAA,QAC3B;AAAA,QACA,UAAU;AACR,eAAK,OAAO,SAAS;AAAA,QACvB;AAAA,QACA,eAAe;AACb,eAAK,OAAO,cAAc;AAAA,QAC5B;AAAA,QACA,UAAU;AACR,eAAK,OAAO,SAAS;AAAA,QACvB;AAAA,QACA,gBAAgB;AACd,eAAK,OAAO,eAAe;AAAA,QAC7B;AAAA,QACA,YAAY;AACV,eAAK,OAAO,WAAW;AAAA,QACzB;AAAA,QACA,SAAS;AAAA,UACP,OAAOjJ,GAAuB;AAC3B,iBAAa,YAAYA,CAAQ;AAAA,UAAA;AAAA,QAEtC;AAAA,QACA,WAAW;AACT,eAAK,OAAO,UAAU;AAAA,QACxB;AAAA,QACA,YAAY;AACV,eAAK,OAAO,WAAW;AAAA,QAAA;AAAA,MACzB,CACD;AACD,MAAA8I,EAAI,MAAMC,CAAwB;AAAA,IAAA;AAAA,EACpC;AAEJ,GCpEMG,KAAc;AAAA,EAClB,QAAQJ,GAAUK,GAA6B;AAC7C,IAAAC,GAAeD,CAAM;AAcf,UAAAE,IAAaP,EAAI,OAAO;AAE9B,IAAAO,EAAWnH,CAAiB,IAAImH,EAAWlH,CAAkB,IAAI,CAACmH,GAAIC,MAK7DD,IACH,CAAC,GAAG,IAAI,IAAI,GAAG,OAAOA,GAAWC,CAAW,CAAC,CAAC,IAC9C,MAAM,QAAQA,CAAI,IAChBA,IACA,CAACA,CAAI;AAAA,EACb;AAEJ;"}