From d85e916fbcb4220440c600976f72d9dfbe6d2b72 Mon Sep 17 00:00:00 2001 From: meltingice Date: Tue, 17 Jul 2012 22:27:22 -0400 Subject: Updated documentation --- docs/blackwhite.html | 11 +++++++++++ docs/brightnesscontrast.html | 2 +- docs/colorbalance.html | 2 +- docs/curves.html | 2 +- docs/exposure.html | 13 +++++++++++++ docs/gradient.html | 11 +++++++++++ docs/huesaturation.html | 2 +- docs/invert.html | 2 +- docs/layereffect.html | 2 +- docs/levels.html | 2 +- docs/log.html | 2 +- docs/pattern.html | 11 +++++++++++ docs/photofilter.html | 19 ++++++++++++++++++ docs/posterize.html | 2 +- docs/psd.html | 2 +- docs/psdassert.html | 2 +- docs/psdchannelimage.html | 2 +- docs/psdcolor.html | 2 +- docs/psddescriptor.html | 12 ++++++------ docs/psdfile.html | 2 +- docs/psdheader.html | 2 +- docs/psdimage.html | 2 +- docs/psdlayer.html | 37 ++++++++++++++++++++++++----------- docs/psdlayermask.html | 46 ++++++++++++++++++++++++++++++++++++++++++-- docs/psdresource.html | 2 +- docs/selectivecolor.html | 2 +- docs/solidcolor.html | 9 +++++++++ docs/threshold.html | 2 +- docs/typetool.html | 25 ++++++++++-------------- docs/util.html | 2 +- docs/vibrance.html | 11 +++++++++++ 31 files changed, 191 insertions(+), 54 deletions(-) create mode 100644 docs/blackwhite.html create mode 100644 docs/exposure.html create mode 100644 docs/gradient.html create mode 100644 docs/pattern.html create mode 100644 docs/photofilter.html create mode 100644 docs/solidcolor.html create mode 100644 docs/vibrance.html diff --git a/docs/blackwhite.html b/docs/blackwhite.html new file mode 100644 index 0000000..74f61e2 --- /dev/null +++ b/docs/blackwhite.html @@ -0,0 +1,11 @@ + blackwhite.coffee

blackwhite.coffee

class PSDBlackWhite
+  constructor: (@layer, @length) ->
+    @file = @layer.file
+
+  parse: ->
+    version = @file.readInt()
+    assert version is 16
+
+    (new PSDDescriptor(@file)).parse()
+
+
\ No newline at end of file diff --git a/docs/brightnesscontrast.html b/docs/brightnesscontrast.html index 0357378..0afbc15 100644 --- a/docs/brightnesscontrast.html +++ b/docs/brightnesscontrast.html @@ -1,4 +1,4 @@ - brightnesscontrast.coffee

brightnesscontrast.coffee

class PSDBrightnessContrast
+      brightnesscontrast.coffee           

brightnesscontrast.coffee

class PSDBrightnessContrast
   constructor: (@layer, @length) ->
     @file = @layer.file
     @data = {}
diff --git a/docs/colorbalance.html b/docs/colorbalance.html
index baf96f2..8cb82d6 100644
--- a/docs/colorbalance.html
+++ b/docs/colorbalance.html
@@ -1,4 +1,4 @@
-      colorbalance.coffee           

colorbalance.coffee

class PSDColorBalance
+      colorbalance.coffee           

colorbalance.coffee

class PSDColorBalance
   constructor: (@layer, @length) ->
     @file = @layer.file
     @data =
diff --git a/docs/curves.html b/docs/curves.html
index d9b8072..1f37eeb 100644
--- a/docs/curves.html
+++ b/docs/curves.html
@@ -1,4 +1,4 @@
-      curves.coffee           

curves.coffee

class PSDCurves
+      curves.coffee           

curves.coffee

class PSDCurves
   constructor: (@layer, @length) ->
     @file = @layer.file
     @data =
diff --git a/docs/exposure.html b/docs/exposure.html
new file mode 100644
index 0000000..4c92dcb
--- /dev/null
+++ b/docs/exposure.html
@@ -0,0 +1,13 @@
+      exposure.coffee              
\ No newline at end of file
diff --git a/docs/gradient.html b/docs/gradient.html
new file mode 100644
index 0000000..af7769c
--- /dev/null
+++ b/docs/gradient.html
@@ -0,0 +1,11 @@
+      gradient.coffee              
\ No newline at end of file
diff --git a/docs/huesaturation.html b/docs/huesaturation.html
index 9c0874d..62de213 100644
--- a/docs/huesaturation.html
+++ b/docs/huesaturation.html
@@ -1,4 +1,4 @@
-      huesaturation.coffee           

huesaturation.coffee

class PSDHueSaturation
+      huesaturation.coffee           

huesaturation.coffee

class PSDHueSaturation
   constructor: (@layer, @length) ->
     @file = @layer.file
 
diff --git a/docs/invert.html b/docs/invert.html
index 3534d2a..f588acd 100644
--- a/docs/invert.html
+++ b/docs/invert.html
@@ -1,4 +1,4 @@
-      invert.coffee           

invert.coffee

class PSDInvert
+      invert.coffee           

invert.coffee

class PSDInvert
   constructor: (@layer, @length) ->
     @file = @layer.file

There is no parameter. If this adjustment layer is present, then the layer is inverted.

  parse: -> true
diff --git a/docs/layereffect.html b/docs/layereffect.html
index 5d9d9c6..2d32081 100644
--- a/docs/layereffect.html
+++ b/docs/layereffect.html
@@ -1,4 +1,4 @@
-      layereffect.coffee           

layereffect.coffee

libpsd has effect layer parsing + layereffect.coffee

layereffect.coffee

libpsd has effect layer parsing see https://github.com/alco/psdump/blob/master/libpsd-0.9

class PSDLayerEffect
 
   constructor: (@file) ->
diff --git a/docs/levels.html b/docs/levels.html
index 1cbbac4..85a3ee3 100644
--- a/docs/levels.html
+++ b/docs/levels.html
@@ -1,4 +1,4 @@
-      levels.coffee           

levels.coffee

class PSDLevels
+      levels.coffee           

levels.coffee

class PSDLevels
   constructor: (@layer, @length) ->
     @file = @layer.file
     @data =
diff --git a/docs/log.html b/docs/log.html
index 6c8d98d..1649402 100644
--- a/docs/log.html
+++ b/docs/log.html
@@ -1,4 +1,4 @@
-      log.coffee           

log.coffee

A simple logger class that lets you enable/disable logging to + log.coffee

log.coffee

A simple logger class that lets you enable/disable logging to the console, since it can be very verbose.

class Log

Alias debug() to log()

  @debug: @log = -> @output "log", arguments

Call the console function

  @output: (method, data) ->
     if exports?

If we're in Node, we can call apply() on console functions

      console[method].apply null, data if PSD.DEBUG
     else

If we're in the browser, we have to log the array because diff --git a/docs/pattern.html b/docs/pattern.html new file mode 100644 index 0000000..e324e77 --- /dev/null +++ b/docs/pattern.html @@ -0,0 +1,11 @@ + pattern.coffee

\ No newline at end of file diff --git a/docs/photofilter.html b/docs/photofilter.html new file mode 100644 index 0000000..2648344 --- /dev/null +++ b/docs/photofilter.html @@ -0,0 +1,19 @@ + photofilter.coffee \ No newline at end of file diff --git a/docs/posterize.html b/docs/posterize.html index de53681..1e11ae4 100644 --- a/docs/posterize.html +++ b/docs/posterize.html @@ -1,4 +1,4 @@ - posterize.coffee

posterize.coffee

class PSDPosterize
+      posterize.coffee           

posterize.coffee

class PSDPosterize
   constructor: (@layer, @length) ->
     @file = @layer.file
     @data = {}
diff --git a/docs/psd.html b/docs/psd.html
index 6c6df1e..56dd9d9 100644
--- a/docs/psd.html
+++ b/docs/psd.html
@@ -1,4 +1,4 @@
-      psd.coffee           

psd.coffee

NodeJS or browser?

if exports?
+      psd.coffee           

psd.coffee

NodeJS or browser?

if exports?
   Root = exports
   fs = require 'fs'
 else
diff --git a/docs/psdassert.html b/docs/psdassert.html
index 9746684..1e95afd 100644
--- a/docs/psdassert.html
+++ b/docs/psdassert.html
@@ -1,4 +1,4 @@
-      psdassert.coffee           

psdassert.coffee

Quick and dirty assertion polyfill for browsers

assert = do (assert) ->
+      psdassert.coffee           

psdassert.coffee

Quick and dirty assertion polyfill for browsers

assert = do (assert) ->
   return require 'assert' if exports?
 
   assert = (test) ->
diff --git a/docs/psdchannelimage.html b/docs/psdchannelimage.html
index a89749b..a7fdd43 100644
--- a/docs/psdchannelimage.html
+++ b/docs/psdchannelimage.html
@@ -1,4 +1,4 @@
-      psdchannelimage.coffee           

psdchannelimage.coffee

PSD files also store merged image data for each individual layer. + psdchannelimage.coffee

psdchannelimage.coffee

PSD files also store merged image data for each individual layer. Unfortunately, parsing this image data is a bit different than parsing the overall merged image data at the end of the file. The main difference is that each image channel has independent compression, and the channel diff --git a/docs/psdcolor.html b/docs/psdcolor.html index dc7cc3f..602e4a2 100644 --- a/docs/psdcolor.html +++ b/docs/psdcolor.html @@ -1,4 +1,4 @@ - psdcolor.coffee

psdcolor.coffee

Tons of color conversion functions. + psdcolor.coffee

psdcolor.coffee

Tons of color conversion functions. Borrowed directly from CamanJS.

PSD.PSDColor = class PSDColor

Converts the hex representation of a color to RGB values. Hex value can optionally start with the hash (#).

diff --git a/docs/psddescriptor.html b/docs/psddescriptor.html index c68df84..e161d7f 100644 --- a/docs/psddescriptor.html +++ b/docs/psddescriptor.html @@ -1,18 +1,18 @@ - psddescriptor.coffee

psddescriptor.coffee

class PSDDescriptor
-  constructor: (@file) ->
-    @data = {}

Main entry point for parsing a descriptor

  parse: ->
+      psddescriptor.coffee           

psddescriptor.coffee

class PSDDescriptor
+  constructor: (@file) ->

Main entry point for parsing a descriptor

  parse: ->
     Log.debug "Parsing descriptor..."
 
-    @data.class = @parseClass()
+    data = {}
+    data.class = @parseClass()
 
     numItems = @file.readInt()
     Log.debug "Descriptor contains #{numItems} items"
 
     for i in [0...numItems]
       item = @parseKeyItem()
-      @data[item.id] = item.value
+      data[item.id] = item.value
 
-    @data
+    data
 
   parseID: ->
     len = @file.readInt()
diff --git a/docs/psdfile.html b/docs/psdfile.html
index 1c2264b..0f6be03 100644
--- a/docs/psdfile.html
+++ b/docs/psdfile.html
@@ -1,4 +1,4 @@
-      psdfile.coffee           

psdfile.coffee

Simulation and abstraction of a disk-based file. + psdfile.coffee

psdfile.coffee

Simulation and abstraction of a disk-based file. Provides methods to read the raw binary file data, which is stored in a variable instead of read from disk. A lot of these functions are from C, but some of them are helper functions to make things a bit easier to diff --git a/docs/psdheader.html b/docs/psdheader.html index 617e41c..cb0fd51 100644 --- a/docs/psdheader.html +++ b/docs/psdheader.html @@ -1,4 +1,4 @@ - psdheader.coffee

psdheader.coffee

The PSD header describes all kinds of important information pertaining to + psdheader.coffee

psdheader.coffee

The PSD header describes all kinds of important information pertaining to the PSD file such as size, color channels, color depth, and so on.

class PSDHeader

All of the sections that the header contains. These will become properties of the instantiated header object once parsed.

  HEADER_SECTIONS = [
     "sig"
diff --git a/docs/psdimage.html b/docs/psdimage.html
index 2e7b715..3914cb4 100644
--- a/docs/psdimage.html
+++ b/docs/psdimage.html
@@ -1,4 +1,4 @@
-      psdimage.coffee           

psdimage.coffee

A PSDImage stores parsed image data for images contained within the PSD, and + psdimage.coffee

psdimage.coffee

A PSDImage stores parsed image data for images contained within the PSD, and for the PSD itself.

class PSDImage
   COMPRESSIONS =
     0: 'Raw'
diff --git a/docs/psdlayer.html b/docs/psdlayer.html
index 983f1e4..4a1d897 100644
--- a/docs/psdlayer.html
+++ b/docs/psdlayer.html
@@ -1,4 +1,4 @@
-      psdlayer.coffee           

psdlayer.coffee

class PSDLayer
+      psdlayer.coffee           

psdlayer.coffee

class PSDLayer
   CHANNEL_SUFFIXES =
     '-2': 'layer mask'
     '-1': 'A'
@@ -199,8 +199,6 @@ includes a unicode version of the name, which is in the additional
 layer information section.

  parseLegacyLayerName: ->

Name length is padded in multiples of 4

    namelen = Util.pad4 @file.read(1)[0]
     @legacyName = Util.decodeMacroman(@file.read(namelen)).replace /\u0000/g, ''
 
-    Log.debug "Layer name: #{@name}"
-
   parseExtraData: ->
     while @file.tell() < @layerEnd
       [
@@ -213,18 +211,31 @@ layer information section.

length = Util.pad2 @file.readInt() pos = @file.tell()

TODO: many more adjustment layers to implement

      Log.debug("Extra layer info: key = #{key}, length = #{length}")
       switch key
+        when "SoCo"
+          @adjustments.solidColor = (new PSDSolidColor(@, length)).parse()
+          console.log "SoCo:", @adjustments.solidColor
+        when "GdFl"
+          @adjustments.gradient = (new PSDGradient(@, length)).parse()
+        when "PtFl"
+          @adjustments.pattern = (new PSDPattern(@, length)).parse()
+        when "brit"
+          @adjustments.brightnessContrast = (new PSDBrightnessContrast(@, length)).parse()
         when "levl"
           @adjustments.levels = (new PSDLevels(@, length)).parse()
         when "curv"
           @adjustments.curves = (new PSDCurves(@, length)).parse()
-        when "brit"
-          @adjustments.brightnessContrast = (new PSDBrightnessContrast(@, length)).parse()
+        when "expA"
+          @adjustments.exposure = (new PSDExposure(@, length)).parse()
+        when "vibA"
+          @adjustments.vibrance = (new PSDVibrance(@, length)).parse()
+        when "hue2" # PS >= 5.0
+          @adjustments.hueSaturation = (new PSDHueSaturation(@, length)).parse()
         when "blnc"
           @adjustments.colorBalance = (new PSDColorBalance(@, length)).parse()
-        when "hue2"
-          @adjustments.hueSaturation = (new PSDHueSaturation(@, length)).parse()
-        when "selc"
-          @adjustments.selectiveColor = (new PSDSelectiveColor(@, length)).parse()
+        when "blwh"
+          @adjustments.blackWhite = (new PSDBlackWhite(@, length)).parse()
+        when "phfl"
+          @adjustments.photoFilter = (new PSDPhotoFilter(@, length)).parse()
         when "thrs"
           @adjustments.threshold = (new PSDThreshold(@, length)).parse()
         when "nvrt"
@@ -236,19 +247,22 @@ layer information section.

when "TySh" # PS >= 6 @adjustments.typeTool = (new PSDTypeTool(@, length)).parse() when "luni" # PS >= 5.0 - @name = @file.readUnicodeString() + @name = @file.readUnicodeString()

This seems to be padded with null bytes (by 4?), but the easiest +thing to do is to simply jump to the end of this section.

          @file.seek pos + length, false
         when "lyid"
           @layerId = @file.readInt()
         when "lsct"
           @readLayerSectionDivider()
         when "lrFX"
           @parseEffectsLayer(); @file.read(2) # why these 2 bytes?
+        when "selc"
+          @adjustments.selectiveColor = (new PSDSelectiveColor(@, length)).parse()
         else  
           @file.seek length
           Log.debug("Skipping additional layer info with key #{key}")
 
       if @file.tell() != (pos + length)
-        Log.debug "Error parsing additional layer info with key #{key} - unexpected end"
+        Log.debug "Warning: additional layer info with key #{key} - unexpected end"
         @file.seek pos + length, false # Attempt to recover
 
   parseEffectsLayer: ->
@@ -301,6 +315,7 @@ layer information section.

toJSON: -> sections = [ 'name' + 'legacyName' 'top' 'left' 'bottom' diff --git a/docs/psdlayermask.html b/docs/psdlayermask.html index b7e3f2d..82162c8 100644 --- a/docs/psdlayermask.html +++ b/docs/psdlayermask.html @@ -1,4 +1,4 @@ - psdlayermask.coffee

psdlayermask.coffee

class PSDLayerMask
+      psdlayermask.coffee           
start = @file.tell() end = @file.tell() + length - Log.debug "Global mask length: #{length}"

psdlayermask.coffee

class PSDLayerMask
   constructor: (@file, @header, @options) ->

Array to hold all of the layers

    @layers = []

Does the first alpha channel contain the transparency data?

    @mergedAlpha = false

The global layer mask

    @globalMask = {}

Additional layer information

    @extras = []

Skip over this section and don't parse it

  skip: -> @file.seek @file.readInt()
 
   parse: ->

Read the size of the entire layers and masks section

    maskSize = @file.readInt()
@@ -47,4 +47,46 @@ the transparency data for the merged image.

Undocumented

    @globalMask.overlayColorSpace = @file.readShortInt

TODO: parse color space components into actual color.

undefined

0 = transparent, 100 = opaque

undefined

0 = color selected; 1 = color protected; 128 = use value per layer

undefined

Filler zeros, seek to end.

undefined

Temporary

undefined
\ No newline at end of file + Log.debug "Global mask length: #{length}"

Undocumented

    @globalMask.overlayColorSpace = @file.readShortInt()

TODO: parse color space components into actual color.

    @globalMask.colorComponents = []
+    for i in [0...4]
+      @globalMask.colorComponents.push(@file.readShortInt() >> 8)

0 = transparent, 100 = opaque

    @globalMask.opacity = @file.readShortInt()

0 = color selected; 1 = color protected; 128 = use value per layer

    @globalMask.kind = @file.read(1)[0]
+
+    Log.debug "Global mask:", @globalMask

Filler zeros, seek to end.

    @file.seek end, false
+
+  parseExtraInfo: (end) ->
+    while @file.tell() < end

Temporary

      [
+        sig,
+        key,
+        length
+      ] = @file.readf ">4s4sI"
+
+      length = Util.pad2 length
+
+      Log.debug "Layer extra:", sig, key, length
+
+      @file.seek length
+
+  groupLayers: ->
+    groupLayer = null
+    for layer in @layers
+      if layer.isFolder
+        groupLayer = layer
+      else if layer.isHidden
+        groupLayer = null
+      else
+        layer.groupLayer = groupLayer
+
+  toJSON: ->
+    data =
+      mergedAlpha: @mergedAlpha
+      globalMask: @globalMask
+      extraInfo: @extras
+      numLayers: @numLayers
+      layers: []
+
+    for layer in @layers
+      data.layers.push layer.toJSON()
+
+    data
+
+
\ No newline at end of file diff --git a/docs/psdresource.html b/docs/psdresource.html index cba5151..9cea2b4 100644 --- a/docs/psdresource.html +++ b/docs/psdresource.html @@ -1,4 +1,4 @@ - psdresource.coffee

psdresource.coffee

class PSDResource
+      psdresource.coffee           

psdresource.coffee

class PSDResource
   RESOURCE_DESCRIPTIONS =
     1000: 
       name: 'PS2.0 mode data'
diff --git a/docs/selectivecolor.html b/docs/selectivecolor.html
index cc22059..8b5abd5 100644
--- a/docs/selectivecolor.html
+++ b/docs/selectivecolor.html
@@ -1,4 +1,4 @@
-      selectivecolor.coffee           

selectivecolor.coffee

class PSDSelectiveColor
+      selectivecolor.coffee           

selectivecolor.coffee

class PSDSelectiveColor
   constructor: (@layer, @length) ->
     @file = @layer.file
     @data =
diff --git a/docs/solidcolor.html b/docs/solidcolor.html
new file mode 100644
index 0000000..edeae13
--- /dev/null
+++ b/docs/solidcolor.html
@@ -0,0 +1,9 @@
+      solidcolor.coffee              
\ No newline at end of file
diff --git a/docs/threshold.html b/docs/threshold.html
index cb9f255..de4798f 100644
--- a/docs/threshold.html
+++ b/docs/threshold.html
@@ -1,4 +1,4 @@
-      threshold.coffee           

threshold.coffee

class PSDThreshold
+      threshold.coffee           

threshold.coffee

class PSDThreshold
   constructor: (@layer, @length) ->
     @file = @layer.file
     @data = {}
diff --git a/docs/typetool.html b/docs/typetool.html
index 0334786..1e38c9b 100644
--- a/docs/typetool.html
+++ b/docs/typetool.html
@@ -1,4 +1,4 @@
-      typetool.coffee           

typetool.coffee

class PSDTypeTool
+      typetool.coffee           

typetool.coffee

class PSDTypeTool
   constructor: (@layer, @length) ->
     @file = @layer.file
     @data = {}
@@ -27,19 +27,14 @@ future.

for char in @data.text.EngineData engineData += String.fromCharCode(char) - @data.text.EngineData = engineData.replace /\u0000/g, "" - Log.debug "Text:", @data.text - - warpVersion = @file.readShortInt() + @data.text.EngineData = engineData.replace /\u0000/g, ""

This is a bit verbose +Log.debug "Text:", @data.text

    warpVersion = @file.readShortInt()
     assert warpVersion is 1
 
     descriptorVersion = @file.readInt()
     assert descriptorVersion is 16
 
-    @data.warp = (new PSDDescriptor(@file)).parse()
-    Log.debug "Warp:", @data.warp
-
-    [
+    @data.warp = (new PSDDescriptor(@file)).parse()

Log.debug "Warp:", @data.warp

    [
       @data.left
       @data.top
       @data.right
@@ -48,8 +43,8 @@ future.

@data - parseLegacy: ->

Font Information

    version = @file.readShortInt()
-    assert version is 6

Count of faces

    @data.facesCount = @file.readShortInt()
+  parseLegacy: ->

Font Information

    version = @file.readShortInt()
+    assert version is 6

Count of faces

    @data.facesCount = @file.readShortInt()
     @data.face = []
 
     for i in [0...@data.facesCount]
@@ -65,7 +60,7 @@ future.

@data.face[i].vector = [] for j in [0...@data.face[i].numberAxesVector] - @data.face[i].vector[j] = @file.readInt()

Style Information

    @data.stylesCount = @file.readShortInt()
+        @data.face[i].vector[j] = @file.readInt()

Style Information

    @data.stylesCount = @file.readShortInt()
     @data.style = []
 
     for i in [0...@data.stylesCount]
@@ -77,9 +72,9 @@ future.

@data.style[i].kerning = @file.readInt() @data.style[i].leading = @file.readInt() @data.style[i].baseShift = @file.readInt() - @data.style[i].autoKern = @file.readBoolean()

Only present in version <= 5

      @file.read 1
+      @data.style[i].autoKern = @file.readBoolean()

Only present in version <= 5

      @file.read 1
 
-      @data.style[i].rotate = @file.readBoolean()

Text Information

    @data.type = @file.readShortInt()
+      @data.style[i].rotate = @file.readBoolean()

Text Information

    @data.type = @file.readShortInt()
     @data.scalingFactor = @file.readInt()
     @data.sharacterCount = @file.readInt()
     @data.horzPlace = @file.readInt()
@@ -94,7 +89,7 @@ future.

@data.line[i].orientation = @file.readShortInt() @data.line[i].alignment = @file.readShortInt() @data.line[i].actualChar = @file.readShortInt() - @data.line[i].style = @file.readShortInt()

Color Information

    @data.color = @file.readSpaceColor()
+      @data.line[i].style = @file.readShortInt()

Color Information

    @data.color = @file.readSpaceColor()
     @data.antialias = @file.readBoolean()
 
     @data
diff --git a/docs/util.html b/docs/util.html
index 92e1412..1fdfda4 100644
--- a/docs/util.html
+++ b/docs/util.html
@@ -1,4 +1,4 @@
-      util.coffee           

util.coffee

"Static" utility functions

class Util
+      util.coffee           

util.coffee

"Static" utility functions

class Util
   @pad2: (i) -> Math.floor((i + 1) / 2) * 2
   @pad4: (i) -> (((i & 0xFF) + 1 + 3) & ~0x03) - 1
 
diff --git a/docs/vibrance.html b/docs/vibrance.html
new file mode 100644
index 0000000..97f5316
--- /dev/null
+++ b/docs/vibrance.html
@@ -0,0 +1,11 @@
+      vibrance.coffee              
\ No newline at end of file
-- 
cgit v1.2.3-59-g8ed1b