UNPKG

ngx-foldable

Version:

Angular library to help you build dual-screen experiences for foldable or dual-screen devices

1 lines 38.8 kB
{"version":3,"file":"ngx-foldable.mjs","sources":["../../../projects/lib/src/core/media-queries.ts","../../../projects/lib/src/core/screen-spanning.ts","../../../projects/lib/src/core/screen-context.ts","../../../projects/lib/src/core/split-layout.directive.ts","../../../projects/lib/src/core/window.directive.ts","../../../projects/lib/src/core/if-span.directive.ts","../../../projects/lib/src/core/foldable.module.ts","../../../projects/lib/src/public-api.ts","../../../projects/lib/src/ngx-foldable.ts"],"sourcesContent":["/** Media query used to detect dual vertical viewports screen mode. */\nexport const dualVerticalViewport = '(vertical-viewport-segments: 2)';\n/** Media query used to detect dual horizontal viewports screen mode. */\nexport const dualHorizontalViewport = '(horizontal-viewport-segments: 2)';\n","/** Represents the screen spanning mode. */\nexport type ScreenSpanning = 'dual-horizontal' | 'dual-vertical' | 'none';\n/** Enumeration of screen spanning mode values. */\nexport const ScreenSpanning = {\n /** Screen spanning mode is dual horizontal viewports. */\n DualHorizontal: 'dual-horizontal' as ScreenSpanning,\n /** Screen spanning mode is dual vertical viewports. */\n DualVertical: 'dual-vertical' as ScreenSpanning,\n /** No screen spanning (single screen mode). */\n None: 'none' as ScreenSpanning,\n};\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { fromEvent, merge, Observable, ReplaySubject } from 'rxjs';\nimport { map, filter, shareReplay, startWith, takeUntil } from 'rxjs/operators';\nimport { dualVerticalViewport, dualHorizontalViewport } from './media-queries';\nimport { ScreenSpanning } from './screen-spanning';\n\ndeclare global {\n interface Window {\n getWindowSegments: () => DOMRect[];\n }\n}\n\n/**\n * Holds information about the device screen context.\n */\nexport interface ScreenContextData {\n /** The list of available window segments. */\n readonly windowSegments: DOMRect[];\n /** The current screen spanning mode. */\n readonly screenSpanning: ScreenSpanning;\n /** True is current device have multiple screens available. */\n readonly isMultiScreen: boolean;\n}\n\n/**\n * This service allows to query and receive updates about current device's\n * screen context.\n *\n * See {@link ScreenContextData}\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ScreenContext implements ScreenContextData, OnDestroy {\n private currentContext: ScreenContextData;\n private screenContext$: Observable<ScreenContextData>;\n private destroyed$: ReplaySubject<void> = new ReplaySubject(1);\n\n constructor() {\n this.currentContext = this.getScreenContext();\n this.screenContext$ = merge(\n fromEvent(matchMedia(dualVerticalViewport), 'change'),\n fromEvent(matchMedia(dualHorizontalViewport), 'change')\n ).pipe(\n filter(\n () => this.getScreenSpanning() !== this.currentContext.screenSpanning\n ),\n startWith(1),\n map(() => {\n this.currentContext = this.getScreenContext();\n return this.currentContext;\n }),\n shareReplay(1),\n takeUntil(this.destroyed$)\n );\n this.screenContext$.subscribe();\n }\n\n /** @ignored */\n ngOnDestroy() {\n this.destroyed$.next();\n this.destroyed$.complete();\n }\n\n /**\n * The list of available window segments.\n */\n get windowSegments(): DOMRect[] {\n return this.currentContext.windowSegments;\n }\n\n /**\n * The current screen spanning mode.\n */\n get screenSpanning(): ScreenSpanning {\n return this.currentContext.screenSpanning;\n }\n\n /**\n * True is current device have multiple screens available.\n */\n get isMultiScreen(): boolean {\n return this.currentContext.isMultiScreen;\n }\n\n /**\n * Gets an observable emitting when the screen context changes.\n */\n asObservable(): Observable<ScreenContextData> {\n return this.screenContext$;\n }\n\n /**\n * Gets the current screen context.\n */\n asObject(): ScreenContextData {\n return this.currentContext;\n }\n\n private getScreenContext(): ScreenContextData {\n const windowSegments = this.getWindowSegments();\n const screenSpanning = this.getScreenSpanning();\n return {\n windowSegments,\n screenSpanning,\n isMultiScreen: screenSpanning !== ScreenSpanning.None,\n };\n }\n\n private getScreenSpanning(): ScreenSpanning {\n if (matchMedia(dualVerticalViewport).matches) {\n return ScreenSpanning.DualVertical;\n } else if (matchMedia(dualHorizontalViewport).matches) {\n return ScreenSpanning.DualHorizontal;\n }\n return ScreenSpanning.None;\n }\n\n private getWindowSegments(): DOMRect[] {\n if ('getWindowSegments' in window) {\n console.warn('getWindowSegments() is not supported anymore, please update your browser to use the new visualViewport API');\n }\n if ('visualViewport' in window) {\n return (window.visualViewport as any).segments;\n }\n return [\n new DOMRect(\n window.pageXOffset,\n window.pageYOffset,\n window.innerWidth,\n window.innerHeight\n ),\n ];\n }\n}\n","import {\n Directive,\n ElementRef,\n HostBinding,\n Input,\n OnDestroy,\n} from '@angular/core';\nimport { SafeStyle } from '@angular/platform-browser';\nimport { Subscription } from 'rxjs';\nimport { ScreenContext } from './screen-context';\nimport { ScreenSpanning } from './screen-spanning';\n\n/**\n * Defines how the split layout container should be rendered when multi screen\n * is detected.\n * See {@link SplitLayoutDirective}\n */\nexport type SplitLayoutMode = 'flex' | 'grid' | 'absolute';\n/**\n * Enumeration of split layout modes values for use with\n * {@link SplitLayoutDirective}.\n */\nexport const SplitLayoutMode = {\n Flex: 'flex' as SplitLayoutMode,\n Grid: 'grid' as SplitLayoutMode,\n Absolute: 'absolute' as SplitLayoutMode,\n\n /**\n * Checks if the given string value is a valid {@link SplitLayoutMode}.\n *\n * @param value The value to check.\n * @return true if the value is a valid {@link SplitLayoutMode}.\n */\n isValid: (value: string): boolean => {\n switch (value) {\n case SplitLayoutMode.Flex:\n case SplitLayoutMode.Grid:\n case SplitLayoutMode.Absolute:\n return true;\n }\n return false;\n },\n};\n\n/**\n * Defines how the split layout container should order the window segments\n * when in horizontal spanning mode vs vertical spanning mode.\n * See {@link SplitLayoutDirective}\n */\nexport type WindowOrder = 'normal' | 'reverse';\n/**\n * Enumeration of window order values for use with\n * {@link SplitLayoutDirective}.\n */\nexport const WindowOrder = {\n Normal: 'normal' as WindowOrder,\n Reverse: 'reverse' as WindowOrder,\n\n /**\n * Checks if the given string value is a valid {@link WindowOrder}.\n *\n * @param value The value to check.\n * @return true if the value is a valid {@link WindowOrder}.\n */\n isValid: (value: string): boolean => {\n switch (value) {\n case WindowOrder.Normal:\n case WindowOrder.Reverse:\n return true;\n }\n return false;\n },\n};\n\n/**\n * Defines the text reading direction for the host element.\n */\nexport type ReadingDirection = 'ltr' | 'rtl';\n/**\n * Enumeration of the text reading direction values.\n */\nexport const ReadingDirection = {\n LeftToRight: 'ltr' as ReadingDirection,\n RightToLeft: 'rtl' as ReadingDirection,\n};\n\n/**\n * Look 'ma, CSS-in-JS with Angular! ಠ_ಠ\n *\n * @ignore\n */\nconst layoutStyles = {\n [SplitLayoutMode.Flex]: {\n common: {\n display: 'flex',\n justifyContent: 'space-between',\n height: 'env(viewport-segment-bottom 0 1)',\n },\n [ScreenSpanning.DualHorizontal]: {\n flexDirection: 'row',\n },\n [ScreenSpanning.DualVertical]: {\n flexDirection: 'column',\n },\n [WindowOrder.Reverse]: {\n flexDirection: 'column-reverse',\n },\n },\n [SplitLayoutMode.Grid]: {\n common: {\n display: 'grid',\n height: 'env(viewport-segment-bottom 0 1)',\n },\n [ScreenSpanning.DualHorizontal]: {\n gridTemplateColumns: '1fr 1fr',\n gridTemplateAreas: '\"segment0 segment1\"',\n gridAutoFlow: 'row',\n columnGap: 'calc(env(viewport-segment-left 1 0) - env(viewport-segment-right 0 0))',\n },\n [ScreenSpanning.DualVertical]: {\n gridTemplateRows: '1fr 1fr',\n gridTemplateAreas: '\"segment0\" \"segment1\"',\n gridAutoFlow: 'row',\n rowGap: 'calc(env(viewport-segment-top 0 1) - env(viewport-segment-bottom 0 0))',\n },\n [WindowOrder.Reverse]: {\n gridTemplateRows: '1fr 1fr',\n gridTemplateAreas: '\"segment0\" \"segment1\"',\n gridAutoFlow: 'row',\n rowGap: 'calc(env(viewport-segment-top 0 1) - env(viewport-segment-bottom 0 0))',\n },\n },\n [SplitLayoutMode.Absolute]: {\n common: {\n position: 'relative',\n height: 'env(viewport-segment-bottom 0 1)',\n },\n [ScreenSpanning.DualHorizontal]: {},\n [ScreenSpanning.DualVertical]: {},\n [WindowOrder.Reverse]: {},\n },\n};\n\n/**\n * Defines a parent layout container for creating a split layout on multi\n * screen devices.\n *\n * When used on a single screen device, no layout change (CSS) is added.\n * You can choose between different {@link SplitLayoutMode} to suit your\n * design.\n *\n * This directive should be used along with {@link WindowDirective}.\n *\n * @example\n * <div fdSplitLayout=\"grid\">\n * <section fdWindow=\"0\">Will be displayed on first screen</section>\n * <section fdWindow=\"1\">Will be displayed on second screen (if available)</section>\n * </div>\n *\n * In addition, you can also choose keep the same window segments order or\n * reverse it when the spanning mode change from vertical to horizontal using\n * a second optional parameter on the directive:\n *\n * @example\n * <div fdSplitLayout=\"flex reverse\">\n * <section fdWindow=\"0\">\n * Will be displayed on first screen in vertical spanning mode\n * and on the second screen in horizontal spanning mode.\n * </section>\n * <section fdWindow=\"1\">\n * Will be displayed on second screen in vertical spanning mode\n * and on the first screen in horizontal spanning mode.\n * </section>\n * </div>\n */\n@Directive({\n selector: '[fdSplitLayout]',\n})\nexport class SplitLayoutDirective implements OnDestroy {\n private mode: SplitLayoutMode = SplitLayoutMode.Flex;\n private order: WindowOrder = WindowOrder.Normal;\n private layoutStyle: SafeStyle = {};\n private screenContextSubscription: Subscription | null = null;\n private direction: ReadingDirection = 'ltr';\n\n /**\n * Sets the current split layout options to use when multi screen is\n * detected.\n *\n * @param options The split layout options to use.\n * Format: `[mode] [order]`\n * - The {@link SplitLayoutMode} to use (default is {@link SplitLayoutMode.Flex}).\n * - The {@link WindowOrder} to use (default is {@link WindowOrder.Normal}).\n */\n @Input()\n set fdSplitLayout(options: string | undefined) {\n this.parseOptions(options || '');\n this.updateStyle();\n }\n\n /** @ignore */\n @HostBinding('style')\n get style(): SafeStyle {\n return this.layoutStyle;\n }\n\n constructor(\n private element: ElementRef,\n private screenContext: ScreenContext\n ) {\n this.updateStyle();\n this.screenContextSubscription = this.screenContext\n .asObservable()\n .subscribe(() => this.updateStyle());\n }\n\n /**\n * The current split layout mode to use when multi screen is detected.\n *\n * @return The current split layout mode.\n */\n get layoutMode(): SplitLayoutMode {\n return this.mode;\n }\n\n /**\n * The window segments order to use when in horizontal spanning mode.\n *\n * @return The current window order.\n */\n get windowOrder(): WindowOrder {\n return this.order;\n }\n\n /**\n * The text reading direction for the host element.\n *\n * @return The text reading direction.\n */\n get readingDirection(): ReadingDirection {\n return this.direction;\n }\n\n /** @ignore */\n ngOnDestroy() {\n if (this.screenContextSubscription !== null) {\n this.screenContextSubscription.unsubscribe();\n }\n }\n\n private parseOptions(options: string) {\n let [mode, order] = options.trim().split(' ');\n mode = SplitLayoutMode.isValid(mode) ? mode : SplitLayoutMode.Flex;\n order = WindowOrder.isValid(order) ? order : WindowOrder.Normal;\n this.mode = mode as SplitLayoutMode;\n this.order = order as WindowOrder;\n }\n\n private updateStyle() {\n const isMultiScreen = this.screenContext.isMultiScreen;\n const spanning = this.screenContext.screenSpanning;\n const reverse =\n spanning === ScreenSpanning.DualVertical &&\n this.order === WindowOrder.Reverse;\n\n this.direction =\n (getComputedStyle(this.element.nativeElement)\n ?.direction as ReadingDirection) || ReadingDirection.LeftToRight;\n\n if (isMultiScreen && spanning !== ScreenSpanning.None) {\n this.layoutStyle = {\n ...layoutStyles[this.mode].common,\n ...layoutStyles[this.mode][reverse ? WindowOrder.Reverse : spanning],\n };\n } else {\n this.layoutStyle = {};\n }\n }\n}\n","import { Directive, Host, HostBinding, Input, OnDestroy } from '@angular/core';\nimport { SafeStyle } from '@angular/platform-browser';\nimport { Subscription } from 'rxjs';\nimport { ScreenContext } from './screen-context';\nimport { ScreenSpanning } from './screen-spanning';\nimport {\n ReadingDirection,\n SplitLayoutDirective,\n SplitLayoutMode,\n WindowOrder,\n} from './split-layout.directive';\n\n/**\n * Look 'ma, CSS-in-JS with Angular! ಠ_ಠ\n *\n * @ignore\n */\nconst layoutStyles = {\n [SplitLayoutMode.Flex]: {\n [ScreenSpanning.DualHorizontal]: [\n { flex: '0 0 env(viewport-segment-width 0 0)' },\n { flex: '0 0 env(viewport-segment-width 1 0)' },\n ],\n [ScreenSpanning.DualVertical]: [\n { flex: '0 0 env(viewport-segment-height 0 0)' },\n { flex: '0 0 env(viewport-segment-height 0 1)' },\n ],\n },\n [SplitLayoutMode.Grid]: {\n [ScreenSpanning.DualHorizontal]: [\n { gridArea: 'segment0' },\n { gridArea: 'segment1' },\n ],\n [ScreenSpanning.DualVertical]: [\n {\n gridArea: 'segment0',\n height: 'env(viewport-segment-height 0 0)'\n },\n {\n gridArea: 'segment1',\n height: 'env(viewport-segment-height 0 1)'\n },\n ],\n },\n [SplitLayoutMode.Absolute]: {\n [ScreenSpanning.DualHorizontal]: [\n {\n position: 'absolute',\n left: 0,\n width: 'env(viewport-segment-right 0 0)',\n },\n {\n position: 'absolute',\n left: 'env(viewport-segment-left 1 0)',\n right: 0,\n },\n ],\n [ScreenSpanning.DualVertical]: [\n {\n position: 'absolute',\n top: 0,\n width: '100%',\n maxHeight: 'env(viewport-segment-height 0 0)',\n },\n {\n position: 'absolute',\n top: 'env(viewport-segment-top 0 1)',\n width: '100%',\n maxHeight: 'env(viewport-segment-height 0 1)',\n },\n ],\n },\n};\n\n/**\n * This directive is used to set specify on which window segment the container\n * should be placed on multi screen devices.\n *\n * When used on a single screen device, no layout change (CSS) is added.\n * Only devices with up to two screen are currently supported, meaning that the\n * window segment value must be either 0 or 1.\n *\n * This directive can only be used within a {@link SplitLayoutDirective}.\n * If {@link SplitLayoutMode} is set to `absolute`, you can assign multiple\n * container element to the same window segment.\n *\n * Note that if you have set the read direction to Right-To-Left mode (`rtl`)\n * in CSS, the first segment will be the rightmost one.\n *\n * If the {@link WindowOrder} option is set to {@link WindowOrder.Reverse},\n * the window segments order will be reversed in horizontal spanning mode.\n *\n * @example\n * <div fdSplitLayout=\"grid\">\n * <section fdWindow=\"0\">Will be displayed on first screen</section>\n * <section fdWindow=\"1\">Will be displayed on second screen (if available)</section>\n * </div>\n */\n@Directive({\n selector: '[fdWindow]',\n})\nexport class WindowDirective implements OnDestroy {\n private segment = -1;\n private layoutStyle: SafeStyle = {};\n private screenContextSubscription: Subscription | null = null;\n\n /** @ignore */\n @HostBinding('style')\n get style(): SafeStyle {\n return this.layoutStyle;\n }\n\n /**\n * Sets the target window segment to display this container on when multi\n * screen is detected.\n *\n * @param segment The target window segment, must be 0 or 1.\n */\n @Input()\n set fdWindow(segment: number | string) {\n segment = typeof segment === 'string' ? parseInt(segment, 10) : segment;\n if (segment !== this.segment) {\n this.segment = segment;\n this.updateStyle();\n }\n }\n\n constructor(\n private screenContext: ScreenContext,\n @Host() private splitLayout: SplitLayoutDirective\n ) {\n this.screenContextSubscription = this.screenContext\n .asObservable()\n .subscribe(() => this.updateStyle());\n }\n\n /** @ignore */\n ngOnDestroy() {\n if (this.screenContextSubscription !== null) {\n this.screenContextSubscription.unsubscribe();\n }\n }\n\n private updateStyle() {\n if (this.segment === -1) {\n return;\n }\n\n const isMultiScreen = this.screenContext.isMultiScreen;\n const spanning = this.screenContext.screenSpanning;\n\n if (isMultiScreen && spanning !== ScreenSpanning.None) {\n if (this.segment < 0 || this.segment > 1) {\n throw new Error('Segment index must be 0 or 1');\n }\n\n const mode = this.splitLayout.layoutMode;\n const order = this.splitLayout.windowOrder;\n const direction = this.splitLayout.readingDirection;\n // Swap segments for vertical span and RTL mode or\n // horizontal span and reverse window order\n const swap =\n (spanning === ScreenSpanning.DualHorizontal &&\n mode !== SplitLayoutMode.Grid &&\n direction === ReadingDirection.RightToLeft) ||\n (spanning === ScreenSpanning.DualVertical &&\n order === WindowOrder.Reverse);\n\n const segment = swap ? 1 - this.segment : this.segment;\n this.layoutStyle = layoutStyles[mode][spanning][segment];\n } else {\n this.layoutStyle = {};\n }\n }\n}\n","import {\n Directive,\n EmbeddedViewRef,\n Input,\n OnDestroy,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ScreenContext } from './screen-context';\nimport { ScreenSpanning } from './screen-spanning';\n\n/** Spanning mode conditions for use with {@link IfSpanDirective}. */\nexport type SpanCondition =\n | 'dual-horizontal'\n | 'dual-vertical'\n | 'none'\n | 'multi';\n/**\n * Enumeration of spanning mode conditions values for use with\n * {@link IfSpanDirective}.\n */\nexport const SpanCondition = {\n /** Screen spanning mode is dual horizontal viewports. */\n Vertical: 'dual-horizontal' as SpanCondition,\n /** Screen spanning mode is dual vertical viewports. */\n Horizontal: 'dual-vertical' as SpanCondition,\n /** No screen spanning (single screen mode). */\n None: 'none' as SpanCondition,\n /** Any screen spanning mode is active (multi screen mode). */\n Multi: 'multi' as SpanCondition,\n};\n\n/**\n * Shows template only if the current screen spanning mode matches\n * specified {@link SpanCondition}.\n *\n * Behaves like `ngIf`, except that it accepts a {@link SpanCondition} instead of\n * a boolean expression.\n *\n * @example\n * <p *fdIdSpan=\"'multi'\">This text will only be visible on multi screen devices.</p>\n * @example\n * <p *fdIdSpan=\"'none'; else alt\">This text will only be visible on single screen devices.</p>\n * <ng-template #alt\">This text will only be visible on multi screen devices.</ng-template>\n */\n@Directive({\n selector: '[fdIfSpan]',\n})\nexport class IfSpanDirective<T> implements OnDestroy {\n private screenContextSubscription: Subscription | null = null;\n private condition: SpanCondition | null = null;\n private thenTemplateRef: TemplateRef<T> | null = null;\n private elseTemplateRef: TemplateRef<T> | null = null;\n private thenViewRef: EmbeddedViewRef<T> | null = null;\n private elseViewRef: EmbeddedViewRef<T> | null = null;\n\n /**\n * The spanning mode condition that defines if the template should be shown.\n *\n * @param condition The spanning mode condition for showing the template.\n */\n @Input()\n set fdIfSpan(condition: SpanCondition) {\n if (condition !== this.condition) {\n this.condition = condition;\n this.updateView();\n }\n }\n\n /** A template to show if the span condition evaluates to true. */\n @Input()\n set fdIfSpanThen(templateRef: TemplateRef<T> | null) {\n this.thenTemplateRef = templateRef;\n this.thenViewRef = null;\n this.updateView();\n }\n\n /** A template to show if the span condition evaluates to false. */\n @Input()\n set fdIfSpanElse(templateRef: TemplateRef<T> | null) {\n this.elseTemplateRef = templateRef;\n this.thenViewRef = null;\n this.updateView();\n }\n\n constructor(\n private screenContext: ScreenContext,\n private viewContainer: ViewContainerRef,\n templateRef: TemplateRef<T>\n ) {\n this.thenTemplateRef = templateRef;\n this.screenContextSubscription = this.screenContext\n .asObservable()\n .subscribe(() => this.updateView());\n }\n\n /** ignore */\n ngOnDestroy() {\n if (this.screenContextSubscription !== null) {\n this.screenContextSubscription.unsubscribe();\n }\n }\n\n private matchCondition(): boolean {\n switch (this.condition) {\n case SpanCondition.Multi:\n return this.screenContext.isMultiScreen;\n case SpanCondition.Horizontal:\n return this.screenContext.screenSpanning === ScreenSpanning.DualVertical;\n case SpanCondition.Vertical:\n return this.screenContext.screenSpanning === ScreenSpanning.DualHorizontal;\n default:\n return this.screenContext.screenSpanning === ScreenSpanning.None;\n }\n }\n\n private updateView() {\n const match = this.matchCondition();\n\n if (match) {\n if (!this.thenViewRef) {\n this.viewContainer.clear();\n this.elseViewRef = null;\n if (this.thenTemplateRef) {\n this.thenViewRef = this.viewContainer.createEmbeddedView(\n this.thenTemplateRef\n );\n }\n }\n } else {\n if (!this.elseViewRef) {\n this.viewContainer.clear();\n this.thenViewRef = null;\n if (this.elseTemplateRef) {\n this.elseViewRef = this.viewContainer.createEmbeddedView(\n this.elseTemplateRef\n );\n }\n }\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { IfSpanDirective } from './if-span.directive';\nimport { WindowDirective } from './window.directive';\nimport { SplitLayoutDirective } from './split-layout.directive';\n\n/**\n * This module contains utilities to help you build your app layout for multi\n * screen devices.\n *\n * See {@link SplitLayoutDirective},\n * {@link WindowDirective},\n * {@link IfSpanDirective},\n * {@link ScreenContext}\n */\n@NgModule({\n declarations: [IfSpanDirective, WindowDirective, SplitLayoutDirective],\n exports: [IfSpanDirective, WindowDirective, SplitLayoutDirective],\n})\nexport class FoldableModule {}\n","/*\n * Public API Surface of ngx-foldable\n */\n\nexport * from './core/screen-context';\nexport * from './core/screen-spanning';\nexport * from './core/media-queries';\nexport * from './core/split-layout.directive';\nexport * from './core/window.directive';\nexport * from './core/if-span.directive';\nexport * from './core/foldable.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["layoutStyles","i1.ScreenContext","i2.SplitLayoutDirective"],"mappings":"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"}