System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 4b2eb49acd9fb2f8a194a545f9110b3909ad6691:


0000: 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  //--------------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 0d 0a 2f 2f 20 3c 63 6f 70  -------..// <cop
0050: 79 72 69 67 68 74 20 66 69 6c 65 3d 22 53 71 6c  yright file="Sql
0060: 42 75 69 6c 64 65 72 2e 63 73 22 20 63 6f 6d 70  Builder.cs" comp
0070: 61 6e 79 3d 22 4d 69 63 72 6f 73 6f 66 74 22 3e  any="Microsoft">
0080: 0d 0a 2f 2f 20 20 20 20 20 20 50 6f 72 74 69 6f  ..//      Portio
0090: 6e 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  ns of this file 
00a0: 63 6f 70 79 72 69 67 68 74 20 28 63 29 20 4d 69  copyright (c) Mi
00b0: 63 72 6f 73 6f 66 74 20 43 6f 72 70 6f 72 61 74  crosoft Corporat
00c0: 69 6f 6e 0d 0a 2f 2f 20 20 20 20 20 20 61 6e 64  ion..//      and
00d0: 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 75 6e   are released un
00e0: 64 65 72 20 74 68 65 20 4d 69 63 72 6f 73 6f 66  der the Microsof
00f0: 74 20 50 75 6c 69 63 20 4c 69 63 65 6e 73 65 2e  t Pulic License.
0100: 20 20 53 65 65 0d 0a 2f 2f 20 20 20 20 20 20 68    See..//      h
0110: 74 74 70 3a 2f 2f 61 72 63 68 69 76 65 2e 6d 73  ttp://archive.ms
0120: 64 6e 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d  dn.microsoft.com
0130: 2f 45 46 53 61 6d 70 6c 65 50 72 6f 76 69 64 65  /EFSampleProvide
0140: 72 2f 50 72 6f 6a 65 63 74 2f 4c 69 63 65 6e 73  r/Project/Licens
0150: 65 2e 61 73 70 78 0d 0a 2f 2f 20 20 20 20 20 20  e.aspx..//      
0160: 6f 72 20 4c 69 63 65 6e 73 65 2e 74 78 74 20 66  or License.txt f
0170: 6f 72 20 64 65 74 61 69 6c 73 2e 0d 0a 2f 2f 20  or details...// 
0180: 20 20 20 20 20 41 6c 6c 20 72 69 67 68 74 73 20       All rights 
0190: 72 65 73 65 72 76 65 64 2e 0d 0a 2f 2f 20 3c 2f  reserved...// </
01a0: 63 6f 70 79 72 69 67 68 74 3e 0d 0a 2f 2f 2d 2d  copyright>..//--
01b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01f0: 2d 2d 2d 0d 0a 0d 0a 6e 61 6d 65 73 70 61 63 65  ---....namespace
0200: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
0210: 69 74 65 0d 0a 7b 0d 0a 20 20 75 73 69 6e 67 20  ite..{..  using 
0220: 53 79 73 74 65 6d 3b 0d 0a 20 20 75 73 69 6e 67  System;..  using
0230: 20 53 79 73 74 65 6d 2e 43 6f 6c 6c 65 63 74 69   System.Collecti
0240: 6f 6e 73 2e 47 65 6e 65 72 69 63 3b 0d 0a 20 20  ons.Generic;..  
0250: 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 69 61  using System.Dia
0260: 67 6e 6f 73 74 69 63 73 3b 0d 0a 0d 0a 23 69 66  gnostics;....#if
0270: 20 55 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d   USE_ENTITY_FRAM
0280: 45 57 4f 52 4b 5f 36 0d 0a 20 20 75 73 69 6e 67  EWORK_6..  using
0290: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 45 6e 74   System.Data.Ent
02a0: 69 74 79 2e 43 6f 72 65 2e 43 6f 6d 6d 6f 6e 2e  ity.Core.Common.
02b0: 43 6f 6d 6d 61 6e 64 54 72 65 65 73 3b 0d 0a 23  CommandTrees;..#
02c0: 65 6c 73 65 0d 0a 20 20 75 73 69 6e 67 20 53 79  else..  using Sy
02d0: 73 74 65 6d 2e 44 61 74 61 2e 43 6f 6d 6d 6f 6e  stem.Data.Common
02e0: 2e 43 6f 6d 6d 61 6e 64 54 72 65 65 73 3b 0d 0a  .CommandTrees;..
02f0: 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 2f 2f 2f 20  #endif....  /// 
0300: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 2f 2f 2f  <summary>..  ///
0310: 20 54 68 69 73 20 63 6c 61 73 73 20 69 73 20 6c   This class is l
0320: 69 6b 65 20 53 74 72 69 6e 67 42 75 69 6c 64 65  ike StringBuilde
0330: 72 2e 20 20 57 68 69 6c 65 20 74 72 61 76 65 72  r.  While traver
0340: 73 69 6e 67 20 74 68 65 20 74 72 65 65 20 66 6f  sing the tree fo
0350: 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  r the first time
0360: 2c 20 0d 0a 20 20 2f 2f 2f 20 77 65 20 64 6f 20  , ..  /// we do 
0370: 6e 6f 74 20 6b 6e 6f 77 20 61 6c 6c 20 74 68 65  not know all the
0380: 20 73 74 72 69 6e 67 73 20 74 68 61 74 20 6e 65   strings that ne
0390: 65 64 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ed to be appende
03a0: 64 20 65 2e 67 2e 20 74 68 69 6e 67 73 20 74 68  d e.g. things th
03b0: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 0d 0a 20  at need to be.. 
03c0: 20 2f 2f 2f 20 72 65 6e 61 6d 65 64 2c 20 6e 65   /// renamed, ne
03d0: 73 74 65 64 20 73 65 6c 65 63 74 20 73 74 61 74  sted select stat
03e0: 65 6d 65 6e 74 73 20 65 74 63 2e 20 20 53 6f 2c  ements etc.  So,
03f0: 20 77 65 20 75 73 65 20 61 20 62 75 69 6c 64 65   we use a builde
0400: 72 20 74 68 61 74 20 63 61 6e 20 63 6f 6c 6c 65  r that can colle
0410: 63 74 0d 0a 20 20 2f 2f 2f 20 61 6c 6c 20 6b 69  ct..  /// all ki
0420: 6e 64 73 20 6f 66 20 73 71 6c 20 66 72 61 67 6d  nds of sql fragm
0430: 65 6e 74 73 2e 0d 0a 20 20 2f 2f 2f 20 3c 2f 73  ents...  /// </s
0440: 75 6d 6d 61 72 79 3e 0d 0a 20 20 69 6e 74 65 72  ummary>..  inter
0450: 6e 61 6c 20 73 65 61 6c 65 64 20 63 6c 61 73 73  nal sealed class
0460: 20 53 71 6c 42 75 69 6c 64 65 72 20 3a 20 49 53   SqlBuilder : IS
0470: 71 6c 46 72 61 67 6d 65 6e 74 0d 0a 20 20 7b 0d  qlFragment..  {.
0480: 0a 20 20 20 20 70 72 69 76 61 74 65 20 4c 69 73  .    private Lis
0490: 74 3c 6f 62 6a 65 63 74 3e 20 5f 73 71 6c 46 72  t<object> _sqlFr
04a0: 61 67 6d 65 6e 74 73 3b 0d 0a 20 20 20 20 70 72  agments;..    pr
04b0: 69 76 61 74 65 20 4c 69 73 74 3c 6f 62 6a 65 63  ivate List<objec
04c0: 74 3e 20 73 71 6c 46 72 61 67 6d 65 6e 74 73 0d  t> sqlFragments.
04d0: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 67 65  .    {..      ge
04e0: 74 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  t..      {..    
04f0: 20 20 20 20 69 66 20 28 6e 75 6c 6c 20 3d 3d 20      if (null == 
0500: 5f 73 71 6c 46 72 61 67 6d 65 6e 74 73 29 0d 0a  _sqlFragments)..
0510: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
0520: 20 20 20 20 20 5f 73 71 6c 46 72 61 67 6d 65 6e       _sqlFragmen
0530: 74 73 20 3d 20 6e 65 77 20 4c 69 73 74 3c 6f 62  ts = new List<ob
0540: 6a 65 63 74 3e 28 29 3b 0d 0a 20 20 20 20 20 20  ject>();..      
0550: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74    }..        ret
0560: 75 72 6e 20 5f 73 71 6c 46 72 61 67 6d 65 6e 74  urn _sqlFragment
0570: 73 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  s;..      }..   
0580: 20 7d 0d 0a 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 20   }......    /// 
0590: 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f  <summary>..    /
05a0: 2f 2f 20 41 64 64 20 61 6e 20 6f 62 6a 65 63 74  // Add an object
05b0: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 2d 20 77   to the list - w
05c0: 65 20 64 6f 20 6e 6f 74 20 76 65 72 69 66 79 20  e do not verify 
05d0: 74 68 61 74 20 69 74 20 69 73 20 61 20 70 72 6f  that it is a pro
05e0: 70 65 72 20 73 71 6c 20 66 72 61 67 6d 65 6e 74  per sql fragment
05f0: 0d 0a 20 20 20 20 2f 2f 2f 20 73 69 6e 63 65 20  ..    /// since 
0600: 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  this is an inter
0610: 6e 61 6c 20 6d 65 74 68 6f 64 2e 0d 0a 20 20 20  nal method...   
0620: 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d   /// </summary>.
0630: 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20  .    /// <param 
0640: 6e 61 6d 65 3d 22 73 22 3e 3c 2f 70 61 72 61 6d  name="s"></param
0650: 3e 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f  >..    public vo
0660: 69 64 20 41 70 70 65 6e 64 28 6f 62 6a 65 63 74  id Append(object
0670: 20 73 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20   s)..    {..    
0680: 20 20 44 65 62 75 67 2e 41 73 73 65 72 74 28 73    Debug.Assert(s
0690: 20 21 3d 20 6e 75 6c 6c 29 3b 0d 0a 20 20 20 20   != null);..    
06a0: 20 20 73 71 6c 46 72 61 67 6d 65 6e 74 73 2e 41    sqlFragments.A
06b0: 64 64 28 73 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  dd(s);..    }...
06c0: 0a 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72  .    /// <summar
06d0: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 69 73  y>..    /// This
06e0: 20 69 73 20 74 6f 20 70 72 65 74 74 79 20 70 72   is to pretty pr
06f0: 69 6e 74 20 74 68 65 20 53 51 4c 2e 20 20 54 68  int the SQL.  Th
0700: 65 20 77 72 69 74 65 72 20 3c 73 65 65 20 63 72  e writer <see cr
0710: 65 66 3d 22 53 71 6c 57 72 69 74 65 72 2e 57 72  ef="SqlWriter.Wr
0720: 69 74 65 22 2f 3e 0d 0a 20 20 20 20 2f 2f 2f 20  ite"/>..    /// 
0730: 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 61 62  needs to know ab
0740: 6f 75 74 20 6e 65 77 20 6c 69 6e 65 73 20 73 6f  out new lines so
0750: 20 74 68 61 74 20 69 74 20 63 61 6e 20 61 64 64   that it can add
0760: 20 74 68 65 20 72 69 67 68 74 20 61 6d 6f 75 6e   the right amoun
0770: 74 20 6f 66 20 0d 0a 20 20 20 20 2f 2f 2f 20 69  t of ..    /// i
0780: 6e 64 65 6e 74 61 74 69 6f 6e 20 61 74 20 74 68  ndentation at th
0790: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6c  e beginning of l
07a0: 69 6e 65 73 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  ines...    /// <
07b0: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 70  /summary>..    p
07c0: 75 62 6c 69 63 20 76 6f 69 64 20 41 70 70 65 6e  ublic void Appen
07d0: 64 4c 69 6e 65 28 29 0d 0a 20 20 20 20 7b 0d 0a  dLine()..    {..
07e0: 20 20 20 20 20 20 73 71 6c 46 72 61 67 6d 65 6e        sqlFragmen
07f0: 74 73 2e 41 64 64 28 22 5c 72 5c 6e 22 29 3b 0d  ts.Add("\r\n");.
0800: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
0810: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
0820: 20 2f 2f 2f 20 57 68 65 74 68 65 72 20 74 68 65   /// Whether the
0830: 20 62 75 69 6c 64 65 72 20 69 73 20 65 6d 70 74   builder is empt
0840: 79 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  y.  This is used
0850: 20 62 79 20 74 68 65 20 3c 73 65 65 20 63 72 65   by the <see cre
0860: 66 3d 22 53 71 6c 47 65 6e 65 72 61 74 6f 72 2e  f="SqlGenerator.
0870: 56 69 73 69 74 28 44 62 50 72 6f 6a 65 63 74 45  Visit(DbProjectE
0880: 78 70 72 65 73 73 69 6f 6e 29 22 2f 3e 0d 0a 20  xpression)"/>.. 
0890: 20 20 20 2f 2f 2f 20 74 6f 20 64 65 74 65 72 6d     /// to determ
08a0: 69 6e 65 20 77 68 65 74 68 65 72 20 61 20 73 71  ine whether a sq
08b0: 6c 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20  l statement can 
08c0: 62 65 20 72 65 75 73 65 64 2e 0d 0a 20 20 20 20  be reused...    
08d0: 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a  /// </summary>..
08e0: 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20      public bool 
08f0: 49 73 45 6d 70 74 79 0d 0a 20 20 20 20 7b 0d 0a  IsEmpty..    {..
0900: 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75        get { retu
0910: 72 6e 20 28 28 6e 75 6c 6c 20 3d 3d 20 5f 73 71  rn ((null == _sq
0920: 6c 46 72 61 67 6d 65 6e 74 73 29 20 7c 7c 20 28  lFragments) || (
0930: 30 20 3d 3d 20 5f 73 71 6c 46 72 61 67 6d 65 6e  0 == _sqlFragmen
0940: 74 73 2e 43 6f 75 6e 74 29 29 3b 20 7d 0d 0a 20  ts.Count)); }.. 
0950: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 72 65 67     }....    #reg
0960: 69 6f 6e 20 49 53 71 6c 46 72 61 67 6d 65 6e 74  ion ISqlFragment
0970: 20 4d 65 6d 62 65 72 73 0d 0a 0d 0a 20 20 20 20   Members....    
0980: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
0990: 20 20 20 2f 2f 2f 20 57 65 20 64 65 6c 65 67 61     /// We delega
09a0: 74 65 20 74 68 65 20 77 72 69 74 69 6e 67 20 6f  te the writing o
09b0: 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74 20 74  f the fragment t
09c0: 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
09d0: 65 20 74 79 70 65 2e 0d 0a 20 20 20 20 2f 2f 2f  e type...    ///
09e0: 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20   </summary>..   
09f0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
0a00: 3d 22 77 72 69 74 65 72 22 3e 3c 2f 70 61 72 61  ="writer"></para
0a10: 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  m>..    /// <par
0a20: 61 6d 20 6e 61 6d 65 3d 22 73 71 6c 47 65 6e 65  am name="sqlGene
0a30: 72 61 74 6f 72 22 3e 3c 2f 70 61 72 61 6d 3e 0d  rator"></param>.
0a40: 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64  .    public void
0a50: 20 57 72 69 74 65 53 71 6c 28 53 71 6c 57 72 69   WriteSql(SqlWri
0a60: 74 65 72 20 77 72 69 74 65 72 2c 20 53 71 6c 47  ter writer, SqlG
0a70: 65 6e 65 72 61 74 6f 72 20 73 71 6c 47 65 6e 65  enerator sqlGene
0a80: 72 61 74 6f 72 29 0d 0a 20 20 20 20 7b 0d 0a 20  rator)..    {.. 
0a90: 20 20 20 20 20 69 66 20 28 6e 75 6c 6c 20 21 3d       if (null !=
0aa0: 20 5f 73 71 6c 46 72 61 67 6d 65 6e 74 73 29 0d   _sqlFragments).
0ab0: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
0ac0: 20 20 66 6f 72 65 61 63 68 20 28 6f 62 6a 65 63    foreach (objec
0ad0: 74 20 6f 20 69 6e 20 5f 73 71 6c 46 72 61 67 6d  t o in _sqlFragm
0ae0: 65 6e 74 73 29 0d 0a 20 20 20 20 20 20 20 20 7b  ents)..        {
0af0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 69  ..          stri
0b00: 6e 67 20 73 74 72 20 3d 20 28 6f 20 61 73 20 53  ng str = (o as S
0b10: 74 72 69 6e 67 29 3b 0d 0a 20 20 20 20 20 20 20  tring);..       
0b20: 20 20 20 69 66 20 28 6e 75 6c 6c 20 21 3d 20 73     if (null != s
0b30: 74 72 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b  tr)..          {
0b40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 72  ..            wr
0b50: 69 74 65 72 2e 57 72 69 74 65 28 73 74 72 29 3b  iter.Write(str);
0b60: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
0b70: 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20           else.. 
0b80: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
0b90: 20 20 20 20 20 20 20 20 49 53 71 6c 46 72 61 67          ISqlFrag
0ba0: 6d 65 6e 74 20 73 71 6c 46 72 61 67 6d 65 6e 74  ment sqlFragment
0bb0: 20 3d 20 28 6f 20 61 73 20 49 53 71 6c 46 72 61   = (o as ISqlFra
0bc0: 67 6d 65 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20  gment);..       
0bd0: 20 20 20 20 20 69 66 20 28 6e 75 6c 6c 20 21 3d       if (null !=
0be0: 20 73 71 6c 46 72 61 67 6d 65 6e 74 29 0d 0a 20   sqlFragment).. 
0bf0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 46              sqlF
0c10: 72 61 67 6d 65 6e 74 2e 57 72 69 74 65 53 71 6c  ragment.WriteSql
0c20: 28 77 72 69 74 65 72 2c 20 73 71 6c 47 65 6e 65  (writer, sqlGene
0c30: 72 61 74 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20  rator);..       
0c40: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
0c50: 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20      else..      
0c60: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
0c70: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
0c80: 20 49 6e 76 61 6c 69 64 4f 70 65 72 61 74 69 6f   InvalidOperatio
0c90: 6e 45 78 63 65 70 74 69 6f 6e 28 29 3b 0d 0a 20  nException();.. 
0ca0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
0cb0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0cc0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
0cd0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 65 6e 64     }....    #end
0ce0: 72 65 67 69 6f 6e 0d 0a 20 20 7d 0d 0a 7d 0d 0a  region..  }..}..