chore(): revert challenge object change

This commit is contained in:
Eduardo Roth
2023-12-20 09:59:52 -06:00
parent f78daf3717
commit f1c160d8b3
59 changed files with 66 additions and 140 deletions

View File

@@ -4,11 +4,11 @@ import VideoButton from './VideoButton.astro'
import ClipboardCopy from './ClipboardCopy.astro'
const { labels } = Astro.props;
const {author, challenge, title, blogLink, videoLink, command} = Astro.props.entry.data;
const {author, challengeNumber, title, blogLink, videoLink, command} = Astro.props.entry.data;
const authorLink = `https://github.com/tomalaforge/angular-challenges/pulls?q=label%3A${challenge?.number}+label%3A"answer+author"`;
const authorLink = `https://github.com/tomalaforge/angular-challenges/pulls?q=label%3A${challengeNumber}+label%3A"answer+author"`;
const authorDescription = `${title} solution author`;
const communityLink = `https://github.com/tomalaforge/angular-challenges/pulls?q=label%3A${challenge?.number}+label%3Aanswer`;
const communityLink = `https://github.com/tomalaforge/angular-challenges/pulls?q=label%3A${challengeNumber}+label%3Aanswer`;
const communityDescription = `${title} community solutions`;
const npxCommand = `npx nx serve ${command}`;
---
@@ -25,7 +25,7 @@ const npxCommand = `npx nx serve ${command}`;
<aside aria-label="Reminder" class="starlight-aside starlight-aside--tip"><p class="starlight-aside__title" aria-hidden="true"><svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" class="starlight-aside__icon"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.43909 8.85483L1.44039 8.85354L4.96668 5.33815C5.30653 4.99386 5.7685 4.79662 6.2524 4.78972L6.26553 4.78963L12.9014 4.78962L13.8479 3.84308C16.9187 0.772319 20.0546 0.770617 21.4678 0.975145C21.8617 1.02914 22.2271 1.21053 22.5083 1.4917C22.7894 1.77284 22.9708 2.13821 23.0248 2.53199C23.2294 3.94517 23.2278 7.08119 20.1569 10.1521L19.2107 11.0983V17.7338L19.2106 17.7469C19.2037 18.2308 19.0067 18.6933 18.6624 19.0331L15.1456 22.5608C14.9095 22.7966 14.6137 22.964 14.29 23.0449C13.9663 23.1259 13.6267 23.1174 13.3074 23.0204C12.9881 22.9235 12.7011 22.7417 12.4771 22.4944C12.2533 22.2473 12.1006 21.9441 12.0355 21.6171L11.1783 17.3417L6.65869 12.822L4.34847 12.3589L2.38351 11.965C2.05664 11.8998 1.75272 11.747 1.50564 11.5232C1.25835 11.2992 1.07653 11.0122 0.979561 10.6929C0.882595 10.3736 0.874125 10.034 0.955057 9.7103C1.03599 9.38659 1.20328 9.09092 1.43909 8.85483ZM6.8186 10.8724L2.94619 10.096L6.32006 6.73268H10.9583L6.8186 10.8724ZM15.2219 5.21703C17.681 2.75787 20.0783 2.75376 21.1124 2.8876C21.2462 3.92172 21.2421 6.31895 18.783 8.77812L12.0728 15.4883L8.51172 11.9272L15.2219 5.21703ZM13.9042 21.0538L13.1279 17.1811L17.2676 13.0414V17.68L13.9042 21.0538Z"></path><path d="M9.31827 18.3446C9.45046 17.8529 9.17864 17.3369 8.68945 17.1724C8.56178 17.1294 8.43145 17.1145 8.30512 17.1243C8.10513 17.1398 7.91519 17.2172 7.76181 17.3434C7.62613 17.455 7.51905 17.6048 7.45893 17.7835C6.97634 19.2186 5.77062 19.9878 4.52406 20.4029C4.08525 20.549 3.6605 20.644 3.29471 20.7053C3.35607 20.3395 3.45098 19.9148 3.59711 19.476C4.01221 18.2294 4.78141 17.0237 6.21648 16.5411C6.39528 16.481 6.54504 16.3739 6.65665 16.2382C6.85126 16.0016 6.92988 15.678 6.84417 15.3647C6.83922 15.3466 6.83373 15.3286 6.82767 15.3106C6.74106 15.053 6.55701 14.8557 6.33037 14.7459C6.10949 14.6389 5.84816 14.615 5.59715 14.6994C5.47743 14.7397 5.36103 14.7831 5.24786 14.8294C3.22626 15.6569 2.2347 17.4173 1.75357 18.8621C1.49662 19.6337 1.36993 20.3554 1.30679 20.8818C1.27505 21.1464 1.25893 21.3654 1.25072 21.5213C1.24662 21.5993 1.24448 21.6618 1.24337 21.7066L1.243 21.7226L1.24235 21.7605L1.2422 21.7771L1.24217 21.7827L1.24217 21.7856C1.24217 22.3221 1.67703 22.7579 2.2137 22.7579L2.2155 22.7579L2.22337 22.7578L2.23956 22.7577C2.25293 22.7575 2.27096 22.7572 2.29338 22.7567C2.33821 22.7555 2.40073 22.7534 2.47876 22.7493C2.63466 22.7411 2.85361 22.725 3.11822 22.6932C3.64462 22.6301 4.36636 22.5034 5.13797 22.2464C6.58274 21.7653 8.3431 20.7738 9.17063 18.7522C9.21696 18.639 9.26037 18.5226 9.30064 18.4029C9.30716 18.3835 9.31304 18.364 9.31827 18.3446Z"></path></svg>
{labels['challenge.footer.reminder'] ?? 'Reminder'}</p><section class="starlight-aside__content">
<p>{labels['challenge.footer.start'] ?? 'Your PR title must start with'} <b>{labels['challenge.footer.answer'] ?? 'Answer:'}{challenge?.number}</b>.</p></section></aside>
<p>{labels['challenge.footer.start'] ?? 'Your PR title must start with'} <b>{labels['challenge.footer.answer'] ?? 'Answer:'}{challengeNumber}</b>.</p></section></aside>
<div class="article-footer">
<a

View File

@@ -7,17 +7,17 @@ import ChallengeFooter from './ChallengeFooter.astro';
import CommentSection from './CommentSection.astro';
const { labels } = Astro.props;
const {challenge} = Astro.props.entry.data;
const { challengeNumber } = Astro.props.entry.data;
const author = Astro.props.entry.data.author ? await getEntry(Astro.props.entry.data.author) : null;
const renderCommentSection = !Astro.props.entry.data.noCommentSection;
---
{ challenge?.number && author && <Author {...author.data} {labels}/> }
{ challengeNumber && author && <Author {...author.data} {labels}/> }
<Default {...Astro.props}><slot /></Default>
{challenge?.number && <ChallengeFooter {...Astro.props} />}
{challengeNumber && <ChallengeFooter {...Astro.props} />}
{ renderCommentSection && <CommentSection {...Astro.props} /> }

View File

@@ -1,15 +1,13 @@
---
import type { Props } from '@astrojs/starlight/props';
import Default from '@astrojs/starlight/components/PageTitle.astro';
const challenge = Astro.props.entry.data.challenge;
const {labels} = Astro.props;
const { challengeNumber } = Astro.props.entry.data;
const { labels } = Astro.props;
---
<div class="page-title-content">
<Default {...Astro.props}><slot /></Default>
{challenge?.number && <div class="chip">{labels['page.title.challenge'] ?? 'Challenge'} #{challenge.number}</div> }
{challengeNumber && <div class="chip">{labels['page.title.challenge'] ?? 'Challenge'} #{challengeNumber}</div> }
</div>
<style>

View File

@@ -16,11 +16,7 @@ const docs = defineCollection({
docsSchema({
extend: z.object({
noCommentSection: z.boolean().optional().default(false),
challenge: z
.object({
number: z.union([z.number(), z.boolean()]).default(false),
})
.optional(),
challengeNumber: z.union([z.number(), z.boolean()]).default(false),
author: reference('authors').optional(),
command: z.string().optional(),
blogLink: z.string().optional(),

View File

@@ -2,8 +2,7 @@
title: 🟢 Projection
description: Challenge 1 is about learning how to project DOM element through components
author: thomas-laforge
challenge:
number: 1
challengeNumber: 1
command: angular-projection
blogLink: https://medium.com/@thomas.laforge/create-a-highly-customizable-component-cc3a9805e4c5
videoLink:

View File

@@ -2,8 +2,7 @@
title: 🔴 Utility Wrapper Pipe
description: Challenge 10 is about creating a pipe to wrap utilities
author: thomas-laforge
challenge:
number: 10
challengeNumber: 10
command: angular-pipe-hard
sidebar:
order: 202

View File

@@ -2,8 +2,7 @@
title: 🟠 Highly Customizable CSS
description: Challenge 13 is about creating highly customizable CSS styles
author: thomas-laforge
challenge:
number: 13
challengeNumber: 13
command: angular-styling
sidebar:
order: 104

View File

@@ -2,8 +2,7 @@
title: 🔴 Master Dependancy Injection
description: Challenge 16 is about masjering how dependancy injection works
author: thomas-laforge
challenge:
number: 16
challengeNumber: 16
command: angular-di
sidebar:
order: 203

View File

@@ -2,8 +2,7 @@
title: 🟢 Anchor Navigation
description: Challenge 21 is about navigating inside the page with anchor
author: thomas-laforge
challenge:
number: 21
challengeNumber: 21
command: angular-anchor-scrolling
sidebar:
order: 4

View File

@@ -2,8 +2,7 @@
title: 🟢 @RouterInput()
description: Challenge 22 is about using the @Input decorator to retreive router params.
author: thomas-laforge
challenge:
number: 22
challengeNumber: 22
command: angular-router-input
blogLink: https://medium.com/ngconf/accessing-route-params-in-angular-1f8e12770617
sidebar:

View File

@@ -2,8 +2,7 @@
title: 🟠 Directive Enhancement
description: Challenge 3 is about enhancing a built-in directive
author: thomas-laforge
challenge:
number: 3
challengeNumber: 3
command: angular-ngfor-enhancement
blogLink: https://medium.com/@thomas.laforge/ngfor-enhancement-716b44656a6c
sidebar:

View File

@@ -2,8 +2,7 @@
title: 🔴 Interoperability Rxjs/Signal
description: Challenge 30 is about learning how to mix signal with Rxjs
author: thomas-laforge
challenge:
number: 30
challengeNumber: 30
command: angular-interop-rxjs-signal
sidebar:
order: 204

View File

@@ -2,8 +2,7 @@
title: 🟢 Module to Standalone
description: Challenge 31 is about migrating a module based application to a standalone application.
author: thomas-laforge
challenge:
number: 31
challengeNumber: 31
command: angular-module-to-standalone
sidebar:
order: 6

View File

@@ -2,8 +2,7 @@
title: 🟠 Change Detection Bug
description: Challenge 32 is about debugging an application that has issue when change detection is triggered
author: thomas-laforge
challenge:
number: 32
challengeNumber: 32
command: angular-bug-cd
blogLink: https://medium.com/ngconf/function-calls-inside-template-are-dangerous-15f9822a6629
sidebar:

View File

@@ -2,8 +2,7 @@
title: 🟠 Decoupling Components
description: Challenge 33 is about decoupling two strongly coupled components using Injection Token
author: thomas-laforge
challenge:
number: 33
challengeNumber: 33
command: angular-decoupling
sidebar:
order: 106

View File

@@ -2,8 +2,7 @@
title: 🟠 InjectionToken
description: Challenge 39 is about learning the power of dependancy injection
author: thomas-laforge
challenge:
number: 39
challengeNumber: 39
command: angular-injection-token
sidebar:
order: 118

View File

@@ -2,8 +2,7 @@
title: 🔴 Typed ContextOutlet
description: Challenge 4 is about strongly typing ngContextOutlet directives
author: thomas-laforge
challenge:
number: 4
challengeNumber: 4
command: angular-context-outlet-type
blogLink: https://medium.com/@thomas.laforge/ngtemplateoutlet-type-checking-5d2dcb07a2c6
sidebar:

View File

@@ -2,8 +2,7 @@
title: 🟢 Crud application
description: Challenge 5 is about refactoring a crud application
author: thomas-laforge
challenge:
number: 5
challengeNumber: 5
command: angular-crud
sidebar:
order: 2

View File

@@ -2,8 +2,7 @@
title: 🟠 Structural Directive
description: Challenge 6 is about creating a structural directive to handle permissions
author: thomas-laforge
challenge:
number: 6
challengeNumber: 6
command: angular-permissions
blogLink: https://medium.com/@thomas.laforge/create-a-custom-structural-directive-to-manage-permissions-like-a-pro-11a1acad30ad
sidebar:

View File

@@ -2,8 +2,7 @@
title: 🟢 Pure Pipe
description: Challenge 8 is about creating a pure pipe
author: thomas-laforge
challenge:
number: 8
challengeNumber: 8
command: angular-pipe-easy
blogLink: https://medium.com/ngconf/deep-dive-into-angular-pipes-c040588cd15d
sidebar:

View File

@@ -2,8 +2,7 @@
title: 🟠 Wrap Function Pipe
description: Challenge 9 is about creating a pipe to wrap component fonctions
author: thomas-laforge
challenge:
number: 9
challengeNumber: 9
command: angular-pipe-intermediate
blogLink: https://medium.com/ngconf/boost-your-apps-performance-by-wrapping-your-functions-inside-a-pipe-7e889a901d1d
sidebar:

View File

@@ -2,8 +2,7 @@
title: 🟠 Control Value Accessor
description: Challenge 41 is about creating a custom form control that implements Control Value Accessor interface.
author: stanislav-gavrilov
challenge:
number: 41
challengeNumber: 41
command: forms-control-value-accessor
sidebar:
order: 1

View File

@@ -2,8 +2,7 @@
title: 🟠 Effect vs Selector
description: Challenge 2 is about learning the difference between effects and selectors in NgRx
author: thomas-laforge
challenge:
number: 2
challengeNumber: 2
command: ngrx-effect-selector
blogLink: https://medium.com/@thomas.laforge/ngrx-effect-vs-reducer-vs-selector-58337ab59043
sidebar:

View File

@@ -2,8 +2,7 @@
title: 🔴 Power of Effect
description: Challenge 7 is about creating an Ngrx effect with another Rxjs Hot observable
author: thomas-laforge
challenge:
number: 7
challengeNumber: 7
command: ngrx-notification
sidebar:
order: 206

View File

@@ -2,8 +2,7 @@
title: 🔴 Extend Lib Generator
description: Challenge 25 is about creating a Nx generator to extend the built-in Library Generator
author: thomas-laforge
challenge:
number: 25
challengeNumber: 25
sidebar:
order: 207
---

View File

@@ -2,8 +2,7 @@
title: 🟠 Component Generator
description: Challenge 26 is about creating a Nx generator to create a custom component
author: thomas-laforge
challenge:
number: 26
challengeNumber: 26
sidebar:
order: 116
---

View File

@@ -2,8 +2,7 @@
title: 🟢 Custom Eslint Rule
description: Challenge 27 is about creating a custom Eslint Rule to forbid enums
author: thomas-laforge
challenge:
number: 27
challengeNumber: 27
sidebar:
order: 12
---

View File

@@ -2,8 +2,7 @@
title: 🟠 Optimize Change Detection
description: Challenge 12 about optimizing the number of change detection cycle while scrolling
author: thomas-laforge
challenge:
number: 12
challengeNumber: 12
command: performance-scroll-cd
sidebar:
order: 107

View File

@@ -2,8 +2,7 @@
title: 🟢 Default vs OnPush
description: Challenge 34 is about learning the difference between Default and OnPush Change Detection Strategy.
author: thomas-laforge
challenge:
number: 34
challengeNumber: 34
command: performance-default-onpush
sidebar:
order: 7

View File

@@ -2,8 +2,7 @@
title: 🟢 Memoization
description: Challenge 35 is about learning how pure pipe works
author: thomas-laforge
challenge:
number: 35
challengeNumber: 35
command: performance-memoized
sidebar:
order: 8

View File

@@ -2,8 +2,7 @@
title: 🟢 NgFor Optimization
description: Challenge 36 is about learning how trackby works
author: thomas-laforge
challenge:
number: 36
challengeNumber: 36
command: performance-ngfor-optimize
sidebar:
order: 13

View File

@@ -2,8 +2,7 @@
title: 🟠 Optimize Big List
description: Challenge 37 is about learning how virtualization optimize big list rendering
author: thomas-laforge
challenge:
number: 37
challengeNumber: 37
command: performance-ngfor-biglist
sidebar:
order: 117

View File

@@ -2,8 +2,7 @@
title: 🟠 Web workers
description: Challenge 40 is about learning how to create and use a web worker
author: thomas-laforge
challenge:
number: 40
challengeNumber: 40
command: performance-christmas-web-worker
sidebar:
order: 119

View File

@@ -2,8 +2,7 @@
title: 🟠 High Order Operator Bug
description: Challenge 11 is about resolving a Rxjs bug because of high order operators
author: thomas-laforge
challenge:
number: 11
challengeNumber: 11
command: rxjs-pipe-bug
sidebar:
order: 114

View File

@@ -2,8 +2,7 @@
title: 🟢 Race Condition
description: Challenge 14 is about race condition in Rxjs
author: thomas-laforge
challenge:
number: 14
challengeNumber: 14
command: rxjs-race-condition
sidebar:
order: 11

View File

@@ -3,8 +3,7 @@ title: 🟢 catchError
description: Challenge 38 is about learning obervable completion.
author: devesh-chaudhari
command: rxjs-catch-error
challenge:
number: 38
challengeNumber: 38
sidebar:
order: 14
---

View File

@@ -2,8 +2,7 @@
title: 🟠 Router
description: Challenge 17 is about testing the router
author: thomas-laforge
challenge:
number: 17
challengeNumber: 17
command: testing-router-outlet
sidebar:
order: 108

View File

@@ -2,8 +2,7 @@
title: 🟠 Nested Components
description: Challenge 18 is about testing nested components
author: thomas-laforge
challenge:
number: 18
challengeNumber: 18
command: testing-nested
sidebar:
order: 109

View File

@@ -2,8 +2,7 @@
title: 🟠 Input Output
description: Challenge 19 is about testing inputs and ouputs
author: thomas-laforge
challenge:
number: 19
challengeNumber: 19
command: testing-input-output
sidebar:
order: 110

View File

@@ -2,8 +2,7 @@
title: 🟠 Modal
description: Challenge 20 is about testing modals
author: thomas-laforge
challenge:
number: 20
challengeNumber: 20
command: testing-modal
sidebar:
order: 111

View File

@@ -2,8 +2,7 @@
title: 🟢 Harness
description: Challenge 23 is about testing with component harnesses
author: thomas-laforge
challenge:
number: 23
challengeNumber: 23
command: testing-harness
sidebar:
order: 9

View File

@@ -2,8 +2,7 @@
title: 🟠 Harness Creation
description: Challenge 24 is about creating a component harness.
author: thomas-laforge
challenge:
number: 24
challengeNumber: 24
command: testing-create-harness
sidebar:
order: 112

View File

@@ -2,8 +2,7 @@
title: 🟢 Checkbox
description: Challenge 28 is about testing a simple checkbox
author: thomas-laforge
challenge:
number: 28
challengeNumber: 28
command: testing-checkbox
sidebar:
order: 10

View File

@@ -2,8 +2,7 @@
title: 🔴 Real-life Application
description: Challenge 29 is about testing a real-life application
author: thomas-laforge
challenge:
number: 29
challengeNumber: 29
command: testing-todos-list
sidebar:
order: 205

View File

@@ -2,8 +2,7 @@
title: 🟠 Function Overload
description: Challenge 15 is about creating overload functions
author: thomas-laforge
challenge:
number: 15
challengeNumber: 15
command: typescript-overload
blogLink: https://medium.com/ngconf/function-overloading-in-typescript-8236706b2c05
sidebar:

View File

@@ -2,9 +2,7 @@
title: 🟢 Proyección
description: Desafio 1 trata sobre aprender a proyectar elementos del DOM a través de componentes,
author: thomas-laforge
challenge:
label: Reto
number: 1
challengeNumber: 1
command: angular-projection
blogLink: https://medium.com/@thomas.laforge/create-a-highly-customizable-component-cc3a9805e4c5
videoLink:

View File

@@ -2,9 +2,7 @@
title: 🟢 @RouterInput()
description: El desafío 22 trata sobre el uso del decorador @Input para utilizar parámetros del router.
author: thomas-laforge
challenge:
label: Reto
number: 22
challengeNumber: 22
command: angular-router-input
blogLink: https://medium.com/ngconf/accessing-route-params-in-angular-1f8e12770617
sidebar:

View File

@@ -2,9 +2,7 @@
title: 🟠 Mejorar Directiva
description: El desafío 3 se trata de una directive incorporada.
author: thomas-laforge
challenge:
label: Reto
number: 3
challengeNumber: 3
command: angular-ngfor-enhancement
blogLink: https://medium.com/@thomas.laforge/ngfor-enhancement-716b44656a6c
sidebar:

View File

@@ -2,9 +2,7 @@
title: 🟠 InjectionToken
description: Desafio de Angular 39 para aprender sobre el poder del InjectionToken
author: thomas-laforge
challenge:
label: Reto
number: 39
challengeNumber: 39
command: angular-injection-token
sidebar:
order: 118

View File

@@ -2,9 +2,7 @@
title: 🔴 ContextOutlet en forma de tipo
description: El desafío 4 se trata de tipificar de manera fuerte las directivas de ngContextOutlet
author: thomas-laforge
challenge:
label: Reto
number: 4
challengeNumber: 4
command: angular-context-outlet-type
blogLink: https://medium.com/@thomas.laforge/ngtemplateoutlet-type-checking-5d2dcb07a2c6
sidebar:

View File

@@ -2,9 +2,7 @@
title: 🟢 Aplicación CRUD
description: El desafío 5 se trata de refactorizar una aplicación CRUD.
author: thomas-laforge
challenge:
label: Reto
number: 5
challengeNumber: 5
command: angular-crud
sidebar:
order: 2

View File

@@ -2,9 +2,7 @@
title: 🟠 Directiva Estructural
description: El Desafío 6 se trata de generar una Directiva Estructural que manipule los permisos
author: thomas-laforge
challenge:
label: Reto
number: 6
challengeNumber: 6
command: angular-permissions
blogLink: https://medium.com/@thomas.laforge/create-a-custom-structural-directive-to-manage-permissions-like-a-pro-11a1acad30ad
sidebar:

View File

@@ -2,9 +2,7 @@
title: 🟠 Optimizar el Change Detection al desplazarse
description: Desafío 12 sobre la optimización del número de ciclos de detección de cambios al desplazarse
author: thomas-laforge
challenge:
label: Reto
number: 12
challengeNumber: 12
command: performance-scroll-cd
sidebar:
order: 107

View File

@@ -2,9 +2,7 @@
title: 🟢 Default vs OnPush
description: El desafío 34 trata sobre aprender la diferencia entre las estrategias de detección de cambios Default y OnPush.
author: thomas-laforge
challenge:
label: Reto
number: 34
challengeNumber: 34
command: performance-default-onpush
sidebar:
order: 7

View File

@@ -2,9 +2,7 @@
title: 🟢 Memoización
description: El desafío 35 trata sobre cómo funcionan las tuberías puras
author: thomas-laforge
challenge:
label: Reto
number: 35
challengeNumber: 35
command: performance-memoized
sidebar:
order: 8

View File

@@ -2,9 +2,7 @@
title: 🟢 Optimización de NgFor
description: El Desafío 36 trata sobre como funciona trackby
author: thomas-laforge
challenge:
label: Reto
number: 36
challengeNumber: 36
command: performance-ngfor-optimize
sidebar:
order: 13

View File

@@ -2,9 +2,7 @@
title: 🟠 Optimizando una lista larga
description: El desafio 37 trata sobre como optimizar una lista grande de elementos
author: thomas-laforge
challenge:
label: Reto
number: 37
challengeNumber: 37
command: performance-ngfor-biglist
sidebar:
order: 117

View File

@@ -2,8 +2,7 @@
title: 🟢 Projeção
description: Desafio 1 é sobre aprender a projetar elementos DOM através de componentes
author: thomas-laforge
challenge:
number: 1
challengeNumber: 1
command: angular-projection
blogLink: https://medium.com/@thomas.laforge/create-a-highly-customizable-component-cc3a9805e4c5
videoLink:

View File

@@ -2,9 +2,7 @@
title: <%= difficulty %> <%= title %>
description: Challenge <%= challengeNumber %> is about ...
author: <%= author %>
challenge:
label: Challenge
number: <%= challengeNumber %>
challengeNumber: <%= challengeNumber %>
command: <%= appProjectName %>
sidebar:
order: <%= order %>