Commit ed6cd73b authored by Vincent Deffontaines's avatar Vincent Deffontaines
Browse files

Adding .fr translations for suexec logs server-wide sections new_features_2_4...

Adding .fr translations for suexec logs server-wide sections new_features_2_4 urlmapping dso upgrading glossary


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@708014 13f79535-47bb-0310-9956-ffa450edef68
parent 71e84412
Loading
Loading
Loading
Loading

docs/manual/dso.xml.fr

0 → 100644
+328 −0
Changes for docs/manual/dso.xml.fr: 328 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
<!-- English Revision : 587444 -->

<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<manualpage metafile="dso.xml.meta">

  <title>Support des objets dynamiques partag&eacute;s (DSO)</title>

  <summary>
    <p>La conception modulaire du serveur HTTP Apache permet &agrave; l'administrateur
    de choisir les fonctionnalit&eacute;s &agrave; inclure dans le serveur en s&eacute;lectionnant
    un certain nombre de modules. Les modules peuvent &ecirc;tre soit int&eacute;gr&eacute;s
    statiquement dans le binaire <program>httpd</program> lors de la
    compilation du serveur, soit compil&eacute;s en tant qu'objets
    dynamiques partag&eacute;s (DSOs) qui existeront ind&eacute;pendamment du binaire
    principal <program>httpd</program>. Les modules DSO peuvent &ecirc;tre compil&eacute;s
    au moment de la construction du serveur, ou bien compil&eacute;s s&eacute;par&eacute;ment,
    &agrave; l'aide de l'utilitaire des extensions d'Apache (<program>apxs</program>),
    et associ&eacute;s au serveur ult&eacute;rieurement.</p>

    <p>Ce document d&eacute;crit l'utilisation des modules DSO ainsi que les dessous
    de leur fonctionnement.</p>
  </summary>


<section id="implementation"><title>Impl&eacute;mentation</title>

<related>
<modulelist>
<module>mod_so</module>
</modulelist>
<directivelist>
<directive module="mod_so">LoadModule</directive>
</directivelist>
</related>

    <p>Le support DSO pour le chargement de modules individuels d'Apache est
    assur&eacute; par un module nomm&eacute; <module>mod_so</module> qui doit &ecirc;tre compil&eacute;
    statiquement dans le coeur d'Apache. Il s'agit du seul module avec le
    module <module>core</module> &agrave; ne pas pouvoir &ecirc;tre compil&eacute; en tant que
    module DSO lui-m&ecirc;me. Pratiquement tous les autres modules d'Apache
    distribu&eacute;s peuvent &ecirc;tre compil&eacute;s en tant que modules DSO en s&eacute;lectionnant
    pour chacun d'entre eux le mode de construction DSO &agrave; l'aide de l'option
    <code>--enable-<em>module</em>=shared</code> du script
    <program>configure</program>, comme d&eacute;crit dans la
    <a href="install.html">Documentation de l'installation</a>. Une fois
    compil&eacute; en tant que module DSO, un module peut &ecirc;tre charg&eacute; en m&eacute;moire au
    d&eacute;marrage ou red&eacute;marrage du serveur &agrave; l'aide de la commande
    <directive module="mod_so">LoadModule</directive> du module
    <module>mod_so</module>, plac&eacute;e
    dans votre fichier <code>httpd.conf</code>.</p>

    <p>Un nouvel utilitaire a &eacute;t&eacute; introduit afin de simplifier la cr&eacute;ation de
    fichiers DSO pour les modules d'Apache
    (particuli&egrave;rement pour les modules tiers) ; il s'agit du programme nomm&eacute;
    <program>apxs</program> (<dfn>APache
    eXtenSion</dfn>). On peut l'utiliser pour construire des modules de type
    DSO <em>en dehors</em> de l'arborescence des sources d'Apache. L'id&eacute;e est
    simple : &agrave; l'installation d'Apache, la proc&eacute;dure <code>make install</code>
    du script <program>configure</program> installe les fichiers d'en-t&ecirc;tes
    d'Apache et positionne, pour la plateforme de compilation,  les drapeaux du compilateur et de
    l'&eacute;diteur de liens &agrave; l'int&eacute;rieur du programme
    <program>apxs</program>, qui sera utilis&eacute; pour la construction de fichiers DSO.
    Il est ainsi possible d'utiliser le programme <program>apxs</program>
    pour compiler ses sources de modules Apache sans avoir besoin de
    l'arborescence des sources de la distribution d'Apache, et sans avoir &agrave;
    r&eacute;gler les drapeaux du compilateur et de l'&eacute;diteur de liens pour le support DSO.</p>
</section>

<section id="usage"><title>Mode d'emploi succinct</title>

    <p>Afin que vous puissiez vous faire une id&eacute;e des fonctionnalit&eacute;s DSO
    d'Apache 2.x, en voici un r&eacute;sum&eacute; court et concis :</p>

    <ol>
      <li>
        Construire et installer un module Apache <em>faisant partie de la
	distribution</em>, par exemple <code>mod_foo.c</code>,
	en tant que module DSO <code>mod_foo.so</code> :

<example>
$ ./configure --prefix=/chemin/vers/r&eacute;pertoire-installation
--enable-foo=shared<br />
$ make install
</example>
      </li>

      <li>
        Construire et installer un module Apache <em>tiers</em>, par exemple
        <code>mod_foo.c</code>, en tant que module DSO <code>mod_foo.so</code> :

<example>
$ ./configure --add-module=<var>type_de_module</var>:
/chemin/vers/module_tiers/mod_foo.c \<br />
<indent>
  --enable-foo=shared<br />
</indent>
$ make install
</example>
      </li>

      <li>
        Configurer Apache pour <em>pouvoir installer ult&eacute;rieurement</em> des
	modules partag&eacute;s :

<example>
$ ./configure --enable-so<br />
$ make install
</example>
      </li>

      <li>
        Construire et installer un module Apache <em>tiers</em>, par exemple
        <code>mod_foo.c</code>, en tant que module DSO
        <code>mod_foo.so</code> <em>en dehors</em> de l'arborescence des sources
	d'Apache &agrave; l'aide du programme <program>apxs</program> :

<example>
$ cd /chemin/vers/module_tiers<br />
$ apxs -c mod_foo.c<br />
$ apxs -i -a -n foo mod_foo.la
</example>
      </li>
    </ol>

    <p>Dans tous les cas, une fois le module partag&eacute; compil&eacute;, vous devez
    ajouter une directive <directive module="mod_so">LoadModule</directive>
    dans le fichier <code>httpd.conf</code> pour qu'Apache active le module.</p>
</section>

<section id="background"><title>Les dessous du fonctionnement des DSO</title>

    <p>Les cl&ocirc;nes modernes d'UNIX proposent un astucieux m&eacute;canisme
    commun&eacute;ment appel&eacute; &eacute;dition de liens et chargement dynamiques d'
    <em>Objets Dynamiques Partag&eacute;s</em> (DSO), qui permet de construire un
    morceau de programme dans un format sp&eacute;cial pour le rendre chargeable
    &agrave; l'ex&eacute;cution dans l'espace d'adressage d'un programme ex&eacute;cutable.</p>

    <p>Ce chargement peut s'effectuer de deux mani&egrave;res : automatiquement par
    un programme syst&egrave;me appel&eacute; <code>ld.so</code> quand un programme
    ex&eacute;cutable est d&eacute;marr&eacute;, ou manuellement &agrave; partir du programme en cours
    d'ex&eacute;cution via sa propre interface syst&egrave;me vers le chargeur Unix &agrave; l'aide
    des appels syst&egrave;me <code>dlopen()/dlsym()</code>.</p>

    <p>Dans la premi&egrave;re m&eacute;thode, les DSO sont en g&eacute;n&eacute;ral appel&eacute;s
    <em>biblioth&egrave;ques partag&eacute;es</em> ou encore <em>biblioth&egrave;ques DSO</em>, et
    poss&egrave;dent des noms du style
    <code>libfoo.so</code> ou <code>libfoo.so.1.2</code>. Ils r&eacute;sident dans un
    r&eacute;pertoire syst&egrave;me (en g&eacute;n&eacute;ral <code>/usr/lib</code>)
    et le lien avec le programme ex&eacute;cutable est &eacute;tabli &agrave; la compilation en
    ajoutant <code>-lfoo</code> &agrave; la commande de l'&eacute;diteur de liens. Les
    r&eacute;f&eacute;rences &agrave; la biblioth&egrave;que sont ainsi cod&eacute;es en dur dans le fichier du
    programme ex&eacute;cutable de fa&ccedil;on &agrave; ce qu'au d&eacute;marrage du programme, le
    chargeur Unix soit capable de localiser <code>libfoo.so</code> dans
    <code>/usr/lib</code>, dans des chemins cod&eacute;s en dur &agrave; l'aide d'options de
    l'&eacute;diteur de liens comme <code>-R</code> ou dans des chemins d&eacute;finis par la
    variable d'environnement
    <code>LD_LIBRARY_PATH</code>. Le chargeur peut d&egrave;s lors r&eacute;soudre tous les symboles
    (jusque l&agrave; non encore r&eacute;solus) du DSO dans le programme ex&eacute;cutable.</p>

    <p>Les symboles du programme ex&eacute;cutable ne sont en g&eacute;n&eacute;ral pas
    r&eacute;f&eacute;renc&eacute;s par le DSO (car c'est une biblioth&egrave;que de code &agrave; usage g&eacute;n&eacute;ral
    et r&eacute;utilisable),
    et ainsi aucune r&eacute;solution suppl&eacute;mentaire n'est n&eacute;cessaire. De son c&ocirc;t&eacute;,
    le programme ex&eacute;cutable ne doit accomplir aucune action particuli&egrave;re
    pour utiliser les
    symboles du DSO car toutes les r&eacute;solutions sont effectu&eacute;es par le chargeur
    Unix. En fait, le code permettant d'invoquer
    <code>ld.so</code> fait partie du code de d&eacute;marrage pour l'ex&eacute;cution qui
    est li&eacute; dans tout programme ex&eacute;cutable non statiquement li&eacute;.
    L'avantage du chargement dynamique du code d'une biblioth&egrave;que partag&eacute;e est
    &eacute;vident : le code de la biblioth&egrave;que ne doit &ecirc;tre stock&eacute; qu'une seule fois
    dans une biblioth&egrave;que syst&egrave;me telle que <code>libc.so</code>, ce qui permet
    d'&eacute;conomiser de l'espace disque pour les autres programmes.</p>

    <p>Dans la seconde m&eacute;thode, les DSO sont en g&eacute;n&eacute;ral appel&eacute;s <em>objets
    partag&eacute;s</em> ou <em>fichiers DSO</em>, et peuvent &ecirc;tre nomm&eacute;s avec
    l'extension de son choix (bien que le nom conseill&eacute; soit du style
    <code>foo.so</code>). Ces fichiers r&eacute;sident en g&eacute;n&eacute;ral dans un r&eacute;pertoire
    sp&eacute;cifique &agrave; un programme, et aucun lien n'est automatiquement &eacute;tabli avec
    le programme ex&eacute;cutable dans lequel ils sont utilis&eacute;s.
    Le programme ex&eacute;cutable charge manuellement le DSO &agrave; l'ex&eacute;cution dans son
    espace d'adressage &agrave; l'aide de l'appel syst&egrave;me <code>dlopen()</code>.
    A ce moment, aucune r&eacute;solution de symboles du DSO n'est effectu&eacute;e pour le
    programme ex&eacute;cutable. Par contre le chargeur Unix
    r&eacute;soud automatiquement tout symbole du DSO (non encore r&eacute;solu)
    faisant partie de l'ensemble de symboles export&eacute; par le programme
    ex&eacute;cutable et ses biblioth&egrave;ques DSO d&eacute;j&agrave; charg&eacute;es (et en particulier tous
    les symboles de la biblioth&egrave;que &agrave; tout faire <code>libc.so</code>).
    De cette fa&ccedil;on, le DSO prend connaissance de l'ensemble de symboles du
    programme ex&eacute;cutable comme s'il avait &eacute;t&eacute; li&eacute; statiquement avec lui
    auparavant.</p>

    <p>Finalement, pour tirer profit de l'API des DSO, le programme ex&eacute;cutable
    doit r&eacute;soudre certains symboles du DSO &agrave; l'aide de l'appel syst&egrave;me
    <code>dlsym()</code> pour une utilisation ult&eacute;rieure dans les tables de
    distribution, <em>etc...</em> En d'autres termes, le programme ex&eacute;cutable doit
    r&eacute;soudre manuellement tous les symboles dont il a besoin pour pouvoir les
    utiliser.
    Avantage d'un tel m&eacute;canisme : les modules optionnels du programme n'ont pas
    besoin d'&ecirc;tre charg&eacute;s (et ne gaspillent donc pas de ressources m&eacute;moire)
    tant qu'il ne sont pas n&eacute;cessaires au programme en question. Si n&eacute;cessaire,
    ces modules peuvent &ecirc;tre charg&eacute;s dynamiquement afin d'&eacute;tendre les
    fonctionnalit&eacute;s de base du programme.</p>

    <p>Bien que ce m&eacute;canisme DSO paraisse &eacute;vident, il comporte au moins une
    &eacute;tape difficile : la r&eacute;solution des symboles depuis le programme ex&eacute;cutable
    pour le DSO lorsqu'on utilise un DSO pour &eacute;tendre les fonctionnalit&eacute;s d'un
    programme (la seconde m&eacute;thode). Pourquoi ? Parce que la "r&eacute;solution
    inverse" des symboles DSO &agrave; partir du jeu de symboles du programme
    ex&eacute;cutable d&eacute;pend de la conception de la biblioth&egrave;que (la biblioth&egrave;que n'a
    aucune information sur le programme qui l'utilise) et n'est ni standardis&eacute;e
    ni disponible sur toutes les plateformes. En pratique, les symboles globaux
    du programme ex&eacute;cutable ne sont en g&eacute;n&eacute;ral pas r&eacute;export&eacute;s et donc
    indisponibles pour l'utilisation dans un DSO. Trouver une m&eacute;thode pour
    forcer l'&eacute;diteur de liens &agrave; exporter tous les symboles globaux est le
    principal probl&egrave;me que l'on doit r&eacute;soudre lorsqu'on utilise un DSO pour
    &eacute;tendre les fonctionnalit&eacute;s d'un programme au moment de son ex&eacute;cution.</p>

    <p>L'approche des biblioth&egrave;ques partag&eacute;es est la plus courante, parce que
    c'est dans cette optique que le m&eacute;canisme DSO a &eacute;t&eacute; con&ccedil;u ; c'est cette
    approche qui est ainsi
    utilis&eacute;e par pratiquement tous les types de biblioth&egrave;ques que fournit le
    syst&egrave;me d'exploitation. Par contre, les objets partag&eacute;s sont relativement
    peu utilis&eacute;s pour &eacute;tendre les fonctionnalit&eacute;s d'un programme.</p>

    <p>En 1998, seule une poign&eacute;e de logiciels distribu&eacute;s
    utilisaient le m&eacute;canisme DSO pour r&eacute;ellement &eacute;tendre leurs fonctionnalit&eacute;s
    au moment de l'ex&eacute;cution : Perl 5 (via son m&eacute;canisme XS et le module
    DynaLoader), le serveur Netscape, <em>etc...</em> A partir de la
    version 1.3, Apache rejoignit ce groupe, car Apache
    pr&eacute;sentait d&eacute;j&agrave; un concept modulaire pour &eacute;tendre ses fonctionnalit&eacute;s, et
    utilisait en interne une approche bas&eacute;e sur une liste de distribution pour
    relier des modules externes avec les fonctionnalit&eacute;s de base d'Apache.
    Ainsi, Apache &eacute;tait vraiment pr&eacute;destin&eacute; &agrave; l'utilisation des DSO pour
    charger ses modules au moment de l'ex&eacute;cution.</p>
</section>

<section id="advantages"><title>Avantages et inconv&eacute;nients</title>

    <p>Les fonctionnalit&eacute;s ci-dessus bas&eacute;es sur les DSO pr&eacute;sentent les
    avantages suivants :</p>

    <ul>
      <li>Le paquetage du serveur est plus flexible &agrave; l'ex&eacute;cution car le
      processus serveur effectif peut &ecirc;tre assembl&eacute; &agrave; l'ex&eacute;cution via la
      directive <directive module="mod_so">LoadModule</directive> du fichier de
      configuration <code>httpd.conf</code> plut&ocirc;t que par des options du script
      <program>configure</program> &agrave; la compilation. Par exemple,
      on peut ainsi ex&eacute;cuter diff&eacute;rentes instances du serveur
      (standard et version SSL, version minimale et version &eacute;toff&eacute;e
      [mod_perl, PHP], <em>etc...</em>) &agrave; partir d'une seule installation
      d'Apache.</li>

      <li>Le paquetage du serveur peut &ecirc;tre facilement &eacute;tendu avec des modules
      tiers, m&ecirc;me apr&egrave;s l'installation. Ceci pr&eacute;sente en tout cas un gros
      avantage pour les mainteneurs de paquetages destin&eacute;s aux distributions,
      car ils peuvent cr&eacute;er un paquetage Apache de base, et des paquetages
      additionnels contenant des extensions telles que PHP, mod_perl, mod_fastcgi,
      <em>etc...</em></li>

      <li>Une facilit&eacute; de prototypage des modules Apache car la paire
      DSO/<program>apxs</program> vous permet d'une part de travailler en
      dehors de l'arborescence des sources d'Apache, et d'autre part de n'avoir
      besoin que de la commande <code>apxs -i</code>
      suivie d'un <code>apachectl restart</code> pour introduire une nouvelle
      version de votre module fra&icirc;chement d&eacute;velopp&eacute; dans le serveur Apache
      en cours d'ex&eacute;cution.</li>
    </ul>

    <p>Inconv&eacute;nients des DSO :</p>

    <ul>
      <li>Le m&eacute;canisme DSO n'est pas disponible sur toutes les plates-formes
      car tous les syst&egrave;mes d'exploitation ne supportent pas le chargement
      dynamique de code dans l'espace d'adressage d'un programme.</li>

      <li>Le serveur est environ 20 % plus lent au d&eacute;marrage
      &agrave; cause des r&eacute;solutions de symboles suppl&eacute;mentaires que le chargeur
      Unix doit effectuer.</li>

      <li>Le serveur est environ 5 % plus lent &agrave; l'ex&eacute;cution
      sur certaines plates-formes, car le code ind&eacute;pendant de la position (PIC)
      n&eacute;cessite parfois des manipulations compliqu&eacute;es en assembleur pour
      l'adressage relatif qui ne sont pas toujours aussi rapides que celles
      que permet l'adressage absolu.</li>

      <li>Comme les modules DSO ne peuvent pas &ecirc;tre li&eacute;s avec d'autres
      biblioth&egrave;ques bas&eacute;es sur DSO (<code>ld -lfoo</code>) sur toutes les
      plates-formes
      (par exemple, les plates-formes bas&eacute;es sur a.out ne fournissent en
      g&eacute;n&eacute;ral pas cette fonctionnalit&eacute; alors que les plates-formes bas&eacute;es sur
      ELF le font), vous ne pouvez pas utiliser le m&eacute;canisme DSO pour tous les
      types de modules. Ou en d'autres termes, les modules compil&eacute;s comme
      fichiers DSO sont contraints de n'utiliser que les symboles du coeur
      d'Apache, de la biblioth&egrave;que C
      (<code>libc</code>) et toutes autres biblioth&egrave;ques statiques ou
      dynamiques utilis&eacute;es par le coeur d'Apache, ou d'archives statiques
      (<code>libfoo.a</code>) contenant du code ind&eacute;pendant de la
      position (PIC).
      Il y a deux solutions pour utiliser un autre type de code : soit le
      coeur d'Apache contient d&eacute;j&agrave; lui-m&ecirc;me une r&eacute;f&eacute;rence au code, soit vous
      chargez le code vous-m&ecirc;me via <code>dlopen()</code>.</li>
    </ul>

</section>

</manualpage>
+567 −0

File added.

Preview size limit exceeded, changes collapsed.

+669 −0

File added.

Preview size limit exceeded, changes collapsed.

+77 −0
Changes for docs/manual/new_features_2_4.xml.fr: 77 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
<!-- English Revision : 642717 -->

<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<manualpage metafile="new_features_2_4.xml.meta">

<title>Vue d'ensemble des nouvelles fonctionnalit&eacute;s d'Apache 2.4</title>

<summary>
  <p>Ce document d&eacute;crit certaines modifications majeures entre les versions
  2.2 et 2.4 du serveur HTTP Apache. Pour les nouvelles fonctionnalit&eacute;s
  ajout&eacute;es depuis la version 2.0, se r&eacute;f&eacute;rer au document
  <a href="new_features_2_2.html">nouvelles fonctionnalit&eacute;s
  de la version 2.2</a>.</p>
</summary>

  <section id="core">
    <title>Am&eacute;liorations du noyau</title>
    <!-- <dl>
    </dl> -->
  </section>

  <section id="module">
    <title>Am&eacute;liorations des modules</title>
    <!-- <dl>
    </dl> -->
  </section>

  <section id="programs">
    <title>Am&eacute;liorations des programmes</title>
    <!-- <dl>
    </dl> -->
  </section>

  <section id="developer">
    <title>Modifications pour le d&eacute;veloppeur de modules</title>
    <dl>
      <dt>Ajout de code pour la v&eacute;rification de la configuration</dt>

      <dd>Une nouvelle fonction, <code>check_config</code>, a &eacute;t&eacute; ajout&eacute;e et
      s'ex&eacute;cute entre les fonctions <code>pre_config</code> et
      <code>open_logs</code>. Elle s'ex&eacute;cute aussi avant la fonction
      <code>test_config</code> si l'option <code>-t</code> est pass&eacute;e au
      d&eacute;mon <program>httpd</program>. La fonction <code>check_config</code>
      permet aux modules de v&eacute;rifier l'interd&eacute;pendance des valeurs des
      directives de configuration et d'ajuster ces valeurs, alors que les
      messages du serveur peuvent encore &ecirc;tre affich&eacute;s sur la console.
      L'utilisateur est ainsi averti des erreurs de configuration avant que la
      fonction du noyau <code>open_logs</code> ne redirige les sorties de la
      console vers le journal des erreurs.</dd>
      <dt>Ajout d'un analyseur syntaxique d'expressions</dt>
      <dd>Nous disposons &agrave; pr&eacute;sent d'un analyseur g&eacute;n&eacute;rique d'expressions, dont l'API
      est d&eacute;crite dans <var>ap_expr.h</var>. Il s'agit d'une adaptation de
      l'analyseur qu'on trouvait auparavant dans <module>mod_include</module>.</dd>
    </dl>
  </section>
</manualpage>
+564 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading