[coreboot] Patch set updated for coreboot: c2f2c37 cbfstool: Update LZMA encoder to LZMA SDK 9.12

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Thu Nov 8 20:52:31 CET 2012


Stefan Reinauer (stefan.reinauer at coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/1799

-gerrit

commit c2f2c37bfbab016ef309b5e9de85d736f3d6f9a3
Author: Stefan Reinauer <reinauer at chromium.org>
Date:   Tue Oct 30 14:02:45 2012 -0700

    cbfstool: Update LZMA encoder to LZMA SDK 9.12
    
    This removes almost all C++ code (except the wrapper)
    
    Change-Id: I0f84070e3b6dc57c98d49a53150a140479b3221f
    Signed-off-by: Stefan Reinauer <reinauer at google.com>
---
 util/cbfstool/Makefile                             |   41 +-
 util/cbfstool/Makefile.inc                         |   39 +-
 util/cbfstool/lzma/C/7zip/Common/InBuffer.h        |   76 -
 util/cbfstool/lzma/C/7zip/Common/OutBuffer.cpp     |  116 -
 util/cbfstool/lzma/C/7zip/Common/OutBuffer.h       |   64 -
 util/cbfstool/lzma/C/7zip/Common/StdAfx.h          |    9 -
 util/cbfstool/lzma/C/7zip/Common/StreamUtils.cpp   |   44 -
 util/cbfstool/lzma/C/7zip/Common/StreamUtils.h     |   11 -
 .../lzma/C/7zip/Compress/LZ/BinTree/BinTree.h      |   54 -
 .../lzma/C/7zip/Compress/LZ/BinTree/BinTree2.h     |   12 -
 .../lzma/C/7zip/Compress/LZ/BinTree/BinTree3.h     |   16 -
 .../lzma/C/7zip/Compress/LZ/BinTree/BinTree4.h     |   18 -
 .../lzma/C/7zip/Compress/LZ/BinTree/BinTreeMain.h  |  531 -----
 .../lzma/C/7zip/Compress/LZ/HashChain/HC4.h        |   19 -
 .../lzma/C/7zip/Compress/LZ/HashChain/HCMain.h     |    6 -
 .../lzma/C/7zip/Compress/LZ/IMatchFinder.h         |   33 -
 .../lzma/C/7zip/Compress/LZ/LZInWindow.cpp         |  105 -
 util/cbfstool/lzma/C/7zip/Compress/LZ/LZInWindow.h |   87 -
 util/cbfstool/lzma/C/7zip/Compress/LZ/StdAfx.h     |    6 -
 util/cbfstool/lzma/C/7zip/Compress/LZMA/LZMA.h     |   82 -
 .../lzma/C/7zip/Compress/LZMA/LZMAEncoder.cpp      | 1564 --------------
 .../lzma/C/7zip/Compress/LZMA/LZMAEncoder.h        |  411 ----
 util/cbfstool/lzma/C/7zip/Compress/LZMA/StdAfx.h   |    8 -
 .../lzma/C/7zip/Compress/RangeCoder/RangeCoder.h   |  205 --
 .../C/7zip/Compress/RangeCoder/RangeCoderBit.cpp   |   80 -
 .../C/7zip/Compress/RangeCoder/RangeCoderBit.h     |  120 --
 .../C/7zip/Compress/RangeCoder/RangeCoderBitTree.h |  161 --
 .../C/7zip/Compress/RangeCoder/RangeCoderOpt.h     |   31 -
 .../lzma/C/7zip/Compress/RangeCoder/StdAfx.h       |    6 -
 util/cbfstool/lzma/C/7zip/Decompress/LzmaDecode.c  |  588 -----
 util/cbfstool/lzma/C/7zip/Decompress/LzmaDecode.h  |  131 --
 util/cbfstool/lzma/C/7zip/ICoder.h                 |  163 --
 util/cbfstool/lzma/C/7zip/IStream.h                |   62 -
 util/cbfstool/lzma/C/Common/Alloc.cpp              |  118 -
 util/cbfstool/lzma/C/Common/Alloc.h                |   29 -
 util/cbfstool/lzma/C/Common/CRC.cpp                |   61 -
 util/cbfstool/lzma/C/Common/CRC.h                  |   36 -
 util/cbfstool/lzma/C/Common/Defs.h                 |   20 -
 util/cbfstool/lzma/C/Common/MyCom.h                |  203 --
 util/cbfstool/lzma/C/Common/MyGuidDef.h            |   54 -
 util/cbfstool/lzma/C/Common/MyInitGuid.h           |   13 -
 util/cbfstool/lzma/C/Common/MyUnknown.h            |   24 -
 util/cbfstool/lzma/C/Common/MyWindows.h            |  201 --
 util/cbfstool/lzma/C/Common/NewHandler.h           |   16 -
 util/cbfstool/lzma/C/Common/StdAfx.h               |    9 -
 util/cbfstool/lzma/C/Common/Types.h                |   19 -
 util/cbfstool/lzma/C/LGPL.txt                      |  504 -----
 util/cbfstool/lzma/C/LzFind.c                      |  761 +++++++
 util/cbfstool/lzma/C/LzFind.h                      |  115 +
 util/cbfstool/lzma/C/LzHash.h                      |   54 +
 util/cbfstool/lzma/C/LzmaDec.c                     |  999 +++++++++
 util/cbfstool/lzma/C/LzmaDec.h                     |  231 ++
 util/cbfstool/lzma/C/LzmaEnc.c                     | 2270 ++++++++++++++++++++
 util/cbfstool/lzma/C/LzmaEnc.h                     |   80 +
 util/cbfstool/lzma/C/ORIGIN                        |    3 -
 util/cbfstool/lzma/C/Types.h                       |  242 +++
 util/cbfstool/lzma/Makefile                        |   50 -
 util/cbfstool/lzma/Makefile.inc                    |   60 -
 util/cbfstool/lzma/ORIGIN                          |    8 +
 util/cbfstool/lzma/endian.hh                       |  178 ++
 util/cbfstool/lzma/lzma.cc                         |  842 ++++++++
 util/cbfstool/lzma/lzma.hh                         |  109 +
 util/cbfstool/lzma/minilzma.cc                     |  318 ---
 63 files changed, 5910 insertions(+), 6616 deletions(-)

diff --git a/util/cbfstool/Makefile b/util/cbfstool/Makefile
index 813ba1b..17b00a7 100644
--- a/util/cbfstool/Makefile
+++ b/util/cbfstool/Makefile
@@ -3,16 +3,15 @@ obj ?= $(shell pwd)
 HOSTCXX  ?= g++
 HOSTCC   ?= gcc
 CFLAGS   ?= -g -Wall
-CXXFLAGS +=-DCOMPACT $(CFLAGS)
-LDFLAGS  ?= -g
+CFLAGS   += -D_7ZIP_ST
 
 BINARY:=$(obj)/cbfstool
 
-COMMON:=common.o compress.o minilzma.o
-COMMON+=LZMAEncoder.o LZInWindow.o
-COMMON+=RangeCoderBit.o StreamUtils.o
-COMMON+=OutBuffer.o Alloc.o CRC.o
-COMMON+=cbfs-mkstage.o cbfs-mkpayload.o cbfstool.o
+COMMON:=cbfstool.o common.o compress.o
+COMMON+=cbfs-mkstage.o cbfs-mkpayload.o
+# LZMA
+COMMON+=lzma/lzma.o
+COMMON+=lzma/C/LzFind.o  lzma/C/LzmaDec.o  lzma/C/LzmaEnc.o
 
 COMMON:=$(addprefix $(obj)/,$(COMMON))
 
@@ -21,23 +20,8 @@ all: dep $(BINARY)
 $(obj)/%.o: %.c
 	$(HOSTCC) $(CFLAGS) -c -o $@ $<
 
-$(obj)/%.o: lzma/%.cc
-	$(HOSTCXX) $(CXXFLAGS) -c -o $@ $<
-
-$(obj)/%.o: lzma/C/7zip/Compress/LZMA/%.cpp
-	$(HOSTCXX) $(CXXFLAGS) -c -o $@ $<
-
-$(obj)/%.o: lzma/C/7zip/Compress/LZ/%.cpp
-	$(HOSTCXX) $(CXXFLAGS) -c -o $@ $<
-
-$(obj)/%.o: lzma/C/7zip/Compress/RangeCoder/%.cpp
-	$(HOSTCXX) $(CXXFLAGS) -c -o $@ $<
-
-$(obj)/%.o: lzma/C/7zip/Common/%.cpp
-	$(HOSTCXX) $(CXXFLAGS) -c -o $@ $<
-
-$(obj)/%.o: lzma/C/Common/%.cpp
-	$(HOSTCXX) $(CXXFLAGS) -c -o $@ $<
+$(obj)/%.o: %.cc
+	$(HOSTCXX) $(CFLAGS) -c -o $@ $<
 
 clean:
 	rm -f $(COMMON) $(BINARY)
@@ -46,14 +30,11 @@ tags:
 	ctags *.[ch]
 
 $(obj)/cbfstool:$(COMMON)
-	$(HOSTCXX) $(LDFLAGS) -o $@ $^
+	$(HOSTCXX) $(CFLAGS) -o $@ $^
 
 dep:
 	@$(HOSTCC) $(CFLAGS) -MM *.c > .dependencies
-	@$(HOSTCC) $(CFLAGS) -MM lzma/C/7zip/Decompress/*.c >> .dependencies
-	@$(HOSTCXX) $(CXXFLAGS) -MM lzma/C/7zip/Compress/*/*.cpp >> .dependencies
-	@$(HOSTCXX) $(CXXFLAGS) -MM lzma/C/7zip/Common/*.cpp >> .dependencies
-	@$(HOSTCXX) $(CXXFLAGS) -MM lzma/C/Common/*.cpp >> .dependencies
-	@$(HOSTCXX) $(CXXFLAGS) -MM lzma/*.cc >> .dependencies
+	@$(HOSTCC) $(CFLAGS) -MM lzma/*.cc >> .dependencies
+	@$(HOSTCC) $(CFLAGS) -MM lzma/C/*.c >> .dependencies
 
 -include .dependencies
diff --git a/util/cbfstool/Makefile.inc b/util/cbfstool/Makefile.inc
index f9aef2e..bb2fe35 100644
--- a/util/cbfstool/Makefile.inc
+++ b/util/cbfstool/Makefile.inc
@@ -1,19 +1,16 @@
 cbfsobj :=
+cbfsobj += cbfstool.o
 cbfsobj += common.o
 cbfsobj += compress.o
-cbfsobj += minilzma.o
-cbfsobj += LZMAEncoder.o
-cbfsobj += LZInWindow.o
-cbfsobj += RangeCoderBit.o
-cbfsobj += StreamUtils.o
-cbfsobj += OutBuffer.o
-cbfsobj += Alloc.o
-cbfsobj += CRC.o
 cbfsobj += cbfs-mkstage.o
 cbfsobj += cbfs-mkpayload.o
-cbfsobj += cbfstool.o
+# LZMA
+cbfsobj += lzma.o
+cbfsobj += LzFind.o
+cbfsobj += LzmaDec.o
+cbfsobj += LzmaEnc.o
 
-CBFSTOOLFLAGS=-DCOMPACT -g
+CBFSTOOLFLAGS=-D_7ZIP_ST -g
 
 ifeq ($(shell uname -s | cut -c-7 2>/dev/null), MINGW32)
 CBFSTOOLFLAGS+=-mno-ms-bitfields
@@ -30,25 +27,9 @@ $(objutil)/cbfstool/%.o: $(top)/util/cbfstool/lzma/%.cc
 	printf "    HOSTCXX    $(subst $(objutil)/,,$(@))\n"
 	$(HOSTCXX) $(CBFSTOOLFLAGS) $(HOSTCXXFLAGS) -c -o $@ $<
 
-$(objutil)/cbfstool/%.o: $(top)/util/cbfstool/lzma/C/7zip/Compress/LZMA/%.cpp
-	printf "    HOSTCXX    $(subst $(objutil)/,,$(@))\n"
-	$(HOSTCXX) $(CBFSTOOLFLAGS) $(HOSTCXXFLAGS) -c -o $@ $<
-
-$(objutil)/cbfstool/%.o: $(top)/util/cbfstool/lzma/C/7zip/Compress/LZ/%.cpp
-	printf "    HOSTCXX    $(subst $(objutil)/,,$(@))\n"
-	$(HOSTCXX) $(CBFSTOOLFLAGS) $(HOSTCXXFLAGS) -c -o $@ $<
-
-$(objutil)/cbfstool/%.o: $(top)/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/%.cpp
-	printf "    HOSTCXX    $(subst $(objutil)/,,$(@))\n"
-	$(HOSTCXX) $(CBFSTOOLFLAGS) $(HOSTCXXFLAGS) -c -o $@ $<
-
-$(objutil)/cbfstool/%.o: $(top)/util/cbfstool/lzma/C/7zip/Common/%.cpp
-	printf "    HOSTCXX    $(subst $(objutil)/,,$(@))\n"
-	$(HOSTCXX) $(CBFSTOOLFLAGS) $(HOSTCXXFLAGS) -c -o $@ $<
-
-$(objutil)/cbfstool/%.o: $(top)/util/cbfstool/lzma/C/Common/%.cpp
-	printf "    HOSTCXX    $(subst $(objutil)/,,$(@))\n"
-	$(HOSTCXX) $(CBFSTOOLFLAGS) $(HOSTCXXFLAGS) -c -o $@ $<
+$(objutil)/cbfstool/%.o: $(top)/util/cbfstool/lzma/C/%.c
+	printf "    HOSTCC    $(subst $(objutil)/,,$(@))\n"
+	$(HOSTCC) $(CBFSTOOLFLAGS) $(HOSTCFLAGS) -c -o $@ $<
 
 $(objutil)/cbfstool/cbfstool: $(objutil)/cbfstool $(addprefix $(objutil)/cbfstool/,$(cbfsobj))
 	printf "    HOSTCXX    $(subst $(objutil)/,,$(@)) (link)\n"
diff --git a/util/cbfstool/lzma/C/7zip/Common/InBuffer.h b/util/cbfstool/lzma/C/7zip/Common/InBuffer.h
deleted file mode 100644
index bfa4bc9..0000000
--- a/util/cbfstool/lzma/C/7zip/Common/InBuffer.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// InBuffer.h
-
-#ifndef __INBUFFER_H
-#define __INBUFFER_H
-
-#include "../IStream.h"
-#include "../../Common/MyCom.h"
-
-#ifndef _NO_EXCEPTIONS
-class CInBufferException
-{
-public:
-  HRESULT ErrorCode;
-  CInBufferException(HRESULT errorCode): ErrorCode(errorCode) {}
-};
-#endif
-
-class CInBuffer
-{
-  Byte *_buffer;
-  Byte *_bufferLimit;
-  Byte *_bufferBase;
-  CMyComPtr<ISequentialInStream> _stream;
-  UInt64 _processedSize;
-  UInt32 _bufferSize;
-  bool _wasFinished;
-
-  bool ReadBlock();
-  Byte ReadBlock2();
-
-public:
-  #ifdef _NO_EXCEPTIONS
-  HRESULT ErrorCode;
-  #endif
-
-  CInBuffer();
-  ~CInBuffer() { Free(); }
-
-  bool Create(UInt32 bufferSize);
-  void Free();
-
-  void SetStream(ISequentialInStream *stream);
-  void Init();
-  void ReleaseStream() { _stream.Release(); }
-
-  bool ReadByte(Byte &b)
-  {
-    if(_buffer >= _bufferLimit)
-      if(!ReadBlock())
-        return false;
-    b = *_buffer++;
-    return true;
-  }
-  Byte ReadByte()
-  {
-    if(_buffer >= _bufferLimit)
-      return ReadBlock2();
-    return *_buffer++;
-  }
-  void ReadBytes(void *data, UInt32 size, UInt32 &processedSize)
-  {
-    for(processedSize = 0; processedSize < size; processedSize++)
-      if (!ReadByte(((Byte *)data)[processedSize]))
-        return;
-  }
-  bool ReadBytes(void *data, UInt32 size)
-  {
-    UInt32 processedSize;
-    ReadBytes(data, size, processedSize);
-    return (processedSize == size);
-  }
-  UInt64 GetProcessedSize() const { return _processedSize + (_buffer - _bufferBase); }
-  bool WasFinished() const { return _wasFinished; }
-};
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Common/OutBuffer.cpp b/util/cbfstool/lzma/C/7zip/Common/OutBuffer.cpp
deleted file mode 100644
index b4c8b7e..0000000
--- a/util/cbfstool/lzma/C/7zip/Common/OutBuffer.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-// OutByte.cpp
-
-#include "StdAfx.h"
-
-#include "OutBuffer.h"
-
-#include "../../Common/Alloc.h"
-
-bool COutBuffer::Create(UInt32 bufferSize)
-{
-  const UInt32 kMinBlockSize = 1;
-  if (bufferSize < kMinBlockSize)
-    bufferSize = kMinBlockSize;
-  if (_buffer != 0 && _bufferSize == bufferSize)
-    return true;
-  Free();
-  _bufferSize = bufferSize;
-  _buffer = (Byte *)::MidAlloc(bufferSize);
-  return (_buffer != 0);
-}
-
-void COutBuffer::Free()
-{
-  ::MidFree(_buffer);
-  _buffer = 0;
-}
-
-void COutBuffer::SetStream(ISequentialOutStream *stream)
-{
-  _stream = stream;
-}
-
-void COutBuffer::Init()
-{
-  _streamPos = 0;
-  _limitPos = _bufferSize;
-  _pos = 0;
-  _processedSize = 0;
-  _overDict = false;
-  #ifdef _NO_EXCEPTIONS
-  ErrorCode = S_OK;
-  #endif
-}
-
-UInt64 COutBuffer::GetProcessedSize() const
-{
-  UInt64 res = _processedSize + _pos - _streamPos;
-  if (_streamPos > _pos)
-    res += _bufferSize;
-  return res;
-}
-
-
-HRESULT COutBuffer::FlushPart()
-{
-  // _streamPos < _bufferSize
-  UInt32 size = (_streamPos >= _pos) ? (_bufferSize - _streamPos) : (_pos - _streamPos);
-  HRESULT result = S_OK;
-  #ifdef _NO_EXCEPTIONS
-  result = ErrorCode;
-  #endif
-  if (_buffer2 != 0)
-  {
-    memmove(_buffer2, _buffer + _streamPos, size);
-    _buffer2 += size;
-  }
-
-  if (_stream != 0
-      #ifdef _NO_EXCEPTIONS
-      && (ErrorCode == S_OK)
-      #endif
-     )
-  {
-    UInt32 processedSize = 0;
-    result = _stream->Write(_buffer + _streamPos, size, &processedSize);
-    size = processedSize;
-  }
-  _streamPos += size;
-  if (_streamPos == _bufferSize)
-    _streamPos = 0;
-  if (_pos == _bufferSize)
-  {
-    _overDict = true;
-    _pos = 0;
-  }
-  _limitPos = (_streamPos > _pos) ? _streamPos : _bufferSize;
-  _processedSize += size;
-  return result;
-}
-
-HRESULT COutBuffer::Flush()
-{
-  #ifdef _NO_EXCEPTIONS
-  if (ErrorCode != S_OK)
-    return ErrorCode;
-  #endif
-
-  while(_streamPos != _pos)
-  {
-    HRESULT result = FlushPart();
-    if (result != S_OK)
-      return result;
-  }
-  return S_OK;
-}
-
-void COutBuffer::FlushWithCheck()
-{
-  HRESULT result = FlushPart();
-  #ifdef _NO_EXCEPTIONS
-  ErrorCode = result;
-  #else
-  if (result != S_OK)
-    throw COutBufferException(result);
-  #endif
-}
diff --git a/util/cbfstool/lzma/C/7zip/Common/OutBuffer.h b/util/cbfstool/lzma/C/7zip/Common/OutBuffer.h
deleted file mode 100644
index 659368b..0000000
--- a/util/cbfstool/lzma/C/7zip/Common/OutBuffer.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// OutBuffer.h
-
-#ifndef __OUTBUFFER_H
-#define __OUTBUFFER_H
-
-#include "../IStream.h"
-#include "../../Common/MyCom.h"
-
-#ifndef _NO_EXCEPTIONS
-struct COutBufferException
-{
-  HRESULT ErrorCode;
-  COutBufferException(HRESULT errorCode): ErrorCode(errorCode) {}
-};
-#endif
-
-class COutBuffer
-{
-protected:
-  Byte *_buffer;
-  UInt32 _pos;
-  UInt32 _limitPos;
-  UInt32 _streamPos;
-  UInt32 _bufferSize;
-  CMyComPtr<ISequentialOutStream> _stream;
-  UInt64 _processedSize;
-  Byte  *_buffer2;
-  bool _overDict;
-
-  HRESULT FlushPart();
-  void FlushWithCheck();
-public:
-  #ifdef _NO_EXCEPTIONS
-  HRESULT ErrorCode;
-  #endif
-
-  COutBuffer(): _buffer(0), _pos(0), _stream(0), _buffer2(0) {}
-  ~COutBuffer() { Free(); }
-
-  bool Create(UInt32 bufferSize);
-  void Free();
-
-  void SetMemStream(Byte *buffer) { _buffer2 = buffer; }
-  void SetStream(ISequentialOutStream *stream);
-  void Init();
-  HRESULT Flush();
-  void ReleaseStream() {  _stream.Release(); }
-
-  void WriteByte(Byte b)
-  {
-    _buffer[_pos++] = b;
-    if(_pos == _limitPos)
-      FlushWithCheck();
-  }
-  void WriteBytes(const void *data, size_t size)
-  {
-    for (size_t i = 0; i < size; i++)
-      WriteByte(((const Byte *)data)[i]);
-  }
-
-  UInt64 GetProcessedSize() const;
-};
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Common/StdAfx.h b/util/cbfstool/lzma/C/7zip/Common/StdAfx.h
deleted file mode 100644
index ef555ec..0000000
--- a/util/cbfstool/lzma/C/7zip/Common/StdAfx.h
+++ /dev/null
@@ -1,9 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../Common/MyWindows.h"
-#include "../../Common/NewHandler.h"
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Common/StreamUtils.cpp b/util/cbfstool/lzma/C/7zip/Common/StreamUtils.cpp
deleted file mode 100644
index f5d2da5..0000000
--- a/util/cbfstool/lzma/C/7zip/Common/StreamUtils.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-// StreamUtils.cpp
-
-#include "StdAfx.h"
-
-#include "../../Common/MyCom.h"
-#include "StreamUtils.h"
-
-HRESULT ReadStream(ISequentialInStream *stream, void *data, UInt32 size, UInt32 *processedSize)
-{
-  if (processedSize != 0)
-    *processedSize = 0;
-  while(size != 0)
-  {
-    UInt32 processedSizeLoc;
-    HRESULT res = stream->Read(data, size, &processedSizeLoc);
-    if (processedSize != 0)
-      *processedSize += processedSizeLoc;
-    data = (Byte *)((Byte *)data + processedSizeLoc);
-    size -= processedSizeLoc;
-    RINOK(res);
-    if (processedSizeLoc == 0)
-      return S_OK;
-  }
-  return S_OK;
-}
-
-HRESULT WriteStream(ISequentialOutStream *stream, const void *data, UInt32 size, UInt32 *processedSize)
-{
-  if (processedSize != 0)
-    *processedSize = 0;
-  while(size != 0)
-  {
-    UInt32 processedSizeLoc;
-    HRESULT res = stream->Write(data, size, &processedSizeLoc);
-    if (processedSize != 0)
-      *processedSize += processedSizeLoc;
-    data = (const void *)((const Byte *)data + processedSizeLoc);
-    size -= processedSizeLoc;
-    RINOK(res);
-    if (processedSizeLoc == 0)
-      break;
-  }
-  return S_OK;
-}
diff --git a/util/cbfstool/lzma/C/7zip/Common/StreamUtils.h b/util/cbfstool/lzma/C/7zip/Common/StreamUtils.h
deleted file mode 100644
index 59f8873..0000000
--- a/util/cbfstool/lzma/C/7zip/Common/StreamUtils.h
+++ /dev/null
@@ -1,11 +0,0 @@
-// StreamUtils.h
-
-#ifndef __STREAMUTILS_H
-#define __STREAMUTILS_H
-
-#include "../IStream.h"
-
-HRESULT ReadStream(ISequentialInStream *stream, void *data, UInt32 size, UInt32 *processedSize);
-HRESULT WriteStream(ISequentialOutStream *stream, const void *data, UInt32 size, UInt32 *processedSize);
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTree.h b/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTree.h
deleted file mode 100644
index 243d5a3..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTree.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// BinTree.h
-
-#include "../LZInWindow.h"
-#include "../IMatchFinder.h"
-
-namespace BT_NAMESPACE {
-
-typedef UInt32 CIndex;
-const UInt32 kMaxValForNormalize = (UInt32(1) << 31) - 1;
-
-class CMatchFinder:
-  public IMatchFinder,
-  public CLZInWindow,
-  public CMyUnknownImp,
-  public IMatchFinderSetNumPasses
-{
-  UInt32 _cyclicBufferPos;
-  UInt32 _cyclicBufferSize; // it must be historySize + 1
-  UInt32 _matchMaxLen;
-  CIndex *_hash;
-  CIndex *_son;
-  UInt32 _hashMask;
-  UInt32 _cutValue;
-  UInt32 _hashSizeSum;
-
-  void Normalize();
-  void FreeThisClassMemory();
-  void FreeMemory();
-
-  MY_UNKNOWN_IMP
-
-  STDMETHOD(SetStream)(ISequentialInStream *inStream);
-  STDMETHOD_(void, ReleaseStream)();
-  STDMETHOD(Init)();
-  HRESULT MovePos();
-  STDMETHOD_(Byte, GetIndexByte)(Int32 index);
-  STDMETHOD_(UInt32, GetMatchLen)(Int32 index, UInt32 back, UInt32 limit);
-  STDMETHOD_(UInt32, GetNumAvailableBytes)();
-  STDMETHOD_(const Byte *, GetPointerToCurrentPos)();
-  STDMETHOD_(Int32, NeedChangeBufferPos)(UInt32 numCheckBytes);
-  STDMETHOD_(void, ChangeBufferPos)();
-
-  STDMETHOD(Create)(UInt32 historySize, UInt32 keepAddBufferBefore,
-      UInt32 matchMaxLen, UInt32 keepAddBufferAfter);
-  STDMETHOD(GetMatches)(UInt32 *distances);
-  STDMETHOD(Skip)(UInt32 num);
-
-public:
-  CMatchFinder();
-  virtual ~CMatchFinder();
-  virtual void SetNumPasses(UInt32 numPasses) { _cutValue = numPasses; }
-};
-
-}
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTree2.h b/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTree2.h
deleted file mode 100644
index 74ca8d9..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTree2.h
+++ /dev/null
@@ -1,12 +0,0 @@
-// BinTree2.h
-
-#ifndef __BINTREE2_H
-#define __BINTREE2_H
-
-#define BT_NAMESPACE NBT2
-
-#include "BinTreeMain.h"
-
-#undef BT_NAMESPACE
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTree3.h b/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTree3.h
deleted file mode 100644
index 76bd9dd..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTree3.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// BinTree3.h
-
-#ifndef __BINTREE3_H
-#define __BINTREE3_H
-
-#define BT_NAMESPACE NBT3
-
-#define HASH_ARRAY_2
-
-#include "BinTreeMain.h"
-
-#undef HASH_ARRAY_2
-
-#undef BT_NAMESPACE
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTree4.h b/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTree4.h
deleted file mode 100644
index 08e2d1c..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTree4.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// BinTree4.h
-
-#ifndef __BINTREE4_H
-#define __BINTREE4_H
-
-#define BT_NAMESPACE NBT4
-
-#define HASH_ARRAY_2
-#define HASH_ARRAY_3
-
-#include "BinTreeMain.h"
-
-#undef HASH_ARRAY_2
-#undef HASH_ARRAY_3
-
-#undef BT_NAMESPACE
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTreeMain.h b/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTreeMain.h
deleted file mode 100644
index d47a03d..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZ/BinTree/BinTreeMain.h
+++ /dev/null
@@ -1,531 +0,0 @@
-// BinTreeMain.h
-
-#include "../../../../Common/Defs.h"
-#include "../../../../Common/CRC.h"
-#include "../../../../Common/Alloc.h"
-
-#include "BinTree.h"
-
-// #include <xmmintrin.h>
-// It's for prefetch
-// But prefetch doesn't give big gain in K8.
-
-namespace BT_NAMESPACE {
-
-#ifdef HASH_ARRAY_2
-  static const UInt32 kHash2Size = 1 << 10;
-  #define kNumHashDirectBytes 0
-  #ifdef HASH_ARRAY_3
-    static const UInt32 kNumHashBytes = 4;
-    static const UInt32 kHash3Size = 1 << 16;
-  #else
-    static const UInt32 kNumHashBytes = 3;
-  #endif
-  static const UInt32 kHashSize = 0;
-  static const UInt32 kMinMatchCheck = kNumHashBytes;
-  static const UInt32 kStartMaxLen = 1;
-#else
-  #ifdef HASH_ZIP
-    #define kNumHashDirectBytes 0
-    static const UInt32 kNumHashBytes = 3;
-    static const UInt32 kHashSize = 1 << 16;
-    static const UInt32 kMinMatchCheck = kNumHashBytes;
-    static const UInt32 kStartMaxLen = 1;
-  #else
-    #define kNumHashDirectBytes 2
-    static const UInt32 kNumHashBytes = 2;
-    static const UInt32 kHashSize = 1 << (8 * kNumHashBytes);
-    static const UInt32 kMinMatchCheck = kNumHashBytes + 1;
-    static const UInt32 kStartMaxLen = 1;
-  #endif
-#endif
-
-#ifdef HASH_ARRAY_2
-#ifdef HASH_ARRAY_3
-static const UInt32 kHash3Offset = kHash2Size;
-#endif
-#endif
-
-static const UInt32 kFixHashSize = 0
-    #ifdef HASH_ARRAY_2
-    + kHash2Size
-    #ifdef HASH_ARRAY_3
-    + kHash3Size
-    #endif
-    #endif
-    ;
-
-CMatchFinder::CMatchFinder():
-  _hash(0)
-{
-}
-
-void CMatchFinder::FreeThisClassMemory()
-{
-  BigFree(_hash);
-  _hash = 0;
-}
-
-void CMatchFinder::FreeMemory()
-{
-  FreeThisClassMemory();
-  CLZInWindow::Free();
-}
-
-CMatchFinder::~CMatchFinder()
-{
-  FreeMemory();
-}
-
-STDMETHODIMP CMatchFinder::Create(UInt32 historySize, UInt32 keepAddBufferBefore,
-    UInt32 matchMaxLen, UInt32 keepAddBufferAfter)
-{
-  if (historySize > kMaxValForNormalize - 256)
-  {
-    FreeMemory();
-    return E_INVALIDARG;
-  }
-  _cutValue =
-  #ifdef _HASH_CHAIN
-    8 + (matchMaxLen >> 2);
-  #else
-    16 + (matchMaxLen >> 1);
-  #endif
-  UInt32 sizeReserv = (historySize + keepAddBufferBefore +
-      matchMaxLen + keepAddBufferAfter) / 2 + 256;
-  if (CLZInWindow::Create(historySize + keepAddBufferBefore,
-      matchMaxLen + keepAddBufferAfter, sizeReserv))
-  {
-    _matchMaxLen = matchMaxLen;
-    UInt32 newCyclicBufferSize = historySize + 1;
-    if (_hash != 0 && newCyclicBufferSize == _cyclicBufferSize)
-      return S_OK;
-    FreeThisClassMemory();
-    _cyclicBufferSize = newCyclicBufferSize; // don't change it
-
-    UInt32 hs = kHashSize;
-
-    #ifdef HASH_ARRAY_2
-    hs = historySize - 1;
-    hs |= (hs >> 1);
-    hs |= (hs >> 2);
-    hs |= (hs >> 4);
-    hs |= (hs >> 8);
-    hs >>= 1;
-    hs |= 0xFFFF;
-    if (hs > (1 << 24))
-    {
-      #ifdef HASH_ARRAY_3
-      hs >>= 1;
-      #else
-      hs = (1 << 24) - 1;
-      #endif
-    }
-    _hashMask = hs;
-    hs++;
-    #endif
-    _hashSizeSum = hs + kFixHashSize;
-    UInt32 numItems = _hashSizeSum + _cyclicBufferSize
-    #ifndef _HASH_CHAIN
-     * 2
-    #endif
-    ;
-    size_t sizeInBytes = (size_t)numItems * sizeof(CIndex);
-    if (sizeInBytes / sizeof(CIndex) != numItems)
-      return E_OUTOFMEMORY;
-    _hash = (CIndex *)BigAlloc(sizeInBytes);
-    _son = _hash + _hashSizeSum;
-    if (_hash != 0)
-      return S_OK;
-  }
-  FreeMemory();
-  return E_OUTOFMEMORY;
-}
-
-static const UInt32 kEmptyHashValue = 0;
-
-STDMETHODIMP CMatchFinder::SetStream(ISequentialInStream *stream)
-{
-  CLZInWindow::SetStream(stream);
-  return S_OK;
-}
-
-STDMETHODIMP CMatchFinder::Init()
-{
-  RINOK(CLZInWindow::Init());
-  for(UInt32 i = 0; i < _hashSizeSum; i++)
-    _hash[i] = kEmptyHashValue;
-  _cyclicBufferPos = 0;
-  ReduceOffsets(-1);
-  return S_OK;
-}
-
-STDMETHODIMP_(void) CMatchFinder::ReleaseStream()
-{
-  // ReleaseStream();
-}
-
-#ifdef HASH_ARRAY_2
-#ifdef HASH_ARRAY_3
-
-#define HASH_CALC { \
-  UInt32 temp = CCRC::Table[cur[0]] ^ cur[1]; \
-  hash2Value = temp & (kHash2Size - 1); \
-  hash3Value = (temp ^ (UInt32(cur[2]) << 8)) & (kHash3Size - 1); \
-  hashValue = (temp ^ (UInt32(cur[2]) << 8) ^ (CCRC::Table[cur[3]] << 5)) & _hashMask; }
-
-#else // no HASH_ARRAY_3
-#define HASH_CALC { \
-  UInt32 temp = CCRC::Table[cur[0]] ^ cur[1]; \
-  hash2Value = temp & (kHash2Size - 1); \
-  hashValue = (temp ^ (UInt32(cur[2]) << 8)) & _hashMask; }
-#endif // HASH_ARRAY_3
-#else // no HASH_ARRAY_2
-#ifdef HASH_ZIP
-inline UInt32 Hash(const Byte *pointer)
-{
-  return ((UInt32(pointer[0]) << 8) ^ CCRC::Table[pointer[1]] ^ pointer[2]) & (kHashSize - 1);
-}
-#else // no HASH_ZIP
-inline UInt32 Hash(const Byte *pointer)
-{
-  return pointer[0] ^ (UInt32(pointer[1]) << 8);
-}
-#endif // HASH_ZIP
-#endif // HASH_ARRAY_2
-
-STDMETHODIMP CMatchFinder::GetMatches(UInt32 *distances)
-{
-  UInt32 lenLimit;
-  if (_pos + _matchMaxLen <= _streamPos)
-    lenLimit = _matchMaxLen;
-  else
-  {
-    lenLimit = _streamPos - _pos;
-    if(lenLimit < kMinMatchCheck)
-    {
-      distances[0] = 0;
-      return MovePos();
-    }
-  }
-
-  int offset = 1;
-
-  UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0;
-  const Byte *cur = _buffer + _pos;
-
-  UInt32 maxLen = kStartMaxLen; // to avoid items for len < hashSize;
-
-  #ifdef HASH_ARRAY_2
-  UInt32 hash2Value;
-  #ifdef HASH_ARRAY_3
-  UInt32 hash3Value;
-  #endif
-  UInt32 hashValue;
-  HASH_CALC;
-  #else
-  UInt32 hashValue = Hash(cur);
-  #endif
-
-  UInt32 curMatch = _hash[kFixHashSize + hashValue];
-  #ifdef HASH_ARRAY_2
-  UInt32 curMatch2 = _hash[hash2Value];
-  #ifdef HASH_ARRAY_3
-  UInt32 curMatch3 = _hash[kHash3Offset + hash3Value];
-  #endif
-  _hash[hash2Value] = _pos;
-  if(curMatch2 > matchMinPos)
-    if (_buffer[curMatch2] == cur[0])
-    {
-      distances[offset++] = maxLen = 2;
-      distances[offset++] = _pos - curMatch2 - 1;
-    }
-
-  #ifdef HASH_ARRAY_3
-  _hash[kHash3Offset + hash3Value] = _pos;
-  if(curMatch3 > matchMinPos)
-    if (_buffer[curMatch3] == cur[0])
-    {
-      if (curMatch3 == curMatch2)
-        offset -= 2;
-      distances[offset++] = maxLen = 3;
-      distances[offset++] = _pos - curMatch3 - 1;
-      curMatch2 = curMatch3;
-    }
-  #endif
-  if (offset != 1 && curMatch2 == curMatch)
-  {
-    offset -= 2;
-    maxLen = kStartMaxLen;
-  }
-  #endif
-
-  _hash[kFixHashSize + hashValue] = _pos;
-
-  CIndex *son = _son;
-
-  #ifdef _HASH_CHAIN
-  son[_cyclicBufferPos] = curMatch;
-  #else
-  CIndex *ptr0 = son + (_cyclicBufferPos << 1) + 1;
-  CIndex *ptr1 = son + (_cyclicBufferPos << 1);
-
-  UInt32 len0, len1;
-  len0 = len1 = kNumHashDirectBytes;
-  #endif
-
-  #if kNumHashDirectBytes != 0
-  if(curMatch > matchMinPos)
-  {
-    if (_buffer[curMatch + kNumHashDirectBytes] != cur[kNumHashDirectBytes])
-    {
-      distances[offset++] = maxLen = kNumHashDirectBytes;
-      distances[offset++] = _pos - curMatch - 1;
-    }
-  }
-  #endif
-  UInt32 count = _cutValue;
-  while(true)
-  {
-    if(curMatch <= matchMinPos || count-- == 0)
-    {
-      #ifndef _HASH_CHAIN
-      *ptr0 = *ptr1 = kEmptyHashValue;
-      #endif
-      break;
-    }
-    UInt32 delta = _pos - curMatch;
-    UInt32 cyclicPos = (delta <= _cyclicBufferPos) ?
-        (_cyclicBufferPos - delta):
-        (_cyclicBufferPos - delta + _cyclicBufferSize);
-    CIndex *pair = son +
-    #ifdef _HASH_CHAIN
-      cyclicPos;
-    #else
-      (cyclicPos << 1);
-    #endif
-
-    // _mm_prefetch((const char *)pair, _MM_HINT_T0);
-
-    const Byte *pb = _buffer + curMatch;
-    UInt32 len =
-    #ifdef _HASH_CHAIN
-    kNumHashDirectBytes;
-    if (pb[maxLen] == cur[maxLen])
-    #else
-    MyMin(len0, len1);
-    #endif
-    if (pb[len] == cur[len])
-    {
-      while(++len != lenLimit)
-        if (pb[len] != cur[len])
-          break;
-      if (maxLen < len)
-      {
-        distances[offset++] = maxLen = len;
-        distances[offset++] = delta - 1;
-        if (len == lenLimit)
-        {
-          #ifndef _HASH_CHAIN
-          *ptr1 = pair[0];
-          *ptr0 = pair[1];
-          #endif
-          break;
-        }
-      }
-    }
-    #ifdef _HASH_CHAIN
-    curMatch = *pair;
-    #else
-    if (pb[len] < cur[len])
-    {
-      *ptr1 = curMatch;
-      ptr1 = pair + 1;
-      curMatch = *ptr1;
-      len1 = len;
-    }
-    else
-    {
-      *ptr0 = curMatch;
-      ptr0 = pair;
-      curMatch = *ptr0;
-      len0 = len;
-    }
-    #endif
-  }
-  distances[0] = offset - 1;
-  if (++_cyclicBufferPos == _cyclicBufferSize)
-    _cyclicBufferPos = 0;
-  RINOK(CLZInWindow::MovePos());
-  if (_pos == kMaxValForNormalize)
-    Normalize();
-  return S_OK;
-}
-
-STDMETHODIMP CMatchFinder::Skip(UInt32 num)
-{
-  do
-  {
-  #ifdef _HASH_CHAIN
-  if (_streamPos - _pos < kNumHashBytes)
-  {
-    RINOK(MovePos());
-    continue;
-  }
-  #else
-  UInt32 lenLimit;
-  if (_pos + _matchMaxLen <= _streamPos)
-    lenLimit = _matchMaxLen;
-  else
-  {
-    lenLimit = _streamPos - _pos;
-    if(lenLimit < kMinMatchCheck)
-    {
-      RINOK(MovePos());
-      continue;
-    }
-  }
-  UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0;
-  #endif
-  const Byte *cur = _buffer + _pos;
-
-  #ifdef HASH_ARRAY_2
-  UInt32 hash2Value;
-  #ifdef HASH_ARRAY_3
-  UInt32 hash3Value;
-  UInt32 hashValue;
-  HASH_CALC;
-  _hash[kHash3Offset + hash3Value] = _pos;
-  #else
-  UInt32 hashValue;
-  HASH_CALC;
-  #endif
-  _hash[hash2Value] = _pos;
-  #else
-  UInt32 hashValue = Hash(cur);
-  #endif
-
-  UInt32 curMatch = _hash[kFixHashSize + hashValue];
-  _hash[kFixHashSize + hashValue] = _pos;
-
-  #ifdef _HASH_CHAIN
-  _son[_cyclicBufferPos] = curMatch;
-  #else
-  CIndex *son = _son;
-  CIndex *ptr0 = son + (_cyclicBufferPos << 1) + 1;
-  CIndex *ptr1 = son + (_cyclicBufferPos << 1);
-
-  UInt32 len0, len1;
-  len0 = len1 = kNumHashDirectBytes;
-  UInt32 count = _cutValue;
-  while(true)
-  {
-    if(curMatch <= matchMinPos || count-- == 0)
-    {
-      *ptr0 = *ptr1 = kEmptyHashValue;
-      break;
-    }
-
-    UInt32 delta = _pos - curMatch;
-    UInt32 cyclicPos = (delta <= _cyclicBufferPos) ?
-      (_cyclicBufferPos - delta):
-      (_cyclicBufferPos - delta + _cyclicBufferSize);
-    CIndex *pair = son + (cyclicPos << 1);
-
-    // _mm_prefetch((const char *)pair, _MM_HINT_T0);
-
-    const Byte *pb = _buffer + curMatch;
-    UInt32 len = MyMin(len0, len1);
-
-    if (pb[len] == cur[len])
-    {
-      while(++len != lenLimit)
-        if (pb[len] != cur[len])
-          break;
-      if (len == lenLimit)
-      {
-        *ptr1 = pair[0];
-        *ptr0 = pair[1];
-        break;
-      }
-    }
-    if (pb[len] < cur[len])
-    {
-      *ptr1 = curMatch;
-      ptr1 = pair + 1;
-      curMatch = *ptr1;
-      len1 = len;
-    }
-    else
-    {
-      *ptr0 = curMatch;
-      ptr0 = pair;
-      curMatch = *ptr0;
-      len0 = len;
-    }
-  }
-  #endif
-  if (++_cyclicBufferPos == _cyclicBufferSize)
-    _cyclicBufferPos = 0;
-  RINOK(CLZInWindow::MovePos());
-  if (_pos == kMaxValForNormalize)
-    Normalize();
-  }
-  while(--num != 0);
-  return S_OK;
-}
-
-void CMatchFinder::Normalize()
-{
-  UInt32 subValue = _pos - _cyclicBufferSize;
-  CIndex *items = _hash;
-  UInt32 numItems = (_hashSizeSum + _cyclicBufferSize
-    #ifndef _HASH_CHAIN
-     * 2
-    #endif
-    );
-  for (UInt32 i = 0; i < numItems; i++)
-  {
-    UInt32 value = items[i];
-    if (value <= subValue)
-      value = kEmptyHashValue;
-    else
-      value -= subValue;
-    items[i] = value;
-  }
-  ReduceOffsets(subValue);
-}
-
-HRESULT CMatchFinder::MovePos()
-{
-  if (++_cyclicBufferPos == _cyclicBufferSize)
-    _cyclicBufferPos = 0;
-  RINOK(CLZInWindow::MovePos());
-  if (_pos == kMaxValForNormalize)
-    Normalize();
-  return S_OK;
-}
-
-STDMETHODIMP_(Byte) CMatchFinder::GetIndexByte(Int32 index)
-  { return CLZInWindow::GetIndexByte(index); }
-
-STDMETHODIMP_(UInt32) CMatchFinder::GetMatchLen(Int32 index,
-    UInt32 back, UInt32 limit)
-  { return CLZInWindow::GetMatchLen(index, back, limit); }
-
-STDMETHODIMP_(UInt32) CMatchFinder::GetNumAvailableBytes()
-  { return CLZInWindow::GetNumAvailableBytes(); }
-
-STDMETHODIMP_(const Byte *) CMatchFinder::GetPointerToCurrentPos()
-  { return CLZInWindow::GetPointerToCurrentPos(); }
-
-STDMETHODIMP_(Int32) CMatchFinder::NeedChangeBufferPos(UInt32 numCheckBytes)
-  { return CLZInWindow::NeedMove(numCheckBytes) ? 1: 0; }
-
-STDMETHODIMP_(void) CMatchFinder::ChangeBufferPos()
-  { CLZInWindow::MoveBlock();}
-
-#undef HASH_CALC
-#undef kNumHashDirectBytes
-
-}
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZ/HashChain/HC4.h b/util/cbfstool/lzma/C/7zip/Compress/LZ/HashChain/HC4.h
deleted file mode 100644
index 1fda4ac..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZ/HashChain/HC4.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// HC4.h
-
-#ifndef __HC4_H
-#define __HC4_H
-
-#define BT_NAMESPACE NHC4
-
-#define HASH_ARRAY_2
-#define HASH_ARRAY_3
-
-#include "HCMain.h"
-
-#undef HASH_ARRAY_2
-#undef HASH_ARRAY_3
-
-#undef BT_NAMESPACE
-
-#endif
-
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZ/HashChain/HCMain.h b/util/cbfstool/lzma/C/7zip/Compress/LZ/HashChain/HCMain.h
deleted file mode 100644
index d509bef..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZ/HashChain/HCMain.h
+++ /dev/null
@@ -1,6 +0,0 @@
-// HCMain.h
-
-#define _HASH_CHAIN
-#include "../BinTree/BinTreeMain.h"
-#undef _HASH_CHAIN
-
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZ/IMatchFinder.h b/util/cbfstool/lzma/C/7zip/Compress/LZ/IMatchFinder.h
deleted file mode 100644
index 53b9c1ec..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZ/IMatchFinder.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// MatchFinders/IMatchFinder.h
-
-#ifndef __IMATCHFINDER_H
-#define __IMATCHFINDER_H
-
-struct IInWindowStream: public IUnknown
-{
-  STDMETHOD(SetStream)(ISequentialInStream *inStream) PURE;
-  STDMETHOD_(void, ReleaseStream)() PURE;
-  STDMETHOD(Init)() PURE;
-  STDMETHOD_(Byte, GetIndexByte)(Int32 index) PURE;
-  STDMETHOD_(UInt32, GetMatchLen)(Int32 index, UInt32 distance, UInt32 limit) PURE;
-  STDMETHOD_(UInt32, GetNumAvailableBytes)() PURE;
-  STDMETHOD_(const Byte *, GetPointerToCurrentPos)() PURE;
-  STDMETHOD_(Int32, NeedChangeBufferPos)(UInt32 numCheckBytes) PURE;
-  STDMETHOD_(void, ChangeBufferPos)() PURE;
-};
-
-struct IMatchFinder: public IInWindowStream
-{
-  STDMETHOD(Create)(UInt32 historySize, UInt32 keepAddBufferBefore,
-      UInt32 matchMaxLen, UInt32 keepAddBufferAfter) PURE;
-  STDMETHOD(GetMatches)(UInt32 *distances) PURE;
-  STDMETHOD(Skip)(UInt32 num) PURE;
-};
-
-struct IMatchFinderSetNumPasses
-{
-  virtual ~IMatchFinderSetNumPasses(){}
-  virtual void SetNumPasses(UInt32 numPasses) PURE;
-};
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZ/LZInWindow.cpp b/util/cbfstool/lzma/C/7zip/Compress/LZ/LZInWindow.cpp
deleted file mode 100644
index c4d331e..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZ/LZInWindow.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-// LZInWindow.cpp
-
-#include "StdAfx.h"
-
-#include "LZInWindow.h"
-#include "../../../Common/MyCom.h"
-#include "../../../Common/Alloc.h"
-
-void CLZInWindow::Free()
-{
-  ::BigFree(_bufferBase);
-  _bufferBase = 0;
-}
-
-bool CLZInWindow::Create(UInt32 keepSizeBefore, UInt32 keepSizeAfter, UInt32 keepSizeReserv)
-{
-  _keepSizeBefore = keepSizeBefore;
-  _keepSizeAfter = keepSizeAfter;
-  UInt32 blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv;
-  if (_bufferBase == 0 || _blockSize != blockSize)
-  {
-    Free();
-    _blockSize = blockSize;
-    if (_blockSize != 0)
-      _bufferBase = (Byte *)::BigAlloc(_blockSize);
-  }
-  _pointerToLastSafePosition = _bufferBase + _blockSize - keepSizeAfter;
-  if (_blockSize == 0)
-    return true;
-  return (_bufferBase != 0);
-}
-
-void CLZInWindow::SetStream(ISequentialInStream *stream)
-{
-  _stream = stream;
-}
-
-HRESULT CLZInWindow::Init()
-{
-  _buffer = _bufferBase;
-  _pos = 0;
-  _streamPos = 0;
-  _streamEndWasReached = false;
-  return ReadBlock();
-}
-
-/*
-void CLZInWindow::ReleaseStream()
-{
-  _stream.Release();
-}
-*/
-
-///////////////////////////////////////////
-// ReadBlock
-
-// In State:
-//   (_buffer + _streamPos) <= (_bufferBase + _blockSize)
-// Out State:
-//   _posLimit <= _blockSize - _keepSizeAfter;
-//   if(_streamEndWasReached == false):
-//     _streamPos >= _pos + _keepSizeAfter
-//     _posLimit = _streamPos - _keepSizeAfter;
-//   else
-//
-
-HRESULT CLZInWindow::ReadBlock()
-{
-  if(_streamEndWasReached)
-    return S_OK;
-  while(true)
-  {
-    UInt32 size = (UInt32)(_bufferBase - _buffer) + _blockSize - _streamPos;
-    if(size == 0)
-      return S_OK;
-    UInt32 numReadBytes;
-    RINOK(_stream->Read(_buffer + _streamPos, size, &numReadBytes));
-    if(numReadBytes == 0)
-    {
-      _posLimit = _streamPos;
-      const Byte *pointerToPostion = _buffer + _posLimit;
-      if(pointerToPostion > _pointerToLastSafePosition)
-        _posLimit = (UInt32)(_pointerToLastSafePosition - _buffer);
-      _streamEndWasReached = true;
-      return S_OK;
-    }
-    _streamPos += numReadBytes;
-    if(_streamPos >= _pos + _keepSizeAfter)
-    {
-      _posLimit = _streamPos - _keepSizeAfter;
-      return S_OK;
-    }
-  }
-}
-
-void CLZInWindow::MoveBlock()
-{
-  UInt32 offset = (UInt32)(_buffer - _bufferBase) + _pos - _keepSizeBefore;
-  // we need one additional byte, since MovePos moves on 1 byte.
-  if (offset > 0)
-    offset--;
-  UInt32 numBytes = (UInt32)(_buffer - _bufferBase) + _streamPos -  offset;
-  memmove(_bufferBase, _bufferBase + offset, numBytes);
-  _buffer -= offset;
-}
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZ/LZInWindow.h b/util/cbfstool/lzma/C/7zip/Compress/LZ/LZInWindow.h
deleted file mode 100644
index 670a570..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZ/LZInWindow.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// LZInWindow.h
-
-#ifndef __LZ_IN_WINDOW_H
-#define __LZ_IN_WINDOW_H
-
-#include "../../IStream.h"
-
-class CLZInWindow
-{
-  Byte *_bufferBase; // pointer to buffer with data
-  ISequentialInStream *_stream;
-  UInt32 _posLimit;  // offset (from _buffer) when new block reading must be done
-  bool _streamEndWasReached; // if (true) then _streamPos shows real end of stream
-  const Byte *_pointerToLastSafePosition;
-protected:
-  Byte  *_buffer;   // Pointer to virtual Buffer begin
-  UInt32 _blockSize;  // Size of Allocated memory block
-  UInt32 _pos;             // offset (from _buffer) of curent byte
-  UInt32 _keepSizeBefore;  // how many BYTEs must be kept in buffer before _pos
-  UInt32 _keepSizeAfter;   // how many BYTEs must be kept buffer after _pos
-  UInt32 _streamPos;   // offset (from _buffer) of first not read byte from Stream
-
-  void MoveBlock();
-  HRESULT ReadBlock();
-  void Free();
-public:
-  CLZInWindow(): _bufferBase(0) {}
-  virtual ~CLZInWindow() { Free(); }
-
-  // keepSizeBefore + keepSizeAfter + keepSizeReserv < 4G)
-  bool Create(UInt32 keepSizeBefore, UInt32 keepSizeAfter, UInt32 keepSizeReserv = (1<<17));
-
-  void SetStream(ISequentialInStream *stream);
-  HRESULT Init();
-  // void ReleaseStream();
-
-  Byte *GetBuffer() const { return _buffer; }
-
-  const Byte *GetPointerToCurrentPos() const { return _buffer + _pos; }
-
-  HRESULT MovePos()
-  {
-    _pos++;
-    if (_pos > _posLimit)
-    {
-      const Byte *pointerToPostion = _buffer + _pos;
-      if(pointerToPostion > _pointerToLastSafePosition)
-        MoveBlock();
-      return ReadBlock();
-    }
-    else
-      return S_OK;
-  }
-  Byte GetIndexByte(Int32 index) const  {  return _buffer[(size_t)_pos + index]; }
-
-  // index + limit have not to exceed _keepSizeAfter;
-  // -2G <= index < 2G
-  UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit) const
-  {
-    if(_streamEndWasReached)
-      if ((_pos + index) + limit > _streamPos)
-        limit = _streamPos - (_pos + index);
-    distance++;
-    const Byte *pby = _buffer + (size_t)_pos + index;
-    UInt32 i;
-    for(i = 0; i < limit && pby[i] == pby[(size_t)i - distance]; i++);
-    return i;
-  }
-
-  UInt32 GetNumAvailableBytes() const { return _streamPos - _pos; }
-
-  void ReduceOffsets(Int32 subValue)
-  {
-    _buffer += subValue;
-    _posLimit -= subValue;
-    _pos -= subValue;
-    _streamPos -= subValue;
-  }
-
-  bool NeedMove(UInt32 numCheckBytes)
-  {
-    UInt32 reserv = _pointerToLastSafePosition - (_buffer + _pos);
-    return (reserv <= numCheckBytes);
-  }
-};
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZ/StdAfx.h b/util/cbfstool/lzma/C/7zip/Compress/LZ/StdAfx.h
deleted file mode 100644
index b637fd4..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZ/StdAfx.h
+++ /dev/null
@@ -1,6 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZMA/LZMA.h b/util/cbfstool/lzma/C/7zip/Compress/LZMA/LZMA.h
deleted file mode 100644
index e262aa2..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZMA/LZMA.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// LZMA.h
-
-#ifndef __LZMA_H
-#define __LZMA_H
-
-namespace NCompress {
-namespace NLZMA {
-
-const UInt32 kNumRepDistances = 4;
-
-const int kNumStates = 12;
-
-const Byte kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4,  5,  6,   4, 5};
-const Byte kMatchNextStates[kNumStates]   = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10};
-const Byte kRepNextStates[kNumStates]     = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11};
-const Byte kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11};
-
-class CState
-{
-public:
-  Byte Index;
-  void Init() { Index = 0; }
-  void UpdateChar() { Index = kLiteralNextStates[Index]; }
-  void UpdateMatch() { Index = kMatchNextStates[Index]; }
-  void UpdateRep() { Index = kRepNextStates[Index]; }
-  void UpdateShortRep() { Index = kShortRepNextStates[Index]; }
-  bool IsCharState() const { return Index < 7; }
-};
-
-const int kNumPosSlotBits = 6;
-const int kDicLogSizeMin = 0;
-const int kDicLogSizeMax = 32;
-const int kDistTableSizeMax = kDicLogSizeMax * 2;
-
-const UInt32 kNumLenToPosStates = 4;
-
-inline UInt32 GetLenToPosState(UInt32 len)
-{
-  len -= 2;
-  if (len < kNumLenToPosStates)
-    return len;
-  return kNumLenToPosStates - 1;
-}
-
-namespace NLength {
-
-const int kNumPosStatesBitsMax = 4;
-const UInt32 kNumPosStatesMax = (1 << kNumPosStatesBitsMax);
-
-const int kNumPosStatesBitsEncodingMax = 4;
-const UInt32 kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax);
-
-const int kNumLowBits = 3;
-const int kNumMidBits = 3;
-const int kNumHighBits = 8;
-const UInt32 kNumLowSymbols = 1 << kNumLowBits;
-const UInt32 kNumMidSymbols = 1 << kNumMidBits;
-const UInt32 kNumSymbolsTotal = kNumLowSymbols + kNumMidSymbols + (1 << kNumHighBits);
-
-}
-
-const UInt32 kMatchMinLen = 2;
-const UInt32 kMatchMaxLen = kMatchMinLen + NLength::kNumSymbolsTotal - 1;
-
-const int kNumAlignBits = 4;
-const UInt32 kAlignTableSize = 1 << kNumAlignBits;
-const UInt32 kAlignMask = (kAlignTableSize - 1);
-
-const UInt32 kStartPosModelIndex = 4;
-const UInt32 kEndPosModelIndex = 14;
-const UInt32 kNumPosModels = kEndPosModelIndex - kStartPosModelIndex;
-
-const UInt32 kNumFullDistances = 1 << (kEndPosModelIndex / 2);
-
-const int kNumLitPosStatesBitsEncodingMax = 4;
-const int kNumLitContextBitsMax = 8;
-
-const int kNumMoveBits = 5;
-
-}}
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZMA/LZMAEncoder.cpp b/util/cbfstool/lzma/C/7zip/Compress/LZMA/LZMAEncoder.cpp
deleted file mode 100644
index 1fff04aa..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZMA/LZMAEncoder.cpp
+++ /dev/null
@@ -1,1564 +0,0 @@
-// LZMA/Encoder.cpp
-
-#include "StdAfx.h"
-
-#include "../../../Common/Defs.h"
-#include "../../Common/StreamUtils.h"
-
-#include "LZMAEncoder.h"
-
-// for minimal compressing code size define these:
-// #define COMPRESS_MF_BT
-// #define COMPRESS_MF_BT4
-
-#if !defined(COMPRESS_MF_BT) && !defined(COMPRESS_MF_HC)
-#define COMPRESS_MF_BT
-#define COMPRESS_MF_HC
-#endif
-
-#ifdef COMPRESS_MF_BT
-#if !defined(COMPRESS_MF_BT2) && !defined(COMPRESS_MF_BT3) && !defined(COMPRESS_MF_BT4)
-#define COMPRESS_MF_BT2
-#define COMPRESS_MF_BT3
-#define COMPRESS_MF_BT4
-#endif
-#ifdef COMPRESS_MF_BT2
-#include "../LZ/BinTree/BinTree2.h"
-#endif
-#ifdef COMPRESS_MF_BT3
-#include "../LZ/BinTree/BinTree3.h"
-#endif
-#ifdef COMPRESS_MF_BT4
-#include "../LZ/BinTree/BinTree4.h"
-#endif
-#endif
-
-#ifdef COMPRESS_MF_HC
-#include "../LZ/HashChain/HC4.h"
-#endif
-
-#ifdef COMPRESS_MF_MT
-#include "../LZ/MT/MT.h"
-#endif
-
-namespace NCompress {
-namespace NLZMA {
-
-const int kDefaultDictionaryLogSize = 22;
-const UInt32 kNumFastBytesDefault = 0x20;
-
-enum
-{
-  kBT2,
-  kBT3,
-  kBT4,
-  kHC4
-};
-
-static const wchar_t *kMatchFinderIDs[] =
-{
-  L"BT2",
-  L"BT3",
-  L"BT4",
-  L"HC4"
-};
-
-Byte g_FastPos[1 << 11];
-
-class CFastPosInit
-{
-public:
-  CFastPosInit() { Init(); }
-  void Init()
-  {
-    const Byte kFastSlots = 22;
-    int c = 2;
-    g_FastPos[0] = 0;
-    g_FastPos[1] = 1;
-
-    for (Byte slotFast = 2; slotFast < kFastSlots; slotFast++)
-    {
-      UInt32 k = (1 << ((slotFast >> 1) - 1));
-      for (UInt32 j = 0; j < k; j++, c++)
-        g_FastPos[c] = slotFast;
-    }
-  }
-} g_FastPosInit;
-
-
-void CLiteralEncoder2::Encode(NRangeCoder::CEncoder *rangeEncoder, Byte symbol)
-{
-  UInt32 context = 1;
-  int i = 8;
-  do
-  {
-    i--;
-    UInt32 bit = (symbol >> i) & 1;
-    _encoders[context].Encode(rangeEncoder, bit);
-    context = (context << 1) | bit;
-  }
-  while(i != 0);
-}
-
-void CLiteralEncoder2::EncodeMatched(NRangeCoder::CEncoder *rangeEncoder,
-    Byte matchByte, Byte symbol)
-{
-  UInt32 context = 1;
-  int i = 8;
-  do
-  {
-    i--;
-    UInt32 bit = (symbol >> i) & 1;
-    UInt32 matchBit = (matchByte >> i) & 1;
-    _encoders[0x100 + (matchBit << 8) + context].Encode(rangeEncoder, bit);
-    context = (context << 1) | bit;
-    if (matchBit != bit)
-    {
-      while(i != 0)
-      {
-        i--;
-        UInt32 bit = (symbol >> i) & 1;
-        _encoders[context].Encode(rangeEncoder, bit);
-        context = (context << 1) | bit;
-      }
-      break;
-    }
-  }
-  while(i != 0);
-}
-
-UInt32 CLiteralEncoder2::GetPrice(bool matchMode, Byte matchByte, Byte symbol) const
-{
-  UInt32 price = 0;
-  UInt32 context = 1;
-  int i = 8;
-  if (matchMode)
-  {
-    do
-    {
-      i--;
-      UInt32 matchBit = (matchByte >> i) & 1;
-      UInt32 bit = (symbol >> i) & 1;
-      price += _encoders[0x100 + (matchBit << 8) + context].GetPrice(bit);
-      context = (context << 1) | bit;
-      if (matchBit != bit)
-        break;
-    }
-    while (i != 0);
-  }
-  while(i != 0)
-  {
-    i--;
-    UInt32 bit = (symbol >> i) & 1;
-    price += _encoders[context].GetPrice(bit);
-    context = (context << 1) | bit;
-  }
-  return price;
-};
-
-
-namespace NLength {
-
-void CEncoder::Init(UInt32 numPosStates)
-{
-  _choice.Init();
-  _choice2.Init();
-  for (UInt32 posState = 0; posState < numPosStates; posState++)
-  {
-    _lowCoder[posState].Init();
-    _midCoder[posState].Init();
-  }
-  _highCoder.Init();
-}
-
-void CEncoder::Encode(NRangeCoder::CEncoder *rangeEncoder, UInt32 symbol, UInt32 posState)
-{
-  if(symbol < kNumLowSymbols)
-  {
-    _choice.Encode(rangeEncoder, 0);
-    _lowCoder[posState].Encode(rangeEncoder, symbol);
-  }
-  else
-  {
-    _choice.Encode(rangeEncoder, 1);
-    if(symbol < kNumLowSymbols + kNumMidSymbols)
-    {
-      _choice2.Encode(rangeEncoder, 0);
-      _midCoder[posState].Encode(rangeEncoder, symbol - kNumLowSymbols);
-    }
-    else
-    {
-      _choice2.Encode(rangeEncoder, 1);
-      _highCoder.Encode(rangeEncoder, symbol - kNumLowSymbols - kNumMidSymbols);
-    }
-  }
-}
-
-void CEncoder::SetPrices(UInt32 posState, UInt32 numSymbols, UInt32 *prices) const
-{
-  UInt32 a0 = _choice.GetPrice0();
-  UInt32 a1 = _choice.GetPrice1();
-  UInt32 b0 = a1 + _choice2.GetPrice0();
-  UInt32 b1 = a1 + _choice2.GetPrice1();
-  UInt32 i = 0;
-  for (i = 0; i < kNumLowSymbols; i++)
-  {
-    if (i >= numSymbols)
-      return;
-    prices[i] = a0 + _lowCoder[posState].GetPrice(i);
-  }
-  for (; i < kNumLowSymbols + kNumMidSymbols; i++)
-  {
-    if (i >= numSymbols)
-      return;
-    prices[i] = b0 + _midCoder[posState].GetPrice(i - kNumLowSymbols);
-  }
-  for (; i < numSymbols; i++)
-    prices[i] = b1 + _highCoder.GetPrice(i - kNumLowSymbols - kNumMidSymbols);
-}
-
-}
-CEncoder::CEncoder():
-  _numFastBytes(kNumFastBytesDefault),
-  _distTableSize(kDefaultDictionaryLogSize * 2),
-  _posStateBits(2),
-  _posStateMask(4 - 1),
-  _numLiteralPosStateBits(0),
-  _numLiteralContextBits(3),
-  _dictionarySize(1 << kDefaultDictionaryLogSize),
-  _dictionarySizePrev(UInt32(-1)),
-  _numFastBytesPrev(UInt32(-1)),
-  _matchFinderCycles(0),
-  _matchFinderIndex(kBT4),
-   #ifdef COMPRESS_MF_MT
-  _multiThread(false),
-   #endif
-  _writeEndMark(false),
-  setMfPasses(0)
-{
-  // _maxMode = false;
-  _fastMode = false;
-}
-
-HRESULT CEncoder::Create()
-{
-  if (!_rangeEncoder.Create(1 << 20))
-    return E_OUTOFMEMORY;
-  if (!_matchFinder)
-  {
-    switch(_matchFinderIndex)
-    {
-      #ifdef COMPRESS_MF_BT
-      #ifdef COMPRESS_MF_BT2
-      case kBT2:
-      {
-        NBT2::CMatchFinder *mfSpec = new NBT2::CMatchFinder;
-        setMfPasses = mfSpec;
-        _matchFinder = mfSpec;
-        break;
-      }
-      #endif
-      #ifdef COMPRESS_MF_BT3
-      case kBT3:
-      {
-        NBT3::CMatchFinder *mfSpec = new NBT3::CMatchFinder;
-        setMfPasses = mfSpec;
-        _matchFinder = mfSpec;
-        break;
-      }
-      #endif
-      #ifdef COMPRESS_MF_BT4
-      case kBT4:
-      {
-        NBT4::CMatchFinder *mfSpec = new NBT4::CMatchFinder;
-        setMfPasses = mfSpec;
-        _matchFinder = mfSpec;
-        break;
-      }
-      #endif
-      #endif
-
-      #ifdef COMPRESS_MF_HC
-      case kHC4:
-      {
-        NHC4::CMatchFinder *mfSpec = new NHC4::CMatchFinder;
-        setMfPasses = mfSpec;
-        _matchFinder = mfSpec;
-        break;
-      }
-      #endif
-    }
-    if (_matchFinder == 0)
-      return E_OUTOFMEMORY;
-
-    #ifdef COMPRESS_MF_MT
-    if (_multiThread && !(_fastMode && (_matchFinderIndex == kHC4)))
-    {
-      CMatchFinderMT *mfSpec = new CMatchFinderMT;
-      if (mfSpec == 0)
-        return E_OUTOFMEMORY;
-      CMyComPtr<IMatchFinder> mf = mfSpec;
-      RINOK(mfSpec->SetMatchFinder(_matchFinder));
-      _matchFinder.Release();
-      _matchFinder = mf;
-    }
-    #endif
-  }
-
-  if (!_literalEncoder.Create(_numLiteralPosStateBits, _numLiteralContextBits))
-    return E_OUTOFMEMORY;
-
-  if (_dictionarySize == _dictionarySizePrev && _numFastBytesPrev == _numFastBytes)
-    return S_OK;
-  RINOK(_matchFinder->Create(_dictionarySize, kNumOpts, _numFastBytes, kMatchMaxLen + 1)); // actually it's + _numFastBytes - _numFastBytes
-  if (_matchFinderCycles != 0 && setMfPasses != 0)
-    setMfPasses->SetNumPasses(_matchFinderCycles);
-  _dictionarySizePrev = _dictionarySize;
-  _numFastBytesPrev = _numFastBytes;
-  return S_OK;
-}
-
-static bool AreStringsEqual(const wchar_t *base, const wchar_t *testString)
-{
-  while (true)
-  {
-    wchar_t c = *testString;
-    if (c >= 'a' && c <= 'z')
-      c -= 0x20;
-    if (*base != c)
-      return false;
-    if (c == 0)
-      return true;
-    base++;
-    testString++;
-  }
-}
-
-static int FindMatchFinder(const wchar_t *s)
-{
-  for (int m = 0; m < (int)(sizeof(kMatchFinderIDs) / sizeof(kMatchFinderIDs[0])); m++)
-    if (AreStringsEqual(kMatchFinderIDs[m], s))
-      return m;
-  return -1;
-}
-
-STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs,
-    const PROPVARIANT *properties, UInt32 numProperties)
-{
-  for (UInt32 i = 0; i < numProperties; i++)
-  {
-    const PROPVARIANT &prop = properties[i];
-    switch(propIDs[i])
-    {
-      case NCoderPropID::kNumFastBytes:
-      {
-        if (prop.vt != VT_UI4)
-          return E_INVALIDARG;
-        UInt32 numFastBytes = prop.ulVal;
-        if(numFastBytes < 5 || numFastBytes > kMatchMaxLen)
-          return E_INVALIDARG;
-        _numFastBytes = numFastBytes;
-        break;
-      }
-      case NCoderPropID::kMatchFinderCycles:
-      {
-        if (prop.vt != VT_UI4)
-          return E_INVALIDARG;
-        _matchFinderCycles = prop.ulVal;
-        break;
-      }
-      case NCoderPropID::kAlgorithm:
-      {
-        if (prop.vt != VT_UI4)
-          return E_INVALIDARG;
-        UInt32 maximize = prop.ulVal;
-        _fastMode = (maximize == 0);
-        // _maxMode = (maximize >= 2);
-        break;
-      }
-      case NCoderPropID::kMatchFinder:
-      {
-        if (prop.vt != VT_BSTR)
-          return E_INVALIDARG;
-        int matchFinderIndexPrev = _matchFinderIndex;
-        int m = FindMatchFinder(prop.bstrVal);
-        if (m < 0)
-          return E_INVALIDARG;
-        _matchFinderIndex = m;
-        if (_matchFinder && matchFinderIndexPrev != _matchFinderIndex)
-        {
-          _dictionarySizePrev = (UInt32)-1;
-          ReleaseMatchFinder();
-        }
-        break;
-      }
-      #ifdef COMPRESS_MF_MT
-      case NCoderPropID::kMultiThread:
-      {
-        if (prop.vt != VT_BOOL)
-          return E_INVALIDARG;
-        bool newMultiThread = (prop.boolVal == VARIANT_TRUE);
-        if (newMultiThread != _multiThread)
-        {
-          _dictionarySizePrev = (UInt32)-1;
-          ReleaseMatchFinder();
-          _multiThread = newMultiThread;
-        }
-        break;
-      }
-      case NCoderPropID::kNumThreads:
-      {
-        if (prop.vt != VT_UI4)
-          return E_INVALIDARG;
-        bool newMultiThread = (prop.ulVal > 1);
-        if (newMultiThread != _multiThread)
-        {
-          _dictionarySizePrev = (UInt32)-1;
-          ReleaseMatchFinder();
-          _multiThread = newMultiThread;
-        }
-        break;
-      }
-      #endif
-      case NCoderPropID::kDictionarySize:
-      {
-        const int kDicLogSizeMaxCompress = 30;
-        if (prop.vt != VT_UI4)
-          return E_INVALIDARG;
-        UInt32 dictionarySize = prop.ulVal;
-        if (dictionarySize < UInt32(1 << kDicLogSizeMin) ||
-            dictionarySize > UInt32(1 << kDicLogSizeMaxCompress))
-          return E_INVALIDARG;
-        _dictionarySize = dictionarySize;
-        UInt32 dicLogSize;
-        for(dicLogSize = 0; dicLogSize < (UInt32)kDicLogSizeMaxCompress; dicLogSize++)
-          if (dictionarySize <= (UInt32(1) << dicLogSize))
-            break;
-        _distTableSize = dicLogSize * 2;
-        break;
-      }
-      case NCoderPropID::kPosStateBits:
-      {
-        if (prop.vt != VT_UI4)
-          return E_INVALIDARG;
-        UInt32 value = prop.ulVal;
-        if (value > (UInt32)NLength::kNumPosStatesBitsEncodingMax)
-          return E_INVALIDARG;
-        _posStateBits = value;
-        _posStateMask = (1 << _posStateBits) - 1;
-        break;
-      }
-      case NCoderPropID::kLitPosBits:
-      {
-        if (prop.vt != VT_UI4)
-          return E_INVALIDARG;
-        UInt32 value = prop.ulVal;
-        if (value > (UInt32)kNumLitPosStatesBitsEncodingMax)
-          return E_INVALIDARG;
-        _numLiteralPosStateBits = value;
-        break;
-      }
-      case NCoderPropID::kLitContextBits:
-      {
-        if (prop.vt != VT_UI4)
-          return E_INVALIDARG;
-        UInt32 value = prop.ulVal;
-        if (value > (UInt32)kNumLitContextBitsMax)
-          return E_INVALIDARG;
-        _numLiteralContextBits = value;
-        break;
-      }
-      case NCoderPropID::kEndMarker:
-      {
-        if (prop.vt != VT_BOOL)
-          return E_INVALIDARG;
-        SetWriteEndMarkerMode(prop.boolVal == VARIANT_TRUE);
-        break;
-      }
-      default:
-        return E_INVALIDARG;
-    }
-  }
-  return S_OK;
-}
-
-STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)
-{
-  const UInt32 kPropSize = 5;
-  Byte properties[kPropSize];
-  properties[0] = (_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits;
-  for (int i = 0; i < 4; i++)
-    properties[1 + i] = Byte(_dictionarySize >> (8 * i));
-  return WriteStream(outStream, properties, kPropSize, NULL);
-}
-
-STDMETHODIMP CEncoder::SetOutStream(ISequentialOutStream *outStream)
-{
-  _rangeEncoder.SetStream(outStream);
-  return S_OK;
-}
-
-STDMETHODIMP CEncoder::ReleaseOutStream()
-{
-  _rangeEncoder.ReleaseStream();
-  return S_OK;
-}
-
-HRESULT CEncoder::Init()
-{
-  CBaseState::Init();
-
-  // RINOK(_matchFinder->Init(inStream));
-  _rangeEncoder.Init();
-
-  for(int i = 0; i < kNumStates; i++)
-  {
-    for (UInt32 j = 0; j <= _posStateMask; j++)
-    {
-      _isMatch[i][j].Init();
-      _isRep0Long[i][j].Init();
-    }
-    _isRep[i].Init();
-    _isRepG0[i].Init();
-    _isRepG1[i].Init();
-    _isRepG2[i].Init();
-  }
-
-  _literalEncoder.Init();
-
-  {
-    for(UInt32 i = 0; i < kNumLenToPosStates; i++)
-      _posSlotEncoder[i].Init();
-  }
-  {
-    for(UInt32 i = 0; i < kNumFullDistances - kEndPosModelIndex; i++)
-      _posEncoders[i].Init();
-  }
-
-  _lenEncoder.Init(1 << _posStateBits);
-  _repMatchLenEncoder.Init(1 << _posStateBits);
-
-  _posAlignEncoder.Init();
-
-  _longestMatchWasFound = false;
-  _optimumEndIndex = 0;
-  _optimumCurrentIndex = 0;
-  _additionalOffset = 0;
-
-  return S_OK;
-}
-
-HRESULT CEncoder::MovePos(UInt32 num)
-{
-  if (num == 0)
-    return S_OK;
-  _additionalOffset += num;
-  return _matchFinder->Skip(num);
-}
-
-UInt32 CEncoder::Backward(UInt32 &backRes, UInt32 cur)
-{
-  _optimumEndIndex = cur;
-  UInt32 posMem = _optimum[cur].PosPrev;
-  UInt32 backMem = _optimum[cur].BackPrev;
-  do
-  {
-    if (_optimum[cur].Prev1IsChar)
-    {
-      _optimum[posMem].MakeAsChar();
-      _optimum[posMem].PosPrev = posMem - 1;
-      if (_optimum[cur].Prev2)
-      {
-        _optimum[posMem - 1].Prev1IsChar = false;
-        _optimum[posMem - 1].PosPrev = _optimum[cur].PosPrev2;
-        _optimum[posMem - 1].BackPrev = _optimum[cur].BackPrev2;
-      }
-    }
-    UInt32 posPrev = posMem;
-    UInt32 backCur = backMem;
-
-    backMem = _optimum[posPrev].BackPrev;
-    posMem = _optimum[posPrev].PosPrev;
-
-    _optimum[posPrev].BackPrev = backCur;
-    _optimum[posPrev].PosPrev = cur;
-    cur = posPrev;
-  }
-  while(cur != 0);
-  backRes = _optimum[0].BackPrev;
-  _optimumCurrentIndex  = _optimum[0].PosPrev;
-  return _optimumCurrentIndex;
-}
-
-/*
-Out:
-  (lenRes == 1) && (backRes == 0xFFFFFFFF) means Literal
-*/
-
-HRESULT CEncoder::GetOptimum(UInt32 position, UInt32 &backRes, UInt32 &lenRes)
-{
-  if(_optimumEndIndex != _optimumCurrentIndex)
-  {
-    const COptimal &optimum = _optimum[_optimumCurrentIndex];
-    lenRes = optimum.PosPrev - _optimumCurrentIndex;
-    backRes = optimum.BackPrev;
-    _optimumCurrentIndex = optimum.PosPrev;
-    return S_OK;
-  }
-  _optimumCurrentIndex = _optimumEndIndex = 0;
-
-  UInt32 lenMain, numDistancePairs;
-  if (!_longestMatchWasFound)
-  {
-    RINOK(ReadMatchDistances(lenMain, numDistancePairs));
-  }
-  else
-  {
-    lenMain = _longestMatchLength;
-    numDistancePairs = _numDistancePairs;
-    _longestMatchWasFound = false;
-  }
-
-  const Byte *data = _matchFinder->GetPointerToCurrentPos() - 1;
-  UInt32 numAvailableBytes = _matchFinder->GetNumAvailableBytes() + 1;
-  if (numAvailableBytes < 2)
-  {
-    backRes = (UInt32)(-1);
-    lenRes = 1;
-    return S_OK;
-  }
-  if (numAvailableBytes > kMatchMaxLen)
-    numAvailableBytes = kMatchMaxLen;
-
-  UInt32 reps[kNumRepDistances];
-  UInt32 repLens[kNumRepDistances];
-  UInt32 repMaxIndex = 0;
-  UInt32 i;
-  for(i = 0; i < kNumRepDistances; i++)
-  {
-    reps[i] = _repDistances[i];
-    UInt32 backOffset = reps[i] + 1;
-    if (data[0] != data[(size_t)0 - backOffset] || data[1] != data[(size_t)1 - backOffset])
-    {
-      repLens[i] = 0;
-      continue;
-    }
-    UInt32 lenTest;
-    for (lenTest = 2; lenTest < numAvailableBytes &&
-        data[lenTest] == data[(size_t)lenTest - backOffset]; lenTest++);
-    repLens[i] = lenTest;
-    if (lenTest > repLens[repMaxIndex])
-      repMaxIndex = i;
-  }
-  if(repLens[repMaxIndex] >= _numFastBytes)
-  {
-    backRes = repMaxIndex;
-    lenRes = repLens[repMaxIndex];
-    return MovePos(lenRes - 1);
-  }
-
-  UInt32 *matchDistances = _matchDistances + 1;
-  if(lenMain >= _numFastBytes)
-  {
-    backRes = matchDistances[numDistancePairs - 1] + kNumRepDistances;
-    lenRes = lenMain;
-    return MovePos(lenMain - 1);
-  }
-  Byte currentByte = *data;
-  Byte matchByte = data[(size_t)0 - reps[0] - 1];
-
-  if(lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2)
-  {
-    backRes = (UInt32)-1;
-    lenRes = 1;
-    return S_OK;
-  }
-
-  _optimum[0].State = _state;
-
-  UInt32 posState = (position & _posStateMask);
-
-  _optimum[1].Price = _isMatch[_state.Index][posState].GetPrice0() +
-      _literalEncoder.GetSubCoder(position, _previousByte)->GetPrice(!_state.IsCharState(), matchByte, currentByte);
-  _optimum[1].MakeAsChar();
-
-  UInt32 matchPrice = _isMatch[_state.Index][posState].GetPrice1();
-  UInt32 repMatchPrice = matchPrice + _isRep[_state.Index].GetPrice1();
-
-  if(matchByte == currentByte)
-  {
-    UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(_state, posState);
-    if(shortRepPrice < _optimum[1].Price)
-    {
-      _optimum[1].Price = shortRepPrice;
-      _optimum[1].MakeAsShortRep();
-    }
-  }
-  UInt32 lenEnd = ((lenMain >= repLens[repMaxIndex]) ? lenMain : repLens[repMaxIndex]);
-
-  if(lenEnd < 2)
-  {
-    backRes = _optimum[1].BackPrev;
-    lenRes = 1;
-    return S_OK;
-  }
-
-  _optimum[1].PosPrev = 0;
-  for (i = 0; i < kNumRepDistances; i++)
-    _optimum[0].Backs[i] = reps[i];
-
-  UInt32 len = lenEnd;
-  do
-    _optimum[len--].Price = kIfinityPrice;
-  while (len >= 2);
-
-  for(i = 0; i < kNumRepDistances; i++)
-  {
-    UInt32 repLen = repLens[i];
-    if (repLen < 2)
-      continue;
-    UInt32 price = repMatchPrice + GetPureRepPrice(i, _state, posState);
-    do
-    {
-      UInt32 curAndLenPrice = price + _repMatchLenEncoder.GetPrice(repLen - 2, posState);
-      COptimal &optimum = _optimum[repLen];
-      if (curAndLenPrice < optimum.Price)
-      {
-        optimum.Price = curAndLenPrice;
-        optimum.PosPrev = 0;
-        optimum.BackPrev = i;
-        optimum.Prev1IsChar = false;
-      }
-    }
-    while(--repLen >= 2);
-  }
-
-  UInt32 normalMatchPrice = matchPrice + _isRep[_state.Index].GetPrice0();
-
-  len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2);
-  if (len <= lenMain)
-  {
-    UInt32 offs = 0;
-    while (len > matchDistances[offs])
-      offs += 2;
-    for(; ; len++)
-    {
-      UInt32 distance = matchDistances[offs + 1];
-      UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(distance, len, posState);
-      COptimal &optimum = _optimum[len];
-      if (curAndLenPrice < optimum.Price)
-      {
-        optimum.Price = curAndLenPrice;
-        optimum.PosPrev = 0;
-        optimum.BackPrev = distance + kNumRepDistances;
-        optimum.Prev1IsChar = false;
-      }
-      if (len == matchDistances[offs])
-      {
-        offs += 2;
-        if (offs == numDistancePairs)
-          break;
-      }
-    }
-  }
-
-  UInt32 cur = 0;
-
-  while(true)
-  {
-    cur++;
-    if(cur == lenEnd)
-    {
-      lenRes = Backward(backRes, cur);
-      return S_OK;
-    }
-    UInt32 newLen, numDistancePairs;
-    RINOK(ReadMatchDistances(newLen, numDistancePairs));
-    if(newLen >= _numFastBytes)
-    {
-      _numDistancePairs = numDistancePairs;
-      _longestMatchLength = newLen;
-      _longestMatchWasFound = true;
-      lenRes = Backward(backRes, cur);
-      return S_OK;
-    }
-    position++;
-    COptimal &curOptimum = _optimum[cur];
-    UInt32 posPrev = curOptimum.PosPrev;
-    CState state;
-    if (curOptimum.Prev1IsChar)
-    {
-      posPrev--;
-      if (curOptimum.Prev2)
-      {
-        state = _optimum[curOptimum.PosPrev2].State;
-        if (curOptimum.BackPrev2 < kNumRepDistances)
-          state.UpdateRep();
-        else
-          state.UpdateMatch();
-      }
-      else
-        state = _optimum[posPrev].State;
-      state.UpdateChar();
-    }
-    else
-      state = _optimum[posPrev].State;
-    if (posPrev == cur - 1)
-    {
-      if (curOptimum.IsShortRep())
-        state.UpdateShortRep();
-      else
-        state.UpdateChar();
-    }
-    else
-    {
-      UInt32 pos;
-      if (curOptimum.Prev1IsChar && curOptimum.Prev2)
-      {
-        posPrev = curOptimum.PosPrev2;
-        pos = curOptimum.BackPrev2;
-        state.UpdateRep();
-      }
-      else
-      {
-        pos = curOptimum.BackPrev;
-        if (pos < kNumRepDistances)
-          state.UpdateRep();
-        else
-          state.UpdateMatch();
-      }
-      const COptimal &prevOptimum = _optimum[posPrev];
-      if (pos < kNumRepDistances)
-      {
-        reps[0] = prevOptimum.Backs[pos];
-    		UInt32 i;
-        for(i = 1; i <= pos; i++)
-          reps[i] = prevOptimum.Backs[i - 1];
-        for(; i < kNumRepDistances; i++)
-          reps[i] = prevOptimum.Backs[i];
-      }
-      else
-      {
-        reps[0] = (pos - kNumRepDistances);
-        for(UInt32 i = 1; i < kNumRepDistances; i++)
-          reps[i] = prevOptimum.Backs[i - 1];
-      }
-    }
-    curOptimum.State = state;
-    for(UInt32 i = 0; i < kNumRepDistances; i++)
-      curOptimum.Backs[i] = reps[i];
-    UInt32 curPrice = curOptimum.Price;
-    const Byte *data = _matchFinder->GetPointerToCurrentPos() - 1;
-    const Byte currentByte = *data;
-    const Byte matchByte = data[(size_t)0 - reps[0] - 1];
-
-    UInt32 posState = (position & _posStateMask);
-
-    UInt32 curAnd1Price = curPrice +
-        _isMatch[state.Index][posState].GetPrice0() +
-        _literalEncoder.GetSubCoder(position, data[(size_t)0 - 1])->GetPrice(!state.IsCharState(), matchByte, currentByte);
-
-    COptimal &nextOptimum = _optimum[cur + 1];
-
-    bool nextIsChar = false;
-    if (curAnd1Price < nextOptimum.Price)
-    {
-      nextOptimum.Price = curAnd1Price;
-      nextOptimum.PosPrev = cur;
-      nextOptimum.MakeAsChar();
-      nextIsChar = true;
-    }
-
-    UInt32 matchPrice = curPrice + _isMatch[state.Index][posState].GetPrice1();
-    UInt32 repMatchPrice = matchPrice + _isRep[state.Index].GetPrice1();
-
-    if(matchByte == currentByte &&
-        !(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0))
-    {
-      UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(state, posState);
-      if(shortRepPrice <= nextOptimum.Price)
-      {
-        nextOptimum.Price = shortRepPrice;
-        nextOptimum.PosPrev = cur;
-        nextOptimum.MakeAsShortRep();
-        nextIsChar = true;
-      }
-    }
-    /*
-    if(newLen == 2 && matchDistances[2] >= kDistLimit2) // test it maybe set 2000 ?
-      continue;
-    */
-
-    UInt32 numAvailableBytesFull = _matchFinder->GetNumAvailableBytes() + 1;
-    numAvailableBytesFull = MyMin(kNumOpts - 1 - cur, numAvailableBytesFull);
-    UInt32 numAvailableBytes = numAvailableBytesFull;
-
-    if (numAvailableBytes < 2)
-      continue;
-    if (numAvailableBytes > _numFastBytes)
-      numAvailableBytes = _numFastBytes;
-    if (!nextIsChar && matchByte != currentByte) // speed optimization
-    {
-      // try Literal + rep0
-      UInt32 backOffset = reps[0] + 1;
-      UInt32 limit = MyMin(numAvailableBytesFull, _numFastBytes + 1);
-      UInt32 temp;
-      for (temp = 1; temp < limit &&
-          data[temp] == data[(size_t)temp - backOffset]; temp++);
-      UInt32 lenTest2 = temp - 1;
-      if (lenTest2 >= 2)
-      {
-        CState state2 = state;
-        state2.UpdateChar();
-        UInt32 posStateNext = (position + 1) & _posStateMask;
-        UInt32 nextRepMatchPrice = curAnd1Price +
-            _isMatch[state2.Index][posStateNext].GetPrice1() +
-            _isRep[state2.Index].GetPrice1();
-        // for (; lenTest2 >= 2; lenTest2--)
-        {
-          UInt32 offset = cur + 1 + lenTest2;
-          while(lenEnd < offset)
-            _optimum[++lenEnd].Price = kIfinityPrice;
-          UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice(
-              0, lenTest2, state2, posStateNext);
-          COptimal &optimum = _optimum[offset];
-          if (curAndLenPrice < optimum.Price)
-          {
-            optimum.Price = curAndLenPrice;
-            optimum.PosPrev = cur + 1;
-            optimum.BackPrev = 0;
-            optimum.Prev1IsChar = true;
-            optimum.Prev2 = false;
-          }
-        }
-      }
-    }
-
-    UInt32 startLen = 2; // speed optimization
-    for(UInt32 repIndex = 0; repIndex < kNumRepDistances; repIndex++)
-    {
-      // UInt32 repLen = _matchFinder->GetMatchLen(0 - 1, reps[repIndex], newLen); // test it;
-      UInt32 backOffset = reps[repIndex] + 1;
-      if (data[0] != data[(size_t)0 - backOffset] ||
-          data[1] != data[(size_t)1 - backOffset])
-        continue;
-      UInt32 lenTest;
-      for (lenTest = 2; lenTest < numAvailableBytes &&
-          data[lenTest] == data[(size_t)lenTest - backOffset]; lenTest++);
-      while(lenEnd < cur + lenTest)
-        _optimum[++lenEnd].Price = kIfinityPrice;
-      UInt32 lenTestTemp = lenTest;
-      UInt32 price = repMatchPrice + GetPureRepPrice(repIndex, state, posState);
-      do
-      {
-        UInt32 curAndLenPrice = price + _repMatchLenEncoder.GetPrice(lenTest - 2, posState);
-        COptimal &optimum = _optimum[cur + lenTest];
-        if (curAndLenPrice < optimum.Price)
-        {
-          optimum.Price = curAndLenPrice;
-          optimum.PosPrev = cur;
-          optimum.BackPrev = repIndex;
-          optimum.Prev1IsChar = false;
-        }
-      }
-      while(--lenTest >= 2);
-      lenTest = lenTestTemp;
-
-      if (repIndex == 0)
-        startLen = lenTest + 1;
-
-      // if (_maxMode)
-        {
-          UInt32 lenTest2 = lenTest + 1;
-          UInt32 limit = MyMin(numAvailableBytesFull, lenTest2 + _numFastBytes);
-          for (; lenTest2 < limit &&
-              data[lenTest2] == data[(size_t)lenTest2 - backOffset]; lenTest2++);
-          lenTest2 -= lenTest + 1;
-          if (lenTest2 >= 2)
-          {
-            CState state2 = state;
-            state2.UpdateRep();
-            UInt32 posStateNext = (position + lenTest) & _posStateMask;
-            UInt32 curAndLenCharPrice =
-                price + _repMatchLenEncoder.GetPrice(lenTest - 2, posState) +
-                _isMatch[state2.Index][posStateNext].GetPrice0() +
-                _literalEncoder.GetSubCoder(position + lenTest, data[(size_t)lenTest - 1])->GetPrice(
-                true, data[(size_t)lenTest - backOffset], data[lenTest]);
-            state2.UpdateChar();
-            posStateNext = (position + lenTest + 1) & _posStateMask;
-            UInt32 nextRepMatchPrice = curAndLenCharPrice +
-                _isMatch[state2.Index][posStateNext].GetPrice1() +
-                _isRep[state2.Index].GetPrice1();
-
-            // for(; lenTest2 >= 2; lenTest2--)
-            {
-              UInt32 offset = cur + lenTest + 1 + lenTest2;
-              while(lenEnd < offset)
-                _optimum[++lenEnd].Price = kIfinityPrice;
-              UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice(
-                  0, lenTest2, state2, posStateNext);
-              COptimal &optimum = _optimum[offset];
-              if (curAndLenPrice < optimum.Price)
-              {
-                optimum.Price = curAndLenPrice;
-                optimum.PosPrev = cur + lenTest + 1;
-                optimum.BackPrev = 0;
-                optimum.Prev1IsChar = true;
-                optimum.Prev2 = true;
-                optimum.PosPrev2 = cur;
-                optimum.BackPrev2 = repIndex;
-              }
-            }
-          }
-        }
-      }
-
-    //    for(UInt32 lenTest = 2; lenTest <= newLen; lenTest++)
-    if (newLen > numAvailableBytes)
-    {
-      newLen = numAvailableBytes;
-      for (numDistancePairs = 0; newLen > matchDistances[numDistancePairs]; numDistancePairs += 2);
-      matchDistances[numDistancePairs] = newLen;
-      numDistancePairs += 2;
-    }
-    if (newLen >= startLen)
-    {
-      UInt32 normalMatchPrice = matchPrice + _isRep[state.Index].GetPrice0();
-      while(lenEnd < cur + newLen)
-        _optimum[++lenEnd].Price = kIfinityPrice;
-
-      UInt32 offs = 0;
-      while(startLen > matchDistances[offs])
-        offs += 2;
-      UInt32 curBack = matchDistances[offs + 1];
-      UInt32 posSlot = GetPosSlot2(curBack);
-      for(UInt32 lenTest = /*2*/ startLen; ; lenTest++)
-      {
-        UInt32 curAndLenPrice = normalMatchPrice;
-        UInt32 lenToPosState = GetLenToPosState(lenTest);
-        if (curBack < kNumFullDistances)
-          curAndLenPrice += _distancesPrices[lenToPosState][curBack];
-        else
-          curAndLenPrice += _posSlotPrices[lenToPosState][posSlot] + _alignPrices[curBack & kAlignMask];
-
-        curAndLenPrice += _lenEncoder.GetPrice(lenTest - kMatchMinLen, posState);
-
-        COptimal &optimum = _optimum[cur + lenTest];
-        if (curAndLenPrice < optimum.Price)
-        {
-          optimum.Price = curAndLenPrice;
-          optimum.PosPrev = cur;
-          optimum.BackPrev = curBack + kNumRepDistances;
-          optimum.Prev1IsChar = false;
-        }
-
-        if (/*_maxMode && */lenTest == matchDistances[offs])
-        {
-          // Try Match + Literal + Rep0
-          UInt32 backOffset = curBack + 1;
-          UInt32 lenTest2 = lenTest + 1;
-          UInt32 limit = MyMin(numAvailableBytesFull, lenTest2 + _numFastBytes);
-          for (; lenTest2 < limit &&
-              data[lenTest2] == data[(size_t)lenTest2 - backOffset]; lenTest2++);
-          lenTest2 -= lenTest + 1;
-          if (lenTest2 >= 2)
-          {
-            CState state2 = state;
-            state2.UpdateMatch();
-            UInt32 posStateNext = (position + lenTest) & _posStateMask;
-            UInt32 curAndLenCharPrice = curAndLenPrice +
-                _isMatch[state2.Index][posStateNext].GetPrice0() +
-                _literalEncoder.GetSubCoder(position + lenTest, data[(size_t)lenTest - 1])->GetPrice(
-                true, data[(size_t)lenTest - backOffset], data[lenTest]);
-            state2.UpdateChar();
-            posStateNext = (posStateNext + 1) & _posStateMask;
-            UInt32 nextRepMatchPrice = curAndLenCharPrice +
-                _isMatch[state2.Index][posStateNext].GetPrice1() +
-                _isRep[state2.Index].GetPrice1();
-
-            // for(; lenTest2 >= 2; lenTest2--)
-            {
-              UInt32 offset = cur + lenTest + 1 + lenTest2;
-              while(lenEnd < offset)
-                _optimum[++lenEnd].Price = kIfinityPrice;
-              UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext);
-              COptimal &optimum = _optimum[offset];
-              if (curAndLenPrice < optimum.Price)
-              {
-                optimum.Price = curAndLenPrice;
-                optimum.PosPrev = cur + lenTest + 1;
-                optimum.BackPrev = 0;
-                optimum.Prev1IsChar = true;
-                optimum.Prev2 = true;
-                optimum.PosPrev2 = cur;
-                optimum.BackPrev2 = curBack + kNumRepDistances;
-              }
-            }
-          }
-          offs += 2;
-          if (offs == numDistancePairs)
-            break;
-          curBack = matchDistances[offs + 1];
-          if (curBack >= kNumFullDistances)
-            posSlot = GetPosSlot2(curBack);
-        }
-      }
-    }
-  }
-}
-
-static inline bool ChangePair(UInt32 smallDist, UInt32 bigDist)
-{
-  return ((bigDist >> 7) > smallDist);
-}
-
-
-HRESULT CEncoder::ReadMatchDistances(UInt32 &lenRes, UInt32 &numDistancePairs)
-{
-  lenRes = 0;
-  RINOK(_matchFinder->GetMatches(_matchDistances));
-  numDistancePairs = _matchDistances[0];
-  if (numDistancePairs > 0)
-  {
-    lenRes = _matchDistances[1 + numDistancePairs - 2];
-    if (lenRes == _numFastBytes)
-      lenRes += _matchFinder->GetMatchLen(lenRes - 1, _matchDistances[1 + numDistancePairs - 1],
-          kMatchMaxLen - lenRes);
-  }
-  _additionalOffset++;
-  return S_OK;
-}
-
-HRESULT CEncoder::GetOptimumFast(UInt32 position, UInt32 &backRes, UInt32 &lenRes)
-{
-  UInt32 lenMain, numDistancePairs;
-  if (!_longestMatchWasFound)
-  {
-    RINOK(ReadMatchDistances(lenMain, numDistancePairs));
-  }
-  else
-  {
-    lenMain = _longestMatchLength;
-    numDistancePairs = _numDistancePairs;
-    _longestMatchWasFound = false;
-  }
-
-  const Byte *data = _matchFinder->GetPointerToCurrentPos() - 1;
-  UInt32 numAvailableBytes = _matchFinder->GetNumAvailableBytes() + 1;
-  if (numAvailableBytes > kMatchMaxLen)
-    numAvailableBytes = kMatchMaxLen;
-  if (numAvailableBytes < 2)
-  {
-    backRes = (UInt32)(-1);
-    lenRes = 1;
-    return S_OK;
-  }
-
-  UInt32 repLens[kNumRepDistances];
-  UInt32 repMaxIndex = 0;
-
-  for(UInt32 i = 0; i < kNumRepDistances; i++)
-  {
-    UInt32 backOffset = _repDistances[i] + 1;
-    if (data[0] != data[(size_t)0 - backOffset] || data[1] != data[(size_t)1 - backOffset])
-    {
-      repLens[i] = 0;
-      continue;
-    }
-    UInt32 len;
-    for (len = 2; len < numAvailableBytes && data[len] == data[(size_t)len - backOffset]; len++);
-    if(len >= _numFastBytes)
-    {
-      backRes = i;
-      lenRes = len;
-      return MovePos(lenRes - 1);
-    }
-    repLens[i] = len;
-    if (len > repLens[repMaxIndex])
-      repMaxIndex = i;
-  }
-  UInt32 *matchDistances = _matchDistances + 1;
-  if(lenMain >= _numFastBytes)
-  {
-    backRes = matchDistances[numDistancePairs - 1] + kNumRepDistances;
-    lenRes = lenMain;
-    return MovePos(lenMain - 1);
-  }
-
-  UInt32 backMain = 0;
-  if (lenMain >= 2)
-  {
-    backMain = matchDistances[numDistancePairs - 1];
-    while (numDistancePairs > 2 && lenMain == matchDistances[numDistancePairs - 4] + 1)
-    {
-      if (!ChangePair(matchDistances[numDistancePairs - 3], backMain))
-        break;
-      numDistancePairs -= 2;
-      lenMain = matchDistances[numDistancePairs - 2];
-      backMain = matchDistances[numDistancePairs - 1];
-    }
-    if (lenMain == 2 && backMain >= 0x80)
-      lenMain = 1;
-  }
-
-  if (repLens[repMaxIndex] >= 2)
-  {
-    if (repLens[repMaxIndex] + 1 >= lenMain ||
-        repLens[repMaxIndex] + 2 >= lenMain && (backMain > (1 << 9)) ||
-        repLens[repMaxIndex] + 3 >= lenMain && (backMain > (1 << 15)))
-    {
-      backRes = repMaxIndex;
-      lenRes = repLens[repMaxIndex];
-      return MovePos(lenRes - 1);
-    }
-  }
-
-  if (lenMain >= 2 && numAvailableBytes > 2)
-  {
-    RINOK(ReadMatchDistances(_longestMatchLength, _numDistancePairs));
-    if (_longestMatchLength >= 2)
-    {
-      UInt32 newDistance = matchDistances[_numDistancePairs - 1];
-      if (_longestMatchLength >= lenMain && newDistance < backMain ||
-          _longestMatchLength == lenMain + 1 && !ChangePair(backMain, newDistance) ||
-          _longestMatchLength > lenMain + 1 ||
-          _longestMatchLength + 1 >= lenMain && lenMain >= 3 && ChangePair(newDistance, backMain))
-      {
-        _longestMatchWasFound = true;
-        backRes = UInt32(-1);
-        lenRes = 1;
-        return S_OK;
-      }
-    }
-    data++;
-    numAvailableBytes--;
-    for(UInt32 i = 0; i < kNumRepDistances; i++)
-    {
-      UInt32 backOffset = _repDistances[i] + 1;
-      if (data[1] != data[(size_t)1 - backOffset] || data[2] != data[(size_t)2 - backOffset])
-      {
-        repLens[i] = 0;
-        continue;
-      }
-      UInt32 len;
-      for (len = 2; len < numAvailableBytes && data[len] == data[(size_t)len - backOffset]; len++);
-      if (len + 1 >= lenMain)
-      {
-        _longestMatchWasFound = true;
-        backRes = UInt32(-1);
-        lenRes = 1;
-        return S_OK;
-      }
-    }
-    backRes = backMain + kNumRepDistances;
-    lenRes = lenMain;
-    return MovePos(lenMain - 2);
-  }
-  backRes = UInt32(-1);
-  lenRes = 1;
-  return S_OK;
-}
-
-HRESULT CEncoder::Flush(UInt32 nowPos)
-{
-  ReleaseMFStream();
-  WriteEndMarker(nowPos & _posStateMask);
-  _rangeEncoder.FlushData();
-  return _rangeEncoder.FlushStream();
-}
-
-void CEncoder::WriteEndMarker(UInt32 posState)
-{
-  // This function for writing End Mark for stream version of LZMA.
-  // In current version this feature is not used.
-  if (!_writeEndMark)
-    return;
-
-  _isMatch[_state.Index][posState].Encode(&_rangeEncoder, 1);
-  _isRep[_state.Index].Encode(&_rangeEncoder, 0);
-  _state.UpdateMatch();
-  UInt32 len = kMatchMinLen; // kMatchMaxLen;
-  _lenEncoder.Encode(&_rangeEncoder, len - kMatchMinLen, posState, !_fastMode);
-  UInt32 posSlot = (1 << kNumPosSlotBits)  - 1;
-  UInt32 lenToPosState = GetLenToPosState(len);
-  _posSlotEncoder[lenToPosState].Encode(&_rangeEncoder, posSlot);
-  UInt32 footerBits = 30;
-  UInt32 posReduced = (UInt32(1) << footerBits) - 1;
-  _rangeEncoder.EncodeDirectBits(posReduced >> kNumAlignBits, footerBits - kNumAlignBits);
-  _posAlignEncoder.ReverseEncode(&_rangeEncoder, posReduced & kAlignMask);
-}
-
-HRESULT CEncoder::CodeReal(ISequentialInStream *inStream,
-      ISequentialOutStream *outStream,
-      const UInt64 *inSize, const UInt64 *outSize,
-      ICompressProgressInfo *progress)
-{
-  _needReleaseMFStream = false;
-  CCoderReleaser coderReleaser(this);
-  RINOK(SetStreams(inStream, outStream, inSize, outSize));
-  while(true)
-  {
-    UInt64 processedInSize;
-    UInt64 processedOutSize;
-    Int32 finished;
-    RINOK(CodeOneBlock(&processedInSize, &processedOutSize, &finished));
-    if (finished != 0)
-      return S_OK;
-    if (progress != 0)
-    {
-      RINOK(progress->SetRatioInfo(&processedInSize, &processedOutSize));
-    }
-  }
-}
-
-HRESULT CEncoder::SetStreams(ISequentialInStream *inStream,
-      ISequentialOutStream *outStream,
-      const UInt64 *inSize, const UInt64 *outSize)
-{
-  _inStream = inStream;
-  _finished = false;
-  RINOK(Create());
-  RINOK(SetOutStream(outStream));
-  RINOK(Init());
-
-  // CCoderReleaser releaser(this);
-
-  /*
-  if (_matchFinder->GetNumAvailableBytes() == 0)
-    return Flush();
-  */
-
-  if (!_fastMode)
-  {
-    FillDistancesPrices();
-    FillAlignPrices();
-  }
-
-  _lenEncoder.SetTableSize(_numFastBytes + 1 - kMatchMinLen);
-  _lenEncoder.UpdateTables(1 << _posStateBits);
-  _repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - kMatchMinLen);
-  _repMatchLenEncoder.UpdateTables(1 << _posStateBits);
-
-  nowPos64 = 0;
-  return S_OK;
-}
-
-HRESULT CEncoder::CodeOneBlock(UInt64 *inSize, UInt64 *outSize, Int32 *finished)
-{
-  if (_inStream != 0)
-  {
-    RINOK(_matchFinder->SetStream(_inStream));
-    RINOK(_matchFinder->Init());
-    _needReleaseMFStream = true;
-    _inStream = 0;
-  }
-
-
-  *finished = 1;
-  if (_finished)
-    return S_OK;
-  _finished = true;
-
-  if (nowPos64 == 0)
-  {
-    if (_matchFinder->GetNumAvailableBytes() == 0)
-      return Flush(UInt32(nowPos64));
-    UInt32 len, numDistancePairs;
-    RINOK(ReadMatchDistances(len, numDistancePairs));
-    UInt32 posState = UInt32(nowPos64) & _posStateMask;
-    _isMatch[_state.Index][posState].Encode(&_rangeEncoder, 0);
-    _state.UpdateChar();
-    Byte curByte = _matchFinder->GetIndexByte(0 - _additionalOffset);
-    _literalEncoder.GetSubCoder(UInt32(nowPos64), _previousByte)->Encode(&_rangeEncoder, curByte);
-    _previousByte = curByte;
-    _additionalOffset--;
-    nowPos64++;
-  }
-
-  UInt32 nowPos32 = (UInt32)nowPos64;
-  UInt32 progressPosValuePrev = nowPos32;
-
-  if (_matchFinder->GetNumAvailableBytes() == 0)
-    return Flush(nowPos32);
-
-  while(true)
-  {
-    #ifdef _NO_EXCEPTIONS
-    if (_rangeEncoder.Stream.ErrorCode != S_OK)
-      return _rangeEncoder.Stream.ErrorCode;
-    #endif
-    UInt32 pos, len;
-    HRESULT result;
-    if (_fastMode)
-      result = GetOptimumFast(nowPos32, pos, len);
-    else
-      result = GetOptimum(nowPos32, pos, len);
-    RINOK(result);
-
-    UInt32 posState = nowPos32 & _posStateMask;
-    if(len == 1 && pos == 0xFFFFFFFF)
-    {
-      _isMatch[_state.Index][posState].Encode(&_rangeEncoder, 0);
-      Byte curByte = _matchFinder->GetIndexByte(0 - _additionalOffset);
-      CLiteralEncoder2 *subCoder = _literalEncoder.GetSubCoder(nowPos32, _previousByte);
-      if(_state.IsCharState())
-        subCoder->Encode(&_rangeEncoder, curByte);
-      else
-      {
-        Byte matchByte = _matchFinder->GetIndexByte(0 - _repDistances[0] - 1 - _additionalOffset);
-        subCoder->EncodeMatched(&_rangeEncoder, matchByte, curByte);
-      }
-      _state.UpdateChar();
-      _previousByte = curByte;
-    }
-    else
-    {
-      _isMatch[_state.Index][posState].Encode(&_rangeEncoder, 1);
-      if(pos < kNumRepDistances)
-      {
-        _isRep[_state.Index].Encode(&_rangeEncoder, 1);
-        if(pos == 0)
-        {
-          _isRepG0[_state.Index].Encode(&_rangeEncoder, 0);
-          _isRep0Long[_state.Index][posState].Encode(&_rangeEncoder, ((len == 1) ? 0 : 1));
-        }
-        else
-        {
-          UInt32 distance = _repDistances[pos];
-          _isRepG0[_state.Index].Encode(&_rangeEncoder, 1);
-          if (pos == 1)
-            _isRepG1[_state.Index].Encode(&_rangeEncoder, 0);
-          else
-          {
-            _isRepG1[_state.Index].Encode(&_rangeEncoder, 1);
-            _isRepG2[_state.Index].Encode(&_rangeEncoder, pos - 2);
-            if (pos == 3)
-              _repDistances[3] = _repDistances[2];
-            _repDistances[2] = _repDistances[1];
-          }
-          _repDistances[1] = _repDistances[0];
-          _repDistances[0] = distance;
-        }
-        if (len == 1)
-          _state.UpdateShortRep();
-        else
-        {
-          _repMatchLenEncoder.Encode(&_rangeEncoder, len - kMatchMinLen, posState, !_fastMode);
-          _state.UpdateRep();
-        }
-      }
-      else
-      {
-        _isRep[_state.Index].Encode(&_rangeEncoder, 0);
-        _state.UpdateMatch();
-        _lenEncoder.Encode(&_rangeEncoder, len - kMatchMinLen, posState, !_fastMode);
-        pos -= kNumRepDistances;
-        UInt32 posSlot = GetPosSlot(pos);
-        _posSlotEncoder[GetLenToPosState(len)].Encode(&_rangeEncoder, posSlot);
-
-        if (posSlot >= kStartPosModelIndex)
-        {
-          UInt32 footerBits = ((posSlot >> 1) - 1);
-          UInt32 base = ((2 | (posSlot & 1)) << footerBits);
-          UInt32 posReduced = pos - base;
-
-          if (posSlot < kEndPosModelIndex)
-            NRangeCoder::ReverseBitTreeEncode(_posEncoders + base - posSlot - 1,
-                &_rangeEncoder, footerBits, posReduced);
-          else
-          {
-            _rangeEncoder.EncodeDirectBits(posReduced >> kNumAlignBits, footerBits - kNumAlignBits);
-            _posAlignEncoder.ReverseEncode(&_rangeEncoder, posReduced & kAlignMask);
-            _alignPriceCount++;
-          }
-        }
-        _repDistances[3] = _repDistances[2];
-        _repDistances[2] = _repDistances[1];
-        _repDistances[1] = _repDistances[0];
-        _repDistances[0] = pos;
-        _matchPriceCount++;
-      }
-      _previousByte = _matchFinder->GetIndexByte(len - 1 - _additionalOffset);
-    }
-    _additionalOffset -= len;
-    nowPos32 += len;
-    if (_additionalOffset == 0)
-    {
-      if (!_fastMode)
-      {
-        if (_matchPriceCount >= (1 << 7))
-          FillDistancesPrices();
-        if (_alignPriceCount >= kAlignTableSize)
-          FillAlignPrices();
-      }
-      if (_matchFinder->GetNumAvailableBytes() == 0)
-        return Flush(nowPos32);
-      if (nowPos32 - progressPosValuePrev >= (1 << 14))
-      {
-        nowPos64 += nowPos32 - progressPosValuePrev;
-        *inSize = nowPos64;
-        *outSize = _rangeEncoder.GetProcessedSize();
-        _finished = false;
-        *finished = 0;
-        return S_OK;
-      }
-    }
-  }
-}
-
-STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream,
-    ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
-    ICompressProgressInfo *progress)
-{
-  #ifndef _NO_EXCEPTIONS
-  try
-  {
-  #endif
-    return CodeReal(inStream, outStream, inSize, outSize, progress);
-  #ifndef _NO_EXCEPTIONS
-  }
-  catch(const COutBufferException &e) { return e.ErrorCode; }
-  catch(...) { return E_FAIL; }
-  #endif
-}
-
-void CEncoder::FillDistancesPrices()
-{
-  UInt32 tempPrices[kNumFullDistances];
-  for (UInt32 i = kStartPosModelIndex; i < kNumFullDistances; i++)
-  {
-    UInt32 posSlot = GetPosSlot(i);
-    UInt32 footerBits = ((posSlot >> 1) - 1);
-    UInt32 base = ((2 | (posSlot & 1)) << footerBits);
-    tempPrices[i] = NRangeCoder::ReverseBitTreeGetPrice(_posEncoders +
-      base - posSlot - 1, footerBits, i - base);
-  }
-
-  for (UInt32 lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++)
-  {
-	  UInt32 posSlot;
-    NRangeCoder::CBitTreeEncoder<kNumMoveBits, kNumPosSlotBits> &encoder = _posSlotEncoder[lenToPosState];
-    UInt32 *posSlotPrices = _posSlotPrices[lenToPosState];
-    for (posSlot = 0; posSlot < _distTableSize; posSlot++)
-      posSlotPrices[posSlot] = encoder.GetPrice(posSlot);
-    for (posSlot = kEndPosModelIndex; posSlot < _distTableSize; posSlot++)
-      posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << NRangeCoder::kNumBitPriceShiftBits);
-
-    UInt32 *distancesPrices = _distancesPrices[lenToPosState];
-	  UInt32 i;
-    for (i = 0; i < kStartPosModelIndex; i++)
-      distancesPrices[i] = posSlotPrices[i];
-    for (; i < kNumFullDistances; i++)
-      distancesPrices[i] = posSlotPrices[GetPosSlot(i)] + tempPrices[i];
-  }
-  _matchPriceCount = 0;
-}
-
-void CEncoder::FillAlignPrices()
-{
-  for (UInt32 i = 0; i < kAlignTableSize; i++)
-    _alignPrices[i] = _posAlignEncoder.ReverseGetPrice(i);
-  _alignPriceCount = 0;
-}
-
-}}
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZMA/LZMAEncoder.h b/util/cbfstool/lzma/C/7zip/Compress/LZMA/LZMAEncoder.h
deleted file mode 100644
index 2a41948..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZMA/LZMAEncoder.h
+++ /dev/null
@@ -1,411 +0,0 @@
-// LZMA/Encoder.h
-
-#ifndef __LZMA_ENCODER_H
-#define __LZMA_ENCODER_H
-
-#include "../../../Common/MyCom.h"
-#include "../../../Common/Alloc.h"
-#include "../../ICoder.h"
-#include "../LZ/IMatchFinder.h"
-#include "../RangeCoder/RangeCoderBitTree.h"
-
-#include "LZMA.h"
-
-namespace NCompress {
-namespace NLZMA {
-
-typedef NRangeCoder::CBitEncoder<kNumMoveBits> CMyBitEncoder;
-
-class CBaseState
-{
-protected:
-  CState _state;
-  Byte _previousByte;
-  UInt32 _repDistances[kNumRepDistances];
-  void Init()
-  {
-    _state.Init();
-    _previousByte = 0;
-    for(UInt32 i = 0 ; i < kNumRepDistances; i++)
-      _repDistances[i] = 0;
-  }
-};
-
-struct COptimal
-{
-  CState State;
-
-  bool Prev1IsChar;
-  bool Prev2;
-
-  UInt32 PosPrev2;
-  UInt32 BackPrev2;
-
-  UInt32 Price;
-  UInt32 PosPrev;         // posNext;
-  UInt32 BackPrev;
-  UInt32 Backs[kNumRepDistances];
-  void MakeAsChar() { BackPrev = UInt32(-1); Prev1IsChar = false; }
-  void MakeAsShortRep() { BackPrev = 0; ; Prev1IsChar = false; }
-  bool IsShortRep() { return (BackPrev == 0); }
-};
-
-
-extern Byte g_FastPos[1 << 11];
-inline UInt32 GetPosSlot(UInt32 pos)
-{
-  if (pos < (1 << 11))
-    return g_FastPos[pos];
-  if (pos < (1 << 21))
-    return g_FastPos[pos >> 10] + 20;
-  return g_FastPos[pos >> 20] + 40;
-}
-
-inline UInt32 GetPosSlot2(UInt32 pos)
-{
-  if (pos < (1 << 17))
-    return g_FastPos[pos >> 6] + 12;
-  if (pos < (1 << 27))
-    return g_FastPos[pos >> 16] + 32;
-  return g_FastPos[pos >> 26] + 52;
-}
-
-const UInt32 kIfinityPrice = 0xFFFFFFF;
-
-const UInt32 kNumOpts = 1 << 12;
-
-
-class CLiteralEncoder2
-{
-  CMyBitEncoder _encoders[0x300];
-public:
-  void Init()
-  {
-    for (int i = 0; i < 0x300; i++)
-      _encoders[i].Init();
-  }
-  void Encode(NRangeCoder::CEncoder *rangeEncoder, Byte symbol);
-  void EncodeMatched(NRangeCoder::CEncoder *rangeEncoder, Byte matchByte, Byte symbol);
-  UInt32 GetPrice(bool matchMode, Byte matchByte, Byte symbol) const;
-};
-
-class CLiteralEncoder
-{
-  CLiteralEncoder2 *_coders;
-  int _numPrevBits;
-  int _numPosBits;
-  UInt32 _posMask;
-public:
-  CLiteralEncoder(): _coders(0) {}
-  ~CLiteralEncoder()  { Free(); }
-  void Free()
-  {
-    MyFree(_coders);
-    _coders = 0;
-  }
-  bool Create(int numPosBits, int numPrevBits)
-  {
-    if (_coders == 0 || (numPosBits + numPrevBits) != (_numPrevBits + _numPosBits))
-    {
-      Free();
-      UInt32 numStates = 1 << (numPosBits + numPrevBits);
-      _coders = (CLiteralEncoder2 *)MyAlloc(numStates * sizeof(CLiteralEncoder2));
-    }
-    _numPosBits = numPosBits;
-    _posMask = (1 << numPosBits) - 1;
-    _numPrevBits = numPrevBits;
-    return (_coders != 0);
-  }
-  void Init()
-  {
-    UInt32 numStates = 1 << (_numPrevBits + _numPosBits);
-    for (UInt32 i = 0; i < numStates; i++)
-      _coders[i].Init();
-  }
-  CLiteralEncoder2 *GetSubCoder(UInt32 pos, Byte prevByte)
-    { return &_coders[((pos & _posMask) << _numPrevBits) + (prevByte >> (8 - _numPrevBits))]; }
-};
-
-namespace NLength {
-
-class CEncoder
-{
-  CMyBitEncoder _choice;
-  CMyBitEncoder _choice2;
-  NRangeCoder::CBitTreeEncoder<kNumMoveBits, kNumLowBits> _lowCoder[kNumPosStatesEncodingMax];
-  NRangeCoder::CBitTreeEncoder<kNumMoveBits, kNumMidBits> _midCoder[kNumPosStatesEncodingMax];
-  NRangeCoder::CBitTreeEncoder<kNumMoveBits, kNumHighBits> _highCoder;
-public:
-  void Init(UInt32 numPosStates);
-  void Encode(NRangeCoder::CEncoder *rangeEncoder, UInt32 symbol, UInt32 posState);
-  void SetPrices(UInt32 posState, UInt32 numSymbols, UInt32 *prices) const;
-};
-
-const UInt32 kNumSpecSymbols = kNumLowSymbols + kNumMidSymbols;
-
-class CPriceTableEncoder: public CEncoder
-{
-  UInt32 _prices[kNumPosStatesEncodingMax][kNumSymbolsTotal];
-  UInt32 _tableSize;
-  UInt32 _counters[kNumPosStatesEncodingMax];
-public:
-  void SetTableSize(UInt32 tableSize) { _tableSize = tableSize;  }
-  UInt32 GetPrice(UInt32 symbol, UInt32 posState) const { return _prices[posState][symbol]; }
-  void UpdateTable(UInt32 posState)
-  {
-    SetPrices(posState, _tableSize, _prices[posState]);
-    _counters[posState] = _tableSize;
-  }
-  void UpdateTables(UInt32 numPosStates)
-  {
-    for (UInt32 posState = 0; posState < numPosStates; posState++)
-      UpdateTable(posState);
-  }
-  void Encode(NRangeCoder::CEncoder *rangeEncoder, UInt32 symbol, UInt32 posState, bool updatePrice)
-  {
-    CEncoder::Encode(rangeEncoder, symbol, posState);
-    if (updatePrice)
-      if (--_counters[posState] == 0)
-        UpdateTable(posState);
-  }
-};
-
-}
-
-class CEncoder :
-  public ICompressCoder,
-  public ICompressSetOutStream,
-  public ICompressSetCoderProperties,
-  public ICompressWriteCoderProperties,
-  public CBaseState,
-  public CMyUnknownImp
-{
-  COptimal _optimum[kNumOpts];
-  CMyComPtr<IMatchFinder> _matchFinder; // test it
-  NRangeCoder::CEncoder _rangeEncoder;
-
-  CMyBitEncoder _isMatch[kNumStates][NLength::kNumPosStatesEncodingMax];
-  CMyBitEncoder _isRep[kNumStates];
-  CMyBitEncoder _isRepG0[kNumStates];
-  CMyBitEncoder _isRepG1[kNumStates];
-  CMyBitEncoder _isRepG2[kNumStates];
-  CMyBitEncoder _isRep0Long[kNumStates][NLength::kNumPosStatesEncodingMax];
-
-  NRangeCoder::CBitTreeEncoder<kNumMoveBits, kNumPosSlotBits> _posSlotEncoder[kNumLenToPosStates];
-
-  CMyBitEncoder _posEncoders[kNumFullDistances - kEndPosModelIndex];
-  NRangeCoder::CBitTreeEncoder<kNumMoveBits, kNumAlignBits> _posAlignEncoder;
-
-  NLength::CPriceTableEncoder _lenEncoder;
-  NLength::CPriceTableEncoder _repMatchLenEncoder;
-
-  CLiteralEncoder _literalEncoder;
-
-  UInt32 _matchDistances[kMatchMaxLen * 2 + 2 + 1];
-
-  bool _fastMode;
-  // bool _maxMode;
-  UInt32 _numFastBytes;
-  UInt32 _longestMatchLength;
-  UInt32 _numDistancePairs;
-
-  UInt32 _additionalOffset;
-
-  UInt32 _optimumEndIndex;
-  UInt32 _optimumCurrentIndex;
-
-  bool _longestMatchWasFound;
-
-  UInt32 _posSlotPrices[kNumLenToPosStates][kDistTableSizeMax];
-
-  UInt32 _distancesPrices[kNumLenToPosStates][kNumFullDistances];
-
-  UInt32 _alignPrices[kAlignTableSize];
-  UInt32 _alignPriceCount;
-
-  UInt32 _distTableSize;
-
-  UInt32 _posStateBits;
-  UInt32 _posStateMask;
-  UInt32 _numLiteralPosStateBits;
-  UInt32 _numLiteralContextBits;
-
-  UInt32 _dictionarySize;
-
-  UInt32 _dictionarySizePrev;
-  UInt32 _numFastBytesPrev;
-
-  UInt32 _matchPriceCount;
-  UInt64 nowPos64;
-  bool _finished;
-  ISequentialInStream *_inStream;
-
-  UInt32 _matchFinderCycles;
-  int _matchFinderIndex;
-  #ifdef COMPRESS_MF_MT
-  bool _multiThread;
-  #endif
-
-  bool _writeEndMark;
-
-  bool _needReleaseMFStream;
-
-  IMatchFinderSetNumPasses *setMfPasses;
-
-  void ReleaseMatchFinder()
-  {
-    setMfPasses = 0;
-    _matchFinder.Release();
-  }
-
-  HRESULT ReadMatchDistances(UInt32 &len, UInt32 &numDistancePairs);
-
-  HRESULT MovePos(UInt32 num);
-  UInt32 GetRepLen1Price(CState state, UInt32 posState) const
-  {
-    return _isRepG0[state.Index].GetPrice0() +
-        _isRep0Long[state.Index][posState].GetPrice0();
-  }
-
-  UInt32 GetPureRepPrice(UInt32 repIndex, CState state, UInt32 posState) const
-  {
-    UInt32 price;
-    if(repIndex == 0)
-    {
-      price = _isRepG0[state.Index].GetPrice0();
-      price += _isRep0Long[state.Index][posState].GetPrice1();
-    }
-    else
-    {
-      price = _isRepG0[state.Index].GetPrice1();
-      if (repIndex == 1)
-        price += _isRepG1[state.Index].GetPrice0();
-      else
-      {
-        price += _isRepG1[state.Index].GetPrice1();
-        price += _isRepG2[state.Index].GetPrice(repIndex - 2);
-      }
-    }
-    return price;
-  }
-  UInt32 GetRepPrice(UInt32 repIndex, UInt32 len, CState state, UInt32 posState) const
-  {
-    return _repMatchLenEncoder.GetPrice(len - kMatchMinLen, posState) +
-        GetPureRepPrice(repIndex, state, posState);
-  }
-  /*
-  UInt32 GetPosLen2Price(UInt32 pos, UInt32 posState) const
-  {
-    if (pos >= kNumFullDistances)
-      return kIfinityPrice;
-    return _distancesPrices[0][pos] + _lenEncoder.GetPrice(0, posState);
-  }
-  UInt32 GetPosLen3Price(UInt32 pos, UInt32 len, UInt32 posState) const
-  {
-    UInt32 price;
-    UInt32 lenToPosState = GetLenToPosState(len);
-    if (pos < kNumFullDistances)
-      price = _distancesPrices[lenToPosState][pos];
-    else
-      price = _posSlotPrices[lenToPosState][GetPosSlot2(pos)] +
-          _alignPrices[pos & kAlignMask];
-    return price + _lenEncoder.GetPrice(len - kMatchMinLen, posState);
-  }
-  */
-  UInt32 GetPosLenPrice(UInt32 pos, UInt32 len, UInt32 posState) const
-  {
-    UInt32 price;
-    UInt32 lenToPosState = GetLenToPosState(len);
-    if (pos < kNumFullDistances)
-      price = _distancesPrices[lenToPosState][pos];
-    else
-      price = _posSlotPrices[lenToPosState][GetPosSlot2(pos)] +
-          _alignPrices[pos & kAlignMask];
-    return price + _lenEncoder.GetPrice(len - kMatchMinLen, posState);
-  }
-
-  UInt32 Backward(UInt32 &backRes, UInt32 cur);
-  HRESULT GetOptimum(UInt32 position, UInt32 &backRes, UInt32 &lenRes);
-  HRESULT GetOptimumFast(UInt32 position, UInt32 &backRes, UInt32 &lenRes);
-
-  void FillDistancesPrices();
-  void FillAlignPrices();
-
-  void ReleaseMFStream()
-  {
-    if (_matchFinder && _needReleaseMFStream)
-    {
-      _matchFinder->ReleaseStream();
-      _needReleaseMFStream = false;
-    }
-  }
-
-  void ReleaseStreams()
-  {
-    ReleaseMFStream();
-    ReleaseOutStream();
-  }
-
-  HRESULT Flush(UInt32 nowPos);
-  class CCoderReleaser
-  {
-    CEncoder *_coder;
-  public:
-    CCoderReleaser(CEncoder *coder): _coder(coder) {}
-    ~CCoderReleaser()
-    {
-      _coder->ReleaseStreams();
-    }
-  };
-  friend class CCoderReleaser;
-
-  void WriteEndMarker(UInt32 posState);
-
-public:
-  CEncoder();
-  void SetWriteEndMarkerMode(bool writeEndMarker)
-    { _writeEndMark= writeEndMarker; }
-
-  HRESULT Create();
-
-  MY_UNKNOWN_IMP3(
-      ICompressSetOutStream,
-      ICompressSetCoderProperties,
-      ICompressWriteCoderProperties
-      )
-
-  HRESULT Init();
-
-  // ICompressCoder interface
-  HRESULT SetStreams(ISequentialInStream *inStream,
-      ISequentialOutStream *outStream,
-      const UInt64 *inSize, const UInt64 *outSize);
-  HRESULT CodeOneBlock(UInt64 *inSize, UInt64 *outSize, Int32 *finished);
-
-  HRESULT CodeReal(ISequentialInStream *inStream,
-      ISequentialOutStream *outStream,
-      const UInt64 *inSize, const UInt64 *outSize,
-      ICompressProgressInfo *progress);
-
-  // ICompressCoder interface
-  STDMETHOD(Code)(ISequentialInStream *inStream,
-      ISequentialOutStream *outStream,
-      const UInt64 *inSize, const UInt64 *outSize,
-      ICompressProgressInfo *progress);
-
-  // ICompressSetCoderProperties2
-  STDMETHOD(SetCoderProperties)(const PROPID *propIDs,
-      const PROPVARIANT *properties, UInt32 numProperties);
-
-  // ICompressWriteCoderProperties
-  STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);
-
-  STDMETHOD(SetOutStream)(ISequentialOutStream *outStream);
-  STDMETHOD(ReleaseOutStream)();
-
-  virtual ~CEncoder() {}
-};
-
-}}
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Compress/LZMA/StdAfx.h b/util/cbfstool/lzma/C/7zip/Compress/LZMA/StdAfx.h
deleted file mode 100644
index e7fb698..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/LZMA/StdAfx.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#include "../../../Common/MyWindows.h"
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoder.h b/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoder.h
deleted file mode 100644
index d77442b..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoder.h
+++ /dev/null
@@ -1,205 +0,0 @@
-// Compress/RangeCoder/RangeCoder.h
-
-#ifndef __COMPRESS_RANGECODER_H
-#define __COMPRESS_RANGECODER_H
-
-#include "../../Common/InBuffer.h"
-#include "../../Common/OutBuffer.h"
-
-namespace NCompress {
-namespace NRangeCoder {
-
-const int kNumTopBits = 24;
-const UInt32 kTopValue = (1 << kNumTopBits);
-
-class CEncoder
-{
-  UInt32 _cacheSize;
-  Byte _cache;
-public:
-  UInt64 Low;
-  UInt32 Range;
-  COutBuffer Stream;
-  bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); }
-
-  void SetStream(ISequentialOutStream *stream) { Stream.SetStream(stream); }
-  void Init()
-  {
-    Stream.Init();
-    Low = 0;
-    Range = 0xFFFFFFFF;
-    _cacheSize = 1;
-    _cache = 0;
-  }
-
-  void FlushData()
-  {
-    // Low += 1;
-    for(int i = 0; i < 5; i++)
-      ShiftLow();
-  }
-
-  HRESULT FlushStream() { return Stream.Flush();  }
-
-  void ReleaseStream() { Stream.ReleaseStream(); }
-
-  void Encode(UInt32 start, UInt32 size, UInt32 total)
-  {
-    Low += start * (Range /= total);
-    Range *= size;
-    while (Range < kTopValue)
-    {
-      Range <<= 8;
-      ShiftLow();
-    }
-  }
-
-  void ShiftLow()
-  {
-    if ((UInt32)Low < (UInt32)0xFF000000 || (int)(Low >> 32) != 0)
-    {
-      Byte temp = _cache;
-      do
-      {
-        Stream.WriteByte((Byte)(temp + (Byte)(Low >> 32)));
-        temp = 0xFF;
-      }
-      while(--_cacheSize != 0);
-      _cache = (Byte)((UInt32)Low >> 24);
-    }
-    _cacheSize++;
-    Low = (UInt32)Low << 8;
-  }
-
-  void EncodeDirectBits(UInt32 value, int numTotalBits)
-  {
-    for (int i = numTotalBits - 1; i >= 0; i--)
-    {
-      Range >>= 1;
-      if (((value >> i) & 1) == 1)
-        Low += Range;
-      if (Range < kTopValue)
-      {
-        Range <<= 8;
-        ShiftLow();
-      }
-    }
-  }
-
-  void EncodeBit(UInt32 size0, UInt32 numTotalBits, UInt32 symbol)
-  {
-    UInt32 newBound = (Range >> numTotalBits) * size0;
-    if (symbol == 0)
-      Range = newBound;
-    else
-    {
-      Low += newBound;
-      Range -= newBound;
-    }
-    while (Range < kTopValue)
-    {
-      Range <<= 8;
-      ShiftLow();
-    }
-  }
-
-  UInt64 GetProcessedSize() {  return Stream.GetProcessedSize() + _cacheSize + 4; }
-};
-
-class CDecoder
-{
-public:
-  CInBuffer Stream;
-  UInt32 Range;
-  UInt32 Code;
-  bool Create(UInt32 bufferSize) { return Stream.Create(bufferSize); }
-
-  void Normalize()
-  {
-    while (Range < kTopValue)
-    {
-      Code = (Code << 8) | Stream.ReadByte();
-      Range <<= 8;
-    }
-  }
-
-  void SetStream(ISequentialInStream *stream) { Stream.SetStream(stream); }
-  void Init()
-  {
-    Stream.Init();
-    Code = 0;
-    Range = 0xFFFFFFFF;
-    for(int i = 0; i < 5; i++)
-      Code = (Code << 8) | Stream.ReadByte();
-  }
-
-  void ReleaseStream() { Stream.ReleaseStream(); }
-
-  UInt32 GetThreshold(UInt32 total)
-  {
-    return (Code) / ( Range /= total);
-  }
-
-  void Decode(UInt32 start, UInt32 size)
-  {
-    Code -= start * Range;
-    Range *= size;
-    Normalize();
-  }
-
-  UInt32 DecodeDirectBits(int numTotalBits)
-  {
-    UInt32 range = Range;
-    UInt32 code = Code;
-    UInt32 result = 0;
-    for (int i = numTotalBits; i != 0; i--)
-    {
-      range >>= 1;
-      /*
-      result <<= 1;
-      if (code >= range)
-      {
-        code -= range;
-        result |= 1;
-      }
-      */
-      UInt32 t = (code - range) >> 31;
-      code -= range & (t - 1);
-      result = (result << 1) | (1 - t);
-
-      if (range < kTopValue)
-      {
-        code = (code << 8) | Stream.ReadByte();
-        range <<= 8;
-      }
-    }
-    Range = range;
-    Code = code;
-    return result;
-  }
-
-  UInt32 DecodeBit(UInt32 size0, UInt32 numTotalBits)
-  {
-    UInt32 newBound = (Range >> numTotalBits) * size0;
-    UInt32 symbol;
-    if (Code < newBound)
-    {
-      symbol = 0;
-      Range = newBound;
-    }
-    else
-    {
-      symbol = 1;
-      Code -= newBound;
-      Range -= newBound;
-    }
-    Normalize();
-    return symbol;
-  }
-
-  UInt64 GetProcessedSize() {return Stream.GetProcessedSize(); }
-};
-
-}}
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoderBit.cpp b/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoderBit.cpp
deleted file mode 100644
index 6c1c78e..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoderBit.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-// Compress/RangeCoder/RangeCoderBit.cpp
-
-#include "StdAfx.h"
-
-#include "RangeCoderBit.h"
-
-namespace NCompress {
-namespace NRangeCoder {
-
-UInt32 CPriceTables::ProbPrices[kBitModelTotal >> kNumMoveReducingBits];
-static CPriceTables g_PriceTables;
-
-CPriceTables::CPriceTables() { Init(); }
-
-void CPriceTables::Init()
-{
-  const int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits);
-  for(int i = kNumBits - 1; i >= 0; i--)
-  {
-    UInt32 start = 1 << (kNumBits - i - 1);
-    UInt32 end = 1 << (kNumBits - i);
-    for (UInt32 j = start; j < end; j++)
-      ProbPrices[j] = (i << kNumBitPriceShiftBits) +
-          (((end - j) << kNumBitPriceShiftBits) >> (kNumBits - i - 1));
-  }
-
-  /*
-  // simplest: bad solution
-  for(UInt32 i = 1; i < (kBitModelTotal >> kNumMoveReducingBits) - 1; i++)
-    ProbPrices[i] = kBitPrice;
-  */
-
-  /*
-  const double kDummyMultMid = (1.0 / kBitPrice) / 2;
-  const double kDummyMultMid = 0;
-  // float solution
-  double ln2 = log(double(2));
-  double lnAll = log(double(kBitModelTotal >> kNumMoveReducingBits));
-  for(UInt32 i = 1; i < (kBitModelTotal >> kNumMoveReducingBits) - 1; i++)
-    ProbPrices[i] = UInt32((fabs(lnAll - log(double(i))) / ln2 + kDummyMultMid) * kBitPrice);
-  */
-
-  /*
-  // experimental, slow, solution:
-  for(UInt32 i = 1; i < (kBitModelTotal >> kNumMoveReducingBits) - 1; i++)
-  {
-    const int kCyclesBits = 5;
-    const UInt32 kCycles = (1 << kCyclesBits);
-
-    UInt32 range = UInt32(-1);
-    UInt32 bitCount = 0;
-    for (UInt32 j = 0; j < kCycles; j++)
-    {
-      range >>= (kNumBitModelTotalBits - kNumMoveReducingBits);
-      range *= i;
-      while(range < (1 << 31))
-      {
-        range <<= 1;
-        bitCount++;
-      }
-    }
-    bitCount <<= kNumBitPriceShiftBits;
-    range -= (1 << 31);
-    for (int k = kNumBitPriceShiftBits - 1; k >= 0; k--)
-    {
-      range <<= 1;
-      if (range > (1 << 31))
-      {
-        bitCount += (1 << k);
-        range -= (1 << 31);
-      }
-    }
-    ProbPrices[i] = (bitCount
-      // + (1 << (kCyclesBits - 1))
-      ) >> kCyclesBits;
-  }
-  */
-}
-
-}}
diff --git a/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoderBit.h b/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoderBit.h
deleted file mode 100644
index 624f887..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoderBit.h
+++ /dev/null
@@ -1,120 +0,0 @@
-// Compress/RangeCoder/RangeCoderBit.h
-
-#ifndef __COMPRESS_RANGECODER_BIT_H
-#define __COMPRESS_RANGECODER_BIT_H
-
-#include "RangeCoder.h"
-
-namespace NCompress {
-namespace NRangeCoder {
-
-const int kNumBitModelTotalBits  = 11;
-const UInt32 kBitModelTotal = (1 << kNumBitModelTotalBits);
-
-const int kNumMoveReducingBits = 2;
-
-const int kNumBitPriceShiftBits = 6;
-const UInt32 kBitPrice = 1 << kNumBitPriceShiftBits;
-
-class CPriceTables
-{
-public:
-  static UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits];
-  static void Init();
-  CPriceTables();
-};
-
-template <int numMoveBits>
-class CBitModel
-{
-public:
-  UInt32 Prob;
-  void UpdateModel(UInt32 symbol)
-  {
-    /*
-    Prob -= (Prob + ((symbol - 1) & ((1 << numMoveBits) - 1))) >> numMoveBits;
-    Prob += (1 - symbol) << (kNumBitModelTotalBits - numMoveBits);
-    */
-    if (symbol == 0)
-      Prob += (kBitModelTotal - Prob) >> numMoveBits;
-    else
-      Prob -= (Prob) >> numMoveBits;
-  }
-public:
-  void Init() { Prob = kBitModelTotal / 2; }
-};
-
-template <int numMoveBits>
-class CBitEncoder: public CBitModel<numMoveBits>
-{
-public:
-  void Encode(CEncoder *encoder, UInt32 symbol)
-  {
-    /*
-    encoder->EncodeBit(this->Prob, kNumBitModelTotalBits, symbol);
-    this->UpdateModel(symbol);
-    */
-    UInt32 newBound = (encoder->Range >> kNumBitModelTotalBits) * this->Prob;
-    if (symbol == 0)
-    {
-      encoder->Range = newBound;
-      this->Prob += (kBitModelTotal - this->Prob) >> numMoveBits;
-    }
-    else
-    {
-      encoder->Low += newBound;
-      encoder->Range -= newBound;
-      this->Prob -= (this->Prob) >> numMoveBits;
-    }
-    if (encoder->Range < kTopValue)
-    {
-      encoder->Range <<= 8;
-      encoder->ShiftLow();
-    }
-  }
-  UInt32 GetPrice(UInt32 symbol) const
-  {
-    return CPriceTables::ProbPrices[
-      (((this->Prob - symbol) ^ ((-(int)symbol))) & (kBitModelTotal - 1)) >> kNumMoveReducingBits];
-  }
-  UInt32 GetPrice0() const { return CPriceTables::ProbPrices[this->Prob >> kNumMoveReducingBits]; }
-  UInt32 GetPrice1() const { return CPriceTables::ProbPrices[(kBitModelTotal - this->Prob) >> kNumMoveReducingBits]; }
-};
-
-
-template <int numMoveBits>
-class CBitDecoder: public CBitModel<numMoveBits>
-{
-public:
-  UInt32 Decode(CDecoder *decoder)
-  {
-    UInt32 newBound = (decoder->Range >> kNumBitModelTotalBits) * this->Prob;
-    if (decoder->Code < newBound)
-    {
-      decoder->Range = newBound;
-      this->Prob += (kBitModelTotal - this->Prob) >> numMoveBits;
-      if (decoder->Range < kTopValue)
-      {
-        decoder->Code = (decoder->Code << 8) | decoder->Stream.ReadByte();
-        decoder->Range <<= 8;
-      }
-      return 0;
-    }
-    else
-    {
-      decoder->Range -= newBound;
-      decoder->Code -= newBound;
-      this->Prob -= (this->Prob) >> numMoveBits;
-      if (decoder->Range < kTopValue)
-      {
-        decoder->Code = (decoder->Code << 8) | decoder->Stream.ReadByte();
-        decoder->Range <<= 8;
-      }
-      return 1;
-    }
-  }
-};
-
-}}
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoderBitTree.h b/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoderBitTree.h
deleted file mode 100644
index 461e2f0..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoderBitTree.h
+++ /dev/null
@@ -1,161 +0,0 @@
-// Compress/RangeCoder/RangeCoderBitTree.h
-
-#ifndef __COMPRESS_RANGECODER_BIT_TREE_H
-#define __COMPRESS_RANGECODER_BIT_TREE_H
-
-#include "RangeCoderBit.h"
-#include "RangeCoderOpt.h"
-
-namespace NCompress {
-namespace NRangeCoder {
-
-template <int numMoveBits, int NumBitLevels>
-class CBitTreeEncoder
-{
-  CBitEncoder<numMoveBits> Models[1 << NumBitLevels];
-public:
-  void Init()
-  {
-    for(UInt32 i = 1; i < (1 << NumBitLevels); i++)
-      Models[i].Init();
-  }
-  void Encode(CEncoder *rangeEncoder, UInt32 symbol)
-  {
-    UInt32 modelIndex = 1;
-    for (int bitIndex = NumBitLevels; bitIndex != 0 ;)
-    {
-      bitIndex--;
-      UInt32 bit = (symbol >> bitIndex) & 1;
-      Models[modelIndex].Encode(rangeEncoder, bit);
-      modelIndex = (modelIndex << 1) | bit;
-    }
-  };
-  void ReverseEncode(CEncoder *rangeEncoder, UInt32 symbol)
-  {
-    UInt32 modelIndex = 1;
-    for (int i = 0; i < NumBitLevels; i++)
-    {
-      UInt32 bit = symbol & 1;
-      Models[modelIndex].Encode(rangeEncoder, bit);
-      modelIndex = (modelIndex << 1) | bit;
-      symbol >>= 1;
-    }
-  }
-  UInt32 GetPrice(UInt32 symbol) const
-  {
-    symbol |= (1 << NumBitLevels);
-    UInt32 price = 0;
-    while (symbol != 1)
-    {
-      price += Models[symbol >> 1].GetPrice(symbol & 1);
-      symbol >>= 1;
-    }
-    return price;
-  }
-  UInt32 ReverseGetPrice(UInt32 symbol) const
-  {
-    UInt32 price = 0;
-    UInt32 modelIndex = 1;
-    for (int i = NumBitLevels; i != 0; i--)
-    {
-      UInt32 bit = symbol & 1;
-      symbol >>= 1;
-      price += Models[modelIndex].GetPrice(bit);
-      modelIndex = (modelIndex << 1) | bit;
-    }
-    return price;
-  }
-};
-
-template <int numMoveBits, int NumBitLevels>
-class CBitTreeDecoder
-{
-  CBitDecoder<numMoveBits> Models[1 << NumBitLevels];
-public:
-  void Init()
-  {
-    for(UInt32 i = 1; i < (1 << NumBitLevels); i++)
-      Models[i].Init();
-  }
-  UInt32 Decode(CDecoder *rangeDecoder)
-  {
-    UInt32 modelIndex = 1;
-    RC_INIT_VAR
-    for(int bitIndex = NumBitLevels; bitIndex != 0; bitIndex--)
-    {
-      // modelIndex = (modelIndex << 1) + Models[modelIndex].Decode(rangeDecoder);
-      RC_GETBIT(numMoveBits, Models[modelIndex].Prob, modelIndex)
-    }
-    RC_FLUSH_VAR
-    return modelIndex - (1 << NumBitLevels);
-  };
-  UInt32 ReverseDecode(CDecoder *rangeDecoder)
-  {
-    UInt32 modelIndex = 1;
-    UInt32 symbol = 0;
-    RC_INIT_VAR
-    for(int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
-    {
-      // UInt32 bit = Models[modelIndex].Decode(rangeDecoder);
-      // modelIndex <<= 1;
-      // modelIndex += bit;
-      // symbol |= (bit << bitIndex);
-      RC_GETBIT2(numMoveBits, Models[modelIndex].Prob, modelIndex, ; , symbol |= (1 << bitIndex))
-    }
-    RC_FLUSH_VAR
-    return symbol;
-  }
-};
-
-template <int numMoveBits>
-void ReverseBitTreeEncode(CBitEncoder<numMoveBits> *Models,
-    CEncoder *rangeEncoder, int NumBitLevels, UInt32 symbol)
-{
-  UInt32 modelIndex = 1;
-  for (int i = 0; i < NumBitLevels; i++)
-  {
-    UInt32 bit = symbol & 1;
-    Models[modelIndex].Encode(rangeEncoder, bit);
-    modelIndex = (modelIndex << 1) | bit;
-    symbol >>= 1;
-  }
-}
-
-template <int numMoveBits>
-UInt32 ReverseBitTreeGetPrice(CBitEncoder<numMoveBits> *Models,
-    UInt32 NumBitLevels, UInt32 symbol)
-{
-  UInt32 price = 0;
-  UInt32 modelIndex = 1;
-  for (int i = NumBitLevels; i != 0; i--)
-  {
-    UInt32 bit = symbol & 1;
-    symbol >>= 1;
-    price += Models[modelIndex].GetPrice(bit);
-    modelIndex = (modelIndex << 1) | bit;
-  }
-  return price;
-}
-
-template <int numMoveBits>
-UInt32 ReverseBitTreeDecode(CBitDecoder<numMoveBits> *Models,
-    CDecoder *rangeDecoder, int NumBitLevels)
-{
-  UInt32 modelIndex = 1;
-  UInt32 symbol = 0;
-  RC_INIT_VAR
-  for(int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
-  {
-    // UInt32 bit = Models[modelIndex].Decode(rangeDecoder);
-    // modelIndex <<= 1;
-    // modelIndex += bit;
-    // symbol |= (bit << bitIndex);
-    RC_GETBIT2(numMoveBits, Models[modelIndex].Prob, modelIndex, ; , symbol |= (1 << bitIndex))
-  }
-  RC_FLUSH_VAR
-  return symbol;
-}
-
-}}
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoderOpt.h b/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoderOpt.h
deleted file mode 100644
index 5779277..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/RangeCoderOpt.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Compress/RangeCoder/RangeCoderOpt.h
-
-#ifndef __COMPRESS_RANGECODER_OPT_H
-#define __COMPRESS_RANGECODER_OPT_H
-
-#define RC_INIT_VAR \
-  UInt32 range = rangeDecoder->Range; \
-  UInt32 code = rangeDecoder->Code;
-
-#define RC_FLUSH_VAR \
-  rangeDecoder->Range = range; \
-  rangeDecoder->Code = code;
-
-#define RC_NORMALIZE \
-  if (range < NCompress::NRangeCoder::kTopValue) \
-    { code = (code << 8) | rangeDecoder->Stream.ReadByte(); range <<= 8; }
-
-#define RC_GETBIT2(numMoveBits, prob, mi, A0, A1) \
-  { UInt32 bound = (range >> NCompress::NRangeCoder::kNumBitModelTotalBits) * prob; \
-  if (code < bound) \
-  { A0; range = bound; \
-    prob += (NCompress::NRangeCoder::kBitModelTotal - prob) >> numMoveBits; \
-    mi <<= 1; } \
-  else \
-  { A1; range -= bound; code -= bound; prob -= (prob) >> numMoveBits; \
-    mi = (mi + mi) + 1; }} \
-  RC_NORMALIZE
-
-#define RC_GETBIT(numMoveBits, prob, mi) RC_GETBIT2(numMoveBits, prob, mi, ; , ;)
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/StdAfx.h b/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/StdAfx.h
deleted file mode 100644
index b637fd4..0000000
--- a/util/cbfstool/lzma/C/7zip/Compress/RangeCoder/StdAfx.h
+++ /dev/null
@@ -1,6 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/Decompress/LzmaDecode.c b/util/cbfstool/lzma/C/7zip/Decompress/LzmaDecode.c
deleted file mode 100644
index 8350843..0000000
--- a/util/cbfstool/lzma/C/7zip/Decompress/LzmaDecode.c
+++ /dev/null
@@ -1,588 +0,0 @@
-/*
-  LzmaDecode.c
-  LZMA Decoder (optimized for Speed version)
-
-  LZMA SDK 4.22 Copyright (c) 1999-2005 Igor Pavlov (2005-06-10)
-  http://www.7-zip.org/
-
-  LZMA SDK is licensed under two licenses:
-  1) GNU Lesser General Public License (GNU LGPL)
-  2) Common Public License (CPL)
-  It means that you can select one of these two licenses and
-  follow rules of that license.
-
-  SPECIAL EXCEPTION:
-  Igor Pavlov, as the author of this Code, expressly permits you to
-  statically or dynamically link your Code (or bind by name) to the
-  interfaces of this file without subjecting your linked Code to the
-  terms of the CPL or GNU LGPL. Any modifications or additions
-  to this file, however, are subject to the LGPL or CPL terms.
-*/
-
-#include "LzmaDecode.h"
-
-#ifndef Byte
-#define Byte unsigned char
-#endif
-
-#define kNumTopBits 24
-#define kTopValue ((UInt32)1 << kNumTopBits)
-
-#define kNumBitModelTotalBits 11
-#define kBitModelTotal (1 << kNumBitModelTotalBits)
-#define kNumMoveBits 5
-
-#define RC_READ_BYTE (*Buffer++)
-
-#define RC_INIT2 Code = 0; Range = 0xFFFFFFFF; \
-  { int i; for(i = 0; i < 5; i++) { RC_TEST; Code = (Code << 8) | RC_READ_BYTE; }}
-
-#ifdef _LZMA_IN_CB
-
-#define RC_TEST { if (Buffer == BufferLim) \
-  { SizeT size; int result = InCallback->Read(InCallback, &Buffer, &size); if (result != LZMA_RESULT_OK) return result; \
-  BufferLim = Buffer + size; if (size == 0) return LZMA_RESULT_DATA_ERROR; }}
-
-#define RC_INIT Buffer = BufferLim = 0; RC_INIT2
-
-#else
-
-#define RC_TEST { if (Buffer == BufferLim) return LZMA_RESULT_DATA_ERROR; }
-
-#define RC_INIT(buffer, bufferSize) Buffer = buffer; BufferLim = buffer + bufferSize; RC_INIT2
-
-#endif
-
-#define RC_NORMALIZE if (Range < kTopValue) { RC_TEST; Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; }
-
-#define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound)
-#define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits;
-#define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits;
-
-#define RC_GET_BIT2(p, mi, A0, A1) IfBit0(p) \
-  { UpdateBit0(p); mi <<= 1; A0; } else \
-  { UpdateBit1(p); mi = (mi + mi) + 1; A1; }
-
-#define RC_GET_BIT(p, mi) RC_GET_BIT2(p, mi, ; , ;)
-
-#define RangeDecoderBitTreeDecode(probs, numLevels, res) \
-  { int i = numLevels; res = 1; \
-  do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); \
-  res -= (1 << numLevels); }
-
-
-#define kNumPosBitsMax 4
-#define kNumPosStatesMax (1 << kNumPosBitsMax)
-
-#define kLenNumLowBits 3
-#define kLenNumLowSymbols (1 << kLenNumLowBits)
-#define kLenNumMidBits 3
-#define kLenNumMidSymbols (1 << kLenNumMidBits)
-#define kLenNumHighBits 8
-#define kLenNumHighSymbols (1 << kLenNumHighBits)
-
-#define LenChoice 0
-#define LenChoice2 (LenChoice + 1)
-#define LenLow (LenChoice2 + 1)
-#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
-#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
-#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
-
-
-#define kNumStates 12
-#define kNumLitStates 7
-
-#define kStartPosModelIndex 4
-#define kEndPosModelIndex 14
-#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
-
-#define kNumPosSlotBits 6
-#define kNumLenToPosStates 4
-
-#define kNumAlignBits 4
-#define kAlignTableSize (1 << kNumAlignBits)
-
-#define kMatchMinLen 2
-
-#define IsMatch 0
-#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
-#define IsRepG0 (IsRep + kNumStates)
-#define IsRepG1 (IsRepG0 + kNumStates)
-#define IsRepG2 (IsRepG1 + kNumStates)
-#define IsRep0Long (IsRepG2 + kNumStates)
-#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
-#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
-#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
-#define LenCoder (Align + kAlignTableSize)
-#define RepLenCoder (LenCoder + kNumLenProbs)
-#define Literal (RepLenCoder + kNumLenProbs)
-
-#if Literal != LZMA_BASE_SIZE
-StopCompilingDueBUG
-#endif
-
-int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size)
-{
-  unsigned char prop0;
-  if (size < LZMA_PROPERTIES_SIZE)
-    return LZMA_RESULT_DATA_ERROR;
-  prop0 = propsData[0];
-  if (prop0 >= (9 * 5 * 5))
-    return LZMA_RESULT_DATA_ERROR;
-  {
-    for (propsRes->pb = 0; prop0 >= (9 * 5); propsRes->pb++, prop0 -= (9 * 5));
-    for (propsRes->lp = 0; prop0 >= 9; propsRes->lp++, prop0 -= 9);
-    propsRes->lc = prop0;
-    /*
-    unsigned char remainder = (unsigned char)(prop0 / 9);
-    propsRes->lc = prop0 % 9;
-    propsRes->pb = remainder / 5;
-    propsRes->lp = remainder % 5;
-    */
-  }
-
-  #ifdef _LZMA_OUT_READ
-  {
-    int i;
-    propsRes->DictionarySize = 0;
-    for (i = 0; i < 4; i++)
-      propsRes->DictionarySize += (UInt32)(propsData[1 + i]) << (i * 8);
-    if (propsRes->DictionarySize == 0)
-      propsRes->DictionarySize = 1;
-  }
-  #endif
-  return LZMA_RESULT_OK;
-}
-
-#define kLzmaStreamWasFinishedId (-1)
-
-int LzmaDecode(CLzmaDecoderState *vs,
-    #ifdef _LZMA_IN_CB
-    ILzmaInCallback *InCallback,
-    #else
-    const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed,
-    #endif
-    unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed)
-{
-  CProb *p = vs->Probs;
-  SizeT nowPos = 0;
-  Byte previousByte = 0;
-  UInt32 posStateMask = (1 << (vs->Properties.pb)) - 1;
-  UInt32 literalPosMask = (1 << (vs->Properties.lp)) - 1;
-  int lc = vs->Properties.lc;
-
-  #ifdef _LZMA_OUT_READ
-
-  UInt32 Range = vs->Range;
-  UInt32 Code = vs->Code;
-  #ifdef _LZMA_IN_CB
-  const Byte *Buffer = vs->Buffer;
-  const Byte *BufferLim = vs->BufferLim;
-  #else
-  const Byte *Buffer = inStream;
-  const Byte *BufferLim = inStream + inSize;
-  #endif
-  int state = vs->State;
-  UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3];
-  int len = vs->RemainLen;
-  UInt32 globalPos = vs->GlobalPos;
-  UInt32 distanceLimit = vs->DistanceLimit;
-
-  Byte *dictionary = vs->Dictionary;
-  UInt32 dictionarySize = vs->Properties.DictionarySize;
-  UInt32 dictionaryPos = vs->DictionaryPos;
-
-  Byte tempDictionary[4];
-
-  #ifndef _LZMA_IN_CB
-  *inSizeProcessed = 0;
-  #endif
-  *outSizeProcessed = 0;
-  if (len == kLzmaStreamWasFinishedId)
-    return LZMA_RESULT_OK;
-
-  if (dictionarySize == 0)
-  {
-    dictionary = tempDictionary;
-    dictionarySize = 1;
-    tempDictionary[0] = vs->TempDictionary[0];
-  }
-
-  if (len == kLzmaNeedInitId)
-  {
-    {
-      UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp));
-      UInt32 i;
-      for (i = 0; i < numProbs; i++)
-        p[i] = kBitModelTotal >> 1;
-      rep0 = rep1 = rep2 = rep3 = 1;
-      state = 0;
-      globalPos = 0;
-      distanceLimit = 0;
-      dictionaryPos = 0;
-      dictionary[dictionarySize - 1] = 0;
-      #ifdef _LZMA_IN_CB
-      RC_INIT;
-      #else
-      RC_INIT(inStream, inSize);
-      #endif
-    }
-    len = 0;
-  }
-  while(len != 0 && nowPos < outSize)
-  {
-    UInt32 pos = dictionaryPos - rep0;
-    if (pos >= dictionarySize)
-      pos += dictionarySize;
-    outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos];
-    if (++dictionaryPos == dictionarySize)
-      dictionaryPos = 0;
-    len--;
-  }
-  if (dictionaryPos == 0)
-    previousByte = dictionary[dictionarySize - 1];
-  else
-    previousByte = dictionary[dictionaryPos - 1];
-
-  #else /* if !_LZMA_OUT_READ */
-
-  int state = 0;
-  UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1;
-  int len = 0;
-  const Byte *Buffer;
-  const Byte *BufferLim;
-  UInt32 Range;
-  UInt32 Code;
-
-  #ifndef _LZMA_IN_CB
-  *inSizeProcessed = 0;
-  #endif
-  *outSizeProcessed = 0;
-
-  {
-    UInt32 i;
-    UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp));
-    for (i = 0; i < numProbs; i++)
-      p[i] = kBitModelTotal >> 1;
-  }
-
-  #ifdef _LZMA_IN_CB
-  RC_INIT;
-  #else
-  RC_INIT(inStream, inSize);
-  #endif
-
-  #endif /* _LZMA_OUT_READ */
-
-  while(nowPos < outSize)
-  {
-    CProb *prob;
-    UInt32 bound;
-    int posState = (int)(
-        (nowPos
-        #ifdef _LZMA_OUT_READ
-        + globalPos
-        #endif
-        )
-        & posStateMask);
-
-    prob = p + IsMatch + (state << kNumPosBitsMax) + posState;
-    IfBit0(prob)
-    {
-      int symbol = 1;
-      UpdateBit0(prob)
-      prob = p + Literal + (LZMA_LIT_SIZE *
-        (((
-        (nowPos
-        #ifdef _LZMA_OUT_READ
-        + globalPos
-        #endif
-        )
-        & literalPosMask) << lc) + (previousByte >> (8 - lc))));
-
-      if (state >= kNumLitStates)
-      {
-        int matchByte;
-        #ifdef _LZMA_OUT_READ
-        UInt32 pos = dictionaryPos - rep0;
-        if (pos >= dictionarySize)
-          pos += dictionarySize;
-        matchByte = dictionary[pos];
-        #else
-        matchByte = outStream[nowPos - rep0];
-        #endif
-        do
-        {
-          int bit;
-          CProb *probLit;
-          matchByte <<= 1;
-          bit = (matchByte & 0x100);
-          probLit = prob + 0x100 + bit + symbol;
-          RC_GET_BIT2(probLit, symbol, if (bit != 0) break, if (bit == 0) break)
-        }
-        while (symbol < 0x100);
-      }
-      while (symbol < 0x100)
-      {
-        CProb *probLit = prob + symbol;
-        RC_GET_BIT(probLit, symbol)
-      }
-      previousByte = (Byte)symbol;
-
-      outStream[nowPos++] = previousByte;
-      #ifdef _LZMA_OUT_READ
-      if (distanceLimit < dictionarySize)
-        distanceLimit++;
-
-      dictionary[dictionaryPos] = previousByte;
-      if (++dictionaryPos == dictionarySize)
-        dictionaryPos = 0;
-      #endif
-      if (state < 4) state = 0;
-      else if (state < 10) state -= 3;
-      else state -= 6;
-    }
-    else
-    {
-      UpdateBit1(prob);
-      prob = p + IsRep + state;
-      IfBit0(prob)
-      {
-        UpdateBit0(prob);
-        rep3 = rep2;
-        rep2 = rep1;
-        rep1 = rep0;
-        state = state < kNumLitStates ? 0 : 3;
-        prob = p + LenCoder;
-      }
-      else
-      {
-        UpdateBit1(prob);
-        prob = p + IsRepG0 + state;
-        IfBit0(prob)
-        {
-          UpdateBit0(prob);
-          prob = p + IsRep0Long + (state << kNumPosBitsMax) + posState;
-          IfBit0(prob)
-          {
-            #ifdef _LZMA_OUT_READ
-            UInt32 pos;
-            #endif
-            UpdateBit0(prob);
-
-            #ifdef _LZMA_OUT_READ
-            if (distanceLimit == 0)
-            #else
-            if (nowPos == 0)
-            #endif
-              return LZMA_RESULT_DATA_ERROR;
-
-            state = state < kNumLitStates ? 9 : 11;
-            #ifdef _LZMA_OUT_READ
-            pos = dictionaryPos - rep0;
-            if (pos >= dictionarySize)
-              pos += dictionarySize;
-            previousByte = dictionary[pos];
-            dictionary[dictionaryPos] = previousByte;
-            if (++dictionaryPos == dictionarySize)
-              dictionaryPos = 0;
-            #else
-            previousByte = outStream[nowPos - rep0];
-            #endif
-            outStream[nowPos++] = previousByte;
-            #ifdef _LZMA_OUT_READ
-            if (distanceLimit < dictionarySize)
-              distanceLimit++;
-            #endif
-
-            continue;
-          }
-          else
-          {
-            UpdateBit1(prob);
-          }
-        }
-        else
-        {
-          UInt32 distance;
-          UpdateBit1(prob);
-          prob = p + IsRepG1 + state;
-          IfBit0(prob)
-          {
-            UpdateBit0(prob);
-            distance = rep1;
-          }
-          else
-          {
-            UpdateBit1(prob);
-            prob = p + IsRepG2 + state;
-            IfBit0(prob)
-            {
-              UpdateBit0(prob);
-              distance = rep2;
-            }
-            else
-            {
-              UpdateBit1(prob);
-              distance = rep3;
-              rep3 = rep2;
-            }
-            rep2 = rep1;
-          }
-          rep1 = rep0;
-          rep0 = distance;
-        }
-        state = state < kNumLitStates ? 8 : 11;
-        prob = p + RepLenCoder;
-      }
-      {
-        int numBits, offset;
-        CProb *probLen = prob + LenChoice;
-        IfBit0(probLen)
-        {
-          UpdateBit0(probLen);
-          probLen = prob + LenLow + (posState << kLenNumLowBits);
-          offset = 0;
-          numBits = kLenNumLowBits;
-        }
-        else
-        {
-          UpdateBit1(probLen);
-          probLen = prob + LenChoice2;
-          IfBit0(probLen)
-          {
-            UpdateBit0(probLen);
-            probLen = prob + LenMid + (posState << kLenNumMidBits);
-            offset = kLenNumLowSymbols;
-            numBits = kLenNumMidBits;
-          }
-          else
-          {
-            UpdateBit1(probLen);
-            probLen = prob + LenHigh;
-            offset = kLenNumLowSymbols + kLenNumMidSymbols;
-            numBits = kLenNumHighBits;
-          }
-        }
-        RangeDecoderBitTreeDecode(probLen, numBits, len);
-        len += offset;
-      }
-
-      if (state < 4)
-      {
-        int posSlot;
-        state += kNumLitStates;
-        prob = p + PosSlot +
-            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
-            kNumPosSlotBits);
-        RangeDecoderBitTreeDecode(prob, kNumPosSlotBits, posSlot);
-        if (posSlot >= kStartPosModelIndex)
-        {
-          int numDirectBits = ((posSlot >> 1) - 1);
-          rep0 = (2 | ((UInt32)posSlot & 1));
-          if (posSlot < kEndPosModelIndex)
-          {
-            rep0 <<= numDirectBits;
-            prob = p + SpecPos + rep0 - posSlot - 1;
-          }
-          else
-          {
-            numDirectBits -= kNumAlignBits;
-            do
-            {
-              RC_NORMALIZE
-              Range >>= 1;
-              rep0 <<= 1;
-              if (Code >= Range)
-              {
-                Code -= Range;
-                rep0 |= 1;
-              }
-            }
-            while (--numDirectBits != 0);
-            prob = p + Align;
-            rep0 <<= kNumAlignBits;
-            numDirectBits = kNumAlignBits;
-          }
-          {
-            int i = 1;
-            int mi = 1;
-            do
-            {
-              CProb *prob3 = prob + mi;
-              RC_GET_BIT2(prob3, mi, ; , rep0 |= i);
-              i <<= 1;
-            }
-            while(--numDirectBits != 0);
-          }
-        }
-        else
-          rep0 = posSlot;
-        if (++rep0 == (UInt32)(0))
-        {
-          /* it's for stream version */
-          len = kLzmaStreamWasFinishedId;
-          break;
-        }
-      }
-
-      len += kMatchMinLen;
-      #ifdef _LZMA_OUT_READ
-      if (rep0 > distanceLimit)
-      #else
-      if (rep0 > nowPos)
-      #endif
-        return LZMA_RESULT_DATA_ERROR;
-
-      #ifdef _LZMA_OUT_READ
-      if (dictionarySize - distanceLimit > (UInt32)len)
-        distanceLimit += len;
-      else
-        distanceLimit = dictionarySize;
-      #endif
-
-      do
-      {
-        #ifdef _LZMA_OUT_READ
-        UInt32 pos = dictionaryPos - rep0;
-        if (pos >= dictionarySize)
-          pos += dictionarySize;
-        previousByte = dictionary[pos];
-        dictionary[dictionaryPos] = previousByte;
-        if (++dictionaryPos == dictionarySize)
-          dictionaryPos = 0;
-        #else
-        previousByte = outStream[nowPos - rep0];
-        #endif
-        len--;
-        outStream[nowPos++] = previousByte;
-      }
-      while(len != 0 && nowPos < outSize);
-    }
-  }
-  RC_NORMALIZE;
-
-  #ifdef _LZMA_OUT_READ
-  vs->Range = Range;
-  vs->Code = Code;
-  vs->DictionaryPos = dictionaryPos;
-  vs->GlobalPos = globalPos + (UInt32)nowPos;
-  vs->DistanceLimit = distanceLimit;
-  vs->Reps[0] = rep0;
-  vs->Reps[1] = rep1;
-  vs->Reps[2] = rep2;
-  vs->Reps[3] = rep3;
-  vs->State = state;
-  vs->RemainLen = len;
-  vs->TempDictionary[0] = tempDictionary[0];
-  #endif
-
-  #ifdef _LZMA_IN_CB
-  vs->Buffer = Buffer;
-  vs->BufferLim = BufferLim;
-  #else
-  *inSizeProcessed = (SizeT)(Buffer - inStream);
-  #endif
-  *outSizeProcessed = nowPos;
-  return LZMA_RESULT_OK;
-}
diff --git a/util/cbfstool/lzma/C/7zip/Decompress/LzmaDecode.h b/util/cbfstool/lzma/C/7zip/Decompress/LzmaDecode.h
deleted file mode 100644
index abc02d7..0000000
--- a/util/cbfstool/lzma/C/7zip/Decompress/LzmaDecode.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
-  LzmaDecode.h
-  LZMA Decoder interface
-
-  LZMA SDK 4.21 Copyright (c) 1999-2005 Igor Pavlov (2005-06-08)
-  http://www.7-zip.org/
-
-  LZMA SDK is licensed under two licenses:
-  1) GNU Lesser General Public License (GNU LGPL)
-  2) Common Public License (CPL)
-  It means that you can select one of these two licenses and
-  follow rules of that license.
-
-  SPECIAL EXCEPTION:
-  Igor Pavlov, as the author of this code, expressly permits you to
-  statically or dynamically link your code (or bind by name) to the
-  interfaces of this file without subjecting your linked code to the
-  terms of the CPL or GNU LGPL. Any modifications or additions
-  to this file, however, are subject to the LGPL or CPL terms.
-*/
-
-#ifndef __LZMADECODE_H
-#define __LZMADECODE_H
-
-/* #define _LZMA_IN_CB */
-/* Use callback for input data */
-
-/* #define _LZMA_OUT_READ */
-/* Use read function for output data */
-
-/* #define _LZMA_PROB32 */
-/* It can increase speed on some 32-bit CPUs,
-   but memory usage will be doubled in that case */
-
-/* #define _LZMA_LOC_OPT */
-/* Enable local speed optimizations inside code */
-
-/* #define _LZMA_SYSTEM_SIZE_T */
-/* Use system's size_t. You can use it to enable 64-bit sizes supporting*/
-
-#ifndef UInt32
-#ifdef _LZMA_UINT32_IS_ULONG
-#define UInt32 unsigned long
-#else
-#define UInt32 unsigned int
-#endif
-#endif
-
-#ifndef SizeT
-#ifdef _LZMA_SYSTEM_SIZE_T
-#include <stddef.h>
-#define SizeT size_t
-#else
-#define SizeT UInt32
-#endif
-#endif
-
-#ifdef _LZMA_PROB32
-#define CProb UInt32
-#else
-#define CProb unsigned short
-#endif
-
-#define LZMA_RESULT_OK 0
-#define LZMA_RESULT_DATA_ERROR 1
-
-#ifdef _LZMA_IN_CB
-typedef struct _ILzmaInCallback
-{
-  int (*Read)(void *object, const unsigned char **buffer, SizeT *bufferSize);
-} ILzmaInCallback;
-#endif
-
-#define LZMA_BASE_SIZE 1846
-#define LZMA_LIT_SIZE 768
-
-#define LZMA_PROPERTIES_SIZE 5
-
-typedef struct _CLzmaProperties
-{
-  int lc;
-  int lp;
-  int pb;
-  #ifdef _LZMA_OUT_READ
-  UInt32 DictionarySize;
-  #endif
-}CLzmaProperties;
-
-int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size);
-
-#define LzmaGetNumProbs(Properties) (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((Properties)->lc + (Properties)->lp)))
-
-#define kLzmaNeedInitId (-2)
-
-typedef struct _CLzmaDecoderState
-{
-  CLzmaProperties Properties;
-  CProb *Probs;
-
-  #ifdef _LZMA_IN_CB
-  const unsigned char *Buffer;
-  const unsigned char *BufferLim;
-  #endif
-
-  #ifdef _LZMA_OUT_READ
-  unsigned char *Dictionary;
-  UInt32 Range;
-  UInt32 Code;
-  UInt32 DictionaryPos;
-  UInt32 GlobalPos;
-  UInt32 DistanceLimit;
-  UInt32 Reps[4];
-  int State;
-  int RemainLen;
-  unsigned char TempDictionary[4];
-  #endif
-} CLzmaDecoderState;
-
-#ifdef _LZMA_OUT_READ
-#define LzmaDecoderInit(vs) { (vs)->RemainLen = kLzmaNeedInitId; }
-#endif
-
-int LzmaDecode(CLzmaDecoderState *vs,
-    #ifdef _LZMA_IN_CB
-    ILzmaInCallback *inCallback,
-    #else
-    const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed,
-    #endif
-    unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed);
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/ICoder.h b/util/cbfstool/lzma/C/7zip/ICoder.h
deleted file mode 100644
index 3d1d8f0..0000000
--- a/util/cbfstool/lzma/C/7zip/ICoder.h
+++ /dev/null
@@ -1,163 +0,0 @@
-// ICoder.h
-
-#ifndef __ICODER_H
-#define __ICODER_H
-
-#include "IStream.h"
-
-// "23170F69-40C1-278A-0000-000400xx0000"
-#define CODER_INTERFACE(i, x) \
-DEFINE_GUID(IID_ ## i, \
-0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x04, 0x00, x, 0x00, 0x00); \
-struct i: public IUnknown
-
-CODER_INTERFACE(ICompressProgressInfo, 0x04)
-{
-  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize) PURE;
-};
-
-CODER_INTERFACE(ICompressCoder, 0x05)
-{
-  STDMETHOD(Code)(ISequentialInStream *inStream,
-      ISequentialOutStream *outStream,
-      const UInt64 *inSize,
-      const UInt64 *outSize,
-      ICompressProgressInfo *progress) PURE;
-};
-
-CODER_INTERFACE(ICompressCoder2, 0x18)
-{
-  STDMETHOD(Code)(ISequentialInStream **inStreams,
-      const UInt64 **inSizes,
-      UInt32 numInStreams,
-      ISequentialOutStream **outStreams,
-      const UInt64 **outSizes,
-      UInt32 numOutStreams,
-      ICompressProgressInfo *progress) PURE;
-};
-
-namespace NCoderPropID
-{
-  enum EEnum
-  {
-    kDictionarySize = 0x400,
-    kUsedMemorySize,
-    kOrder,
-    kPosStateBits = 0x440,
-    kLitContextBits,
-    kLitPosBits,
-    kNumFastBytes = 0x450,
-    kMatchFinder,
-    kMatchFinderCycles,
-    kNumPasses = 0x460,
-    kAlgorithm = 0x470,
-    kMultiThread = 0x480,
-    kNumThreads,
-    kEndMarker = 0x490
-  };
-}
-
-CODER_INTERFACE(ICompressSetCoderProperties, 0x20)
-{
-  STDMETHOD(SetCoderProperties)(const PROPID *propIDs,
-      const PROPVARIANT *properties, UInt32 numProperties) PURE;
-};
-
-/*
-CODER_INTERFACE(ICompressSetCoderProperties, 0x21)
-{
-  STDMETHOD(SetDecoderProperties)(ISequentialInStream *inStream) PURE;
-};
-*/
-
-CODER_INTERFACE(ICompressSetDecoderProperties2, 0x22)
-{
-  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size) PURE;
-};
-
-CODER_INTERFACE(ICompressWriteCoderProperties, 0x23)
-{
-  STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStreams) PURE;
-};
-
-CODER_INTERFACE(ICompressGetInStreamProcessedSize, 0x24)
-{
-  STDMETHOD(GetInStreamProcessedSize)(UInt64 *value) PURE;
-};
-
-CODER_INTERFACE(ICompressSetCoderMt, 0x25)
-{
-  STDMETHOD(SetNumberOfThreads)(UInt32 numThreads) PURE;
-};
-
-CODER_INTERFACE(ICompressGetSubStreamSize, 0x30)
-{
-  STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value) PURE;
-};
-
-CODER_INTERFACE(ICompressSetInStream, 0x31)
-{
-  STDMETHOD(SetInStream)(ISequentialInStream *inStream) PURE;
-  STDMETHOD(ReleaseInStream)() PURE;
-};
-
-CODER_INTERFACE(ICompressSetOutStream, 0x32)
-{
-  STDMETHOD(SetOutStream)(ISequentialOutStream *outStream) PURE;
-  STDMETHOD(ReleaseOutStream)() PURE;
-};
-
-CODER_INTERFACE(ICompressSetInStreamSize, 0x33)
-{
-  STDMETHOD(SetInStreamSize)(const UInt64 *inSize) PURE;
-};
-
-CODER_INTERFACE(ICompressSetOutStreamSize, 0x34)
-{
-  STDMETHOD(SetOutStreamSize)(const UInt64 *outSize) PURE;
-};
-
-CODER_INTERFACE(ICompressFilter, 0x40)
-{
-  STDMETHOD(Init)() PURE;
-  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) PURE;
-  // Filter return outSize (UInt32)
-  // if (outSize <= size): Filter have converted outSize bytes
-  // if (outSize > size): Filter have not converted anything.
-  //      and it needs at least outSize bytes to convert one block
-  //      (it's for crypto block algorithms).
-};
-
-CODER_INTERFACE(ICryptoProperties, 0x80)
-{
-  STDMETHOD(SetKey)(const Byte *data, UInt32 size) PURE;
-  STDMETHOD(SetInitVector)(const Byte *data, UInt32 size) PURE;
-};
-
-CODER_INTERFACE(ICryptoSetPassword, 0x90)
-{
-  STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size) PURE;
-};
-
-CODER_INTERFACE(ICryptoSetCRC, 0xA0)
-{
-  STDMETHOD(CryptoSetCRC)(UInt32 crc) PURE;
-};
-
-//////////////////////
-// It's for DLL file
-namespace NMethodPropID
-{
-  enum EEnum
-  {
-    kID,
-    kName,
-    kDecoder,
-    kEncoder,
-    kInStreams,
-    kOutStreams,
-    kDescription
-  };
-}
-
-#endif
diff --git a/util/cbfstool/lzma/C/7zip/IStream.h b/util/cbfstool/lzma/C/7zip/IStream.h
deleted file mode 100644
index b638efe..0000000
--- a/util/cbfstool/lzma/C/7zip/IStream.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// IStream.h
-
-#ifndef __ISTREAM_H
-#define __ISTREAM_H
-
-#include "../Common/MyUnknown.h"
-#include "../Common/Types.h"
-
-// "23170F69-40C1-278A-0000-000300xx0000"
-
-#define STREAM_INTERFACE_SUB(i, b, x) \
-DEFINE_GUID(IID_ ## i, \
-0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x03, 0x00, x, 0x00, 0x00); \
-struct i: public b
-
-#define STREAM_INTERFACE(i, x) STREAM_INTERFACE_SUB(i, IUnknown, x)
-
-STREAM_INTERFACE(ISequentialInStream, 0x01)
-{
-  STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize) PURE;
-  /*
-  Out: if size != 0, return_value = S_OK and (*processedSize == 0),
-    then there are no more bytes in stream.
-  if (size > 0) && there are bytes in stream,
-  this function must read at least 1 byte.
-  This function is allowed to read less than number of remaining bytes in stream.
-  You must call Read function in loop, if you need exact amount of data
-  */
-};
-
-STREAM_INTERFACE(ISequentialOutStream, 0x02)
-{
-  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize) PURE;
-  /*
-  if (size > 0) this function must write at least 1 byte.
-  This function is allowed to write less than "size".
-  You must call Write function in loop, if you need to write exact amount of data
-  */
-};
-
-STREAM_INTERFACE_SUB(IInStream, ISequentialInStream, 0x03)
-{
-  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE;
-};
-
-STREAM_INTERFACE_SUB(IOutStream, ISequentialOutStream, 0x04)
-{
-  STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE;
-  STDMETHOD(SetSize)(Int64 newSize) PURE;
-};
-
-STREAM_INTERFACE(IStreamGetSize, 0x06)
-{
-  STDMETHOD(GetSize)(UInt64 *size) PURE;
-};
-
-STREAM_INTERFACE(IOutStreamFlush, 0x07)
-{
-  STDMETHOD(Flush)() PURE;
-};
-
-#endif
diff --git a/util/cbfstool/lzma/C/Common/Alloc.cpp b/util/cbfstool/lzma/C/Common/Alloc.cpp
deleted file mode 100644
index bdba16d..0000000
--- a/util/cbfstool/lzma/C/Common/Alloc.cpp
+++ /dev/null
@@ -1,118 +0,0 @@
-// Common/Alloc.cpp
-
-#include "StdAfx.h"
-
-#ifdef _WIN32
-#include "MyWindows.h"
-#else
-#include <stdlib.h>
-#endif
-
-#include "Alloc.h"
-
-/* #define _SZ_ALLOC_DEBUG */
-/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */
-#ifdef _SZ_ALLOC_DEBUG
-#include <stdio.h>
-int g_allocCount = 0;
-int g_allocCountMid = 0;
-int g_allocCountBig = 0;
-#endif
-
-void *MyAlloc(size_t size) throw()
-{
-  if (size == 0)
-    return 0;
-  #ifdef _SZ_ALLOC_DEBUG
-  fprintf(stderr, "\nAlloc %10d bytes; count = %10d", size, g_allocCount++);
-  #endif
-  return ::malloc(size);
-}
-
-void MyFree(void *address) throw()
-{
-  #ifdef _SZ_ALLOC_DEBUG
-  if (address != 0)
-    fprintf(stderr, "\nFree; count = %10d", --g_allocCount);
-  #endif
-
-  ::free(address);
-}
-
-#ifdef _WIN32
-
-void *MidAlloc(size_t size) throw()
-{
-  if (size == 0)
-    return 0;
-  #ifdef _SZ_ALLOC_DEBUG
-  fprintf(stderr, "\nAlloc_Mid %10d bytes;  count = %10d", size, g_allocCountMid++);
-  #endif
-  return ::VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE);
-}
-
-void MidFree(void *address) throw()
-{
-  #ifdef _SZ_ALLOC_DEBUG
-  if (address != 0)
-    fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid);
-  #endif
-  if (address == 0)
-    return;
-  ::VirtualFree(address, 0, MEM_RELEASE);
-}
-
-static SIZE_T g_LargePageSize =
-    #ifdef _WIN64
-    (1 << 21);
-    #else
-    (1 << 22);
-    #endif
-
-typedef SIZE_T (WINAPI *GetLargePageMinimumP)();
-
-bool SetLargePageSize()
-{
-  GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP)
-        ::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum");
-  if (largePageMinimum == 0)
-    return false;
-  SIZE_T size = largePageMinimum();
-  if (size == 0 || (size & (size - 1)) != 0)
-    return false;
-  g_LargePageSize = size;
-  return true;
-}
-
-
-void *BigAlloc(size_t size) throw()
-{
-  if (size == 0)
-    return 0;
-  #ifdef _SZ_ALLOC_DEBUG
-  fprintf(stderr, "\nAlloc_Big %10d bytes;  count = %10d", size, g_allocCountBig++);
-  #endif
-
-  if (size >= (1 << 18))
-  {
-    void *res = ::VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)),
-        MEM_COMMIT, PAGE_READWRITE);
-    if (res != 0)
-      return res;
-  }
-  return ::VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE);
-}
-
-void BigFree(void *address) throw()
-{
-  #ifdef _SZ_ALLOC_DEBUG
-  if (address != 0)
-    fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig);
-  #endif
-
-  if (address == 0)
-    return;
-  ::VirtualFree(address, 0, MEM_RELEASE);
-}
-
-#endif
diff --git a/util/cbfstool/lzma/C/Common/Alloc.h b/util/cbfstool/lzma/C/Common/Alloc.h
deleted file mode 100644
index d444f63..0000000
--- a/util/cbfstool/lzma/C/Common/Alloc.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Common/Alloc.h
-
-#ifndef __COMMON_ALLOC_H
-#define __COMMON_ALLOC_H
-
-#include <stddef.h>
-
-void *MyAlloc(size_t size) throw();
-void MyFree(void *address) throw();
-
-#ifdef _WIN32
-
-bool SetLargePageSize();
-
-void *MidAlloc(size_t size) throw();
-void MidFree(void *address) throw();
-void *BigAlloc(size_t size) throw();
-void BigFree(void *address) throw();
-
-#else
-
-#define MidAlloc(size) MyAlloc(size)
-#define MidFree(address) MyFree(address)
-#define BigAlloc(size) MyAlloc(size)
-#define BigFree(address) MyFree(address)
-
-#endif
-
-#endif
diff --git a/util/cbfstool/lzma/C/Common/CRC.cpp b/util/cbfstool/lzma/C/Common/CRC.cpp
deleted file mode 100644
index de5d561..0000000
--- a/util/cbfstool/lzma/C/Common/CRC.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-// Common/CRC.cpp
-
-#include "StdAfx.h"
-
-#include "CRC.h"
-
-static const UInt32 kCRCPoly = 0xEDB88320;
-
-UInt32 CCRC::Table[256];
-
-void CCRC::InitTable()
-{
-  for (UInt32 i = 0; i < 256; i++)
-  {
-    UInt32 r = i;
-    for (int j = 0; j < 8; j++)
-      if (r & 1)
-        r = (r >> 1) ^ kCRCPoly;
-      else
-        r >>= 1;
-    CCRC::Table[i] = r;
-  }
-}
-
-class CCRCTableInit
-{
-public:
-  CCRCTableInit() { CCRC::InitTable(); }
-} g_CRCTableInit;
-
-void CCRC::UpdateByte(Byte b)
-{
-  _value = Table[((Byte)(_value)) ^ b] ^ (_value >> 8);
-}
-
-void CCRC::UpdateUInt16(UInt16 v)
-{
-  UpdateByte(Byte(v));
-  UpdateByte(Byte(v >> 8));
-}
-
-void CCRC::UpdateUInt32(UInt32 v)
-{
-  for (int i = 0; i < 4; i++)
-    UpdateByte((Byte)(v >> (8 * i)));
-}
-
-void CCRC::UpdateUInt64(UInt64 v)
-{
-  for (int i = 0; i < 8; i++)
-    UpdateByte((Byte)(v >> (8 * i)));
-}
-
-void CCRC::Update(const void *data, size_t size)
-{
-  UInt32 v = _value;
-  const Byte *p = (const Byte *)data;
-  for (; size > 0 ; size--, p++)
-    v = Table[((Byte)(v)) ^ *p] ^ (v >> 8);
-  _value = v;
-}
diff --git a/util/cbfstool/lzma/C/Common/CRC.h b/util/cbfstool/lzma/C/Common/CRC.h
deleted file mode 100644
index f3279a5..0000000
--- a/util/cbfstool/lzma/C/Common/CRC.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Common/CRC.h
-
-#ifndef __COMMON_CRC_H
-#define __COMMON_CRC_H
-
-#include <stddef.h>
-#include "Types.h"
-
-class CCRC
-{
-  UInt32 _value;
-public:
-	static UInt32 Table[256];
-	static void InitTable();
-
-  CCRC():  _value(0xFFFFFFFF){};
-  void Init() { _value = 0xFFFFFFFF; }
-  void UpdateByte(Byte v);
-  void UpdateUInt16(UInt16 v);
-  void UpdateUInt32(UInt32 v);
-  void UpdateUInt64(UInt64 v);
-  void Update(const void *data, size_t size);
-  UInt32 GetDigest() const { return _value ^ 0xFFFFFFFF; }
-  static UInt32 CalculateDigest(const void *data, size_t size)
-  {
-    CCRC crc;
-    crc.Update(data, size);
-    return crc.GetDigest();
-  }
-  static bool VerifyDigest(UInt32 digest, const void *data, size_t size)
-  {
-    return (CalculateDigest(data, size) == digest);
-  }
-};
-
-#endif
diff --git a/util/cbfstool/lzma/C/Common/Defs.h b/util/cbfstool/lzma/C/Common/Defs.h
deleted file mode 100644
index dad3ae8..0000000
--- a/util/cbfstool/lzma/C/Common/Defs.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Common/Defs.h
-
-#ifndef __COMMON_DEFS_H
-#define __COMMON_DEFS_H
-
-template <class T> inline T MyMin(T a, T b)
-  {  return a < b ? a : b; }
-template <class T> inline T MyMax(T a, T b)
-  {  return a > b ? a : b; }
-
-template <class T> inline int MyCompare(T a, T b)
-  {  return a < b ? -1 : (a == b ? 0 : 1); }
-
-inline int BoolToInt(bool value)
-  { return (value ? 1: 0); }
-
-inline bool IntToBool(int value)
-  { return (value != 0); }
-
-#endif
diff --git a/util/cbfstool/lzma/C/Common/MyCom.h b/util/cbfstool/lzma/C/Common/MyCom.h
deleted file mode 100644
index b8dbf38..0000000
--- a/util/cbfstool/lzma/C/Common/MyCom.h
+++ /dev/null
@@ -1,203 +0,0 @@
-// MyCom.h
-
-#ifndef __MYCOM_H
-#define __MYCOM_H
-
-#include "MyWindows.h"
-
-#define RINOK(x) { HRESULT __result_ = (x); if(__result_ != S_OK) return __result_; }
-
-template <class T>
-class CMyComPtr
-{
-  T* _p;
-public:
-  // typedef T _PtrClass;
-  CMyComPtr() { _p = NULL;}
-  CMyComPtr(T* p) {if ((_p = p) != NULL) p->AddRef(); }
-  CMyComPtr(const CMyComPtr<T>& lp)
-  {
-    if ((_p = lp._p) != NULL)
-      _p->AddRef();
-  }
-  ~CMyComPtr() { if (_p) _p->Release(); }
-  void Release() { if (_p) { _p->Release(); _p = NULL; } }
-  operator T*() const {  return (T*)_p;  }
-  // T& operator*() const {  return *_p; }
-  T** operator&() { return &_p; }
-  T* operator->() const { return _p; }
-  T* operator=(T* p)
-  {
-    if (p != 0)
-      p->AddRef();
-    if (_p)
-      _p->Release();
-    _p = p;
-    return p;
-  }
-  T* operator=(const CMyComPtr<T>& lp) { return (*this = lp._p); }
-  bool operator!() const { return (_p == NULL); }
-  // bool operator==(T* pT) const {  return _p == pT; }
-  // Compare two objects for equivalence
-  void Attach(T* p2)
-  {
-    Release();
-    _p = p2;
-  }
-  T* Detach()
-  {
-    T* pt = _p;
-    _p = NULL;
-    return pt;
-  }
-  #ifdef _WIN32
-  HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
-  {
-    return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p);
-  }
-  #endif
-  /*
-  HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
-  {
-    CLSID clsid;
-    HRESULT hr = CLSIDFromProgID(szProgID, &clsid);
-    ATLASSERT(_p == NULL);
-    if (SUCCEEDED(hr))
-      hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p);
-    return hr;
-  }
-  */
-  template <class Q>
-  HRESULT QueryInterface(REFGUID iid, Q** pp) const
-  {
-    return _p->QueryInterface(iid, (void**)pp);
-  }
-};
-
-//////////////////////////////////////////////////////////
-
-class CMyComBSTR
-{
-public:
-  BSTR m_str;
-  CMyComBSTR() { m_str = NULL; }
-  CMyComBSTR(LPCOLESTR pSrc) {  m_str = ::SysAllocString(pSrc);  }
-  // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); }
-  // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize);  }
-  CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); }
-  /*
-  CMyComBSTR(REFGUID src)
-  {
-    LPOLESTR szGuid;
-    StringFromCLSID(src, &szGuid);
-    m_str = ::SysAllocString(szGuid);
-    CoTaskMemFree(szGuid);
-  }
-  */
-  ~CMyComBSTR() { ::SysFreeString(m_str); }
-  CMyComBSTR& operator=(const CMyComBSTR& src)
-  {
-    if (m_str != src.m_str)
-    {
-      if (m_str)
-        ::SysFreeString(m_str);
-      m_str = src.MyCopy();
-    }
-    return *this;
-  }
-  CMyComBSTR& operator=(LPCOLESTR pSrc)
-  {
-    ::SysFreeString(m_str);
-    m_str = ::SysAllocString(pSrc);
-    return *this;
-  }
-  unsigned int Length() const { return ::SysStringLen(m_str); }
-  operator BSTR() const { return m_str; }
-  BSTR* operator&() { return &m_str; }
-  BSTR MyCopy() const
-  {
-    int byteLen = ::SysStringByteLen(m_str);
-    BSTR res = ::SysAllocStringByteLen(NULL, byteLen);
-    memmove(res, m_str, byteLen);
-    return res;
-  }
-  void Attach(BSTR src) {  m_str = src; }
-  BSTR Detach()
-  {
-    BSTR s = m_str;
-    m_str = NULL;
-    return s;
-  }
-  void Empty()
-  {
-    ::SysFreeString(m_str);
-    m_str = NULL;
-  }
-  bool operator!() const {  return (m_str == NULL); }
-};
-
-
-//////////////////////////////////////////////////////////
-
-class CMyUnknownImp
-{
-public:
-  ULONG __m_RefCount;
-  CMyUnknownImp(): __m_RefCount(0) {}
-};
-
-#define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \
-    (REFGUID iid, void **outObject) {
-
-#define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \
-    { *outObject = (void *)(i *)this; AddRef(); return S_OK; }
-
-#define MY_QUERYINTERFACE_END return E_NOINTERFACE; }
-
-#define MY_ADDREF_RELEASE \
-STDMETHOD_(ULONG, AddRef)() { return ++__m_RefCount; } \
-STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0)  \
-  return __m_RefCount; delete this; return 0; }
-
-#define MY_UNKNOWN_IMP_SPEC(i) \
-  MY_QUERYINTERFACE_BEGIN \
-  i \
-  MY_QUERYINTERFACE_END \
-  MY_ADDREF_RELEASE
-
-
-#define MY_UNKNOWN_IMP STDMETHOD(QueryInterface)(REFGUID, void **) { \
-  MY_QUERYINTERFACE_END \
-  MY_ADDREF_RELEASE
-
-#define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \
-  MY_QUERYINTERFACE_ENTRY(i) \
-  )
-
-#define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \
-  MY_QUERYINTERFACE_ENTRY(i1) \
-  MY_QUERYINTERFACE_ENTRY(i2) \
-  )
-
-#define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \
-  MY_QUERYINTERFACE_ENTRY(i1) \
-  MY_QUERYINTERFACE_ENTRY(i2) \
-  MY_QUERYINTERFACE_ENTRY(i3) \
-  )
-
-#define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \
-  MY_QUERYINTERFACE_ENTRY(i1) \
-  MY_QUERYINTERFACE_ENTRY(i2) \
-  MY_QUERYINTERFACE_ENTRY(i3) \
-  MY_QUERYINTERFACE_ENTRY(i4) \
-  )
-
-#define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \
-  MY_QUERYINTERFACE_ENTRY(i1) \
-  MY_QUERYINTERFACE_ENTRY(i2) \
-  MY_QUERYINTERFACE_ENTRY(i3) \
-  MY_QUERYINTERFACE_ENTRY(i4) \
-  MY_QUERYINTERFACE_ENTRY(i5) \
-  )
-
-#endif
diff --git a/util/cbfstool/lzma/C/Common/MyGuidDef.h b/util/cbfstool/lzma/C/Common/MyGuidDef.h
deleted file mode 100644
index 7de6433..0000000
--- a/util/cbfstool/lzma/C/Common/MyGuidDef.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Common/MyGuidDef.h
-
-#ifndef GUID_DEFINED
-#define GUID_DEFINED
-
-#include "Types.h"
-
-typedef struct {
-  UInt32 Data1;
-  UInt16 Data2;
-  UInt16 Data3;
-  unsigned char Data4[8];
-} GUID;
-
-#ifdef __cplusplus
-#define REFGUID const GUID &
-#else
-#define REFGUID const GUID *
-#endif
-
-#define REFCLSID REFGUID
-#define REFIID REFGUID
-
-#ifdef __cplusplus
-inline bool operator==(REFGUID g1, REFGUID g2)
-{
-  for (int i = 0; i < (int)sizeof(g1); i++)
-    if (((const unsigned char *)&g1)[i] != ((const unsigned char *)&g2)[i])
-      return false;
-  return true;
-}
-inline bool operator!=(REFGUID g1, REFGUID g2) { return !(g1 == g2); }
-#endif
-
-#ifdef __cplusplus
-  #define MY_EXTERN_C extern "C"
-#else
-  #define MY_EXTERN_C extern
-#endif
-
-#endif // GUID_DEFINED
-
-
-#ifdef DEFINE_GUID
-#undef DEFINE_GUID
-#endif
-
-#ifdef INITGUID
-  #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
-    MY_EXTERN_C const GUID name = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }
-#else
-  #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
-    MY_EXTERN_C const GUID name
-#endif
diff --git a/util/cbfstool/lzma/C/Common/MyInitGuid.h b/util/cbfstool/lzma/C/Common/MyInitGuid.h
deleted file mode 100644
index 5bdfeed..0000000
--- a/util/cbfstool/lzma/C/Common/MyInitGuid.h
+++ /dev/null
@@ -1,13 +0,0 @@
-// Common/MyInitGuid.h
-
-#ifndef __COMMON_MYINITGUID_H
-#define __COMMON_MYINITGUID_H
-
-#ifdef _WIN32
-#include <initguid.h>
-#else
-#define INITGUID
-#include "MyGuidDef.h"
-#endif
-
-#endif
diff --git a/util/cbfstool/lzma/C/Common/MyUnknown.h b/util/cbfstool/lzma/C/Common/MyUnknown.h
deleted file mode 100644
index 052c284..0000000
--- a/util/cbfstool/lzma/C/Common/MyUnknown.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// MyUnknown.h
-
-#ifndef __MYUNKNOWN_H
-#define __MYUNKNOWN_H
-
-#ifdef _WIN32
-
-#ifdef _WIN32_WCE
-#if (_WIN32_WCE > 300)
-#include <basetyps.h>
-#else
-#define MIDL_INTERFACE(x) struct
-#endif
-#else
-#include <basetyps.h>
-#endif
-
-#include <unknwn.h>
-
-#else
-#include "MyWindows.h"
-#endif
-
-#endif
diff --git a/util/cbfstool/lzma/C/Common/MyWindows.h b/util/cbfstool/lzma/C/Common/MyWindows.h
deleted file mode 100644
index e564c02..0000000
--- a/util/cbfstool/lzma/C/Common/MyWindows.h
+++ /dev/null
@@ -1,201 +0,0 @@
-// MyWindows.h
-
-#ifndef __MYWINDOWS_H
-#define __MYWINDOWS_H
-
-#ifdef _WIN32
-
-#include <windows.h>
-
-#define CHAR_PATH_SEPARATOR '\\'
-#define WCHAR_PATH_SEPARATOR L'\\'
-#define STRING_PATH_SEPARATOR "\\"
-#define WSTRING_PATH_SEPARATOR L"\\"
-
-#else
-
-#define CHAR_PATH_SEPARATOR '/'
-#define WCHAR_PATH_SEPARATOR L'/'
-#define STRING_PATH_SEPARATOR "/"
-#define WSTRING_PATH_SEPARATOR L"/"
-
-#include <stddef.h> // for wchar_t
-#include <string.h>
-
-#include "MyGuidDef.h"
-
-typedef char CHAR;
-typedef unsigned char UCHAR;
-
-#undef BYTE
-typedef unsigned char BYTE;
-
-typedef short SHORT;
-typedef unsigned short USHORT;
-
-#undef WORD
-typedef unsigned short WORD;
-typedef short VARIANT_BOOL;
-
-typedef int INT;
-typedef Int32 INT32;
-typedef unsigned int UINT;
-typedef UInt32 UINT32;
-typedef INT32 LONG;   // LONG, ULONG and DWORD must be 32-bit
-typedef UINT32 ULONG;
-
-#undef DWORD
-typedef UINT32 DWORD;
-
-typedef Int64 LONGLONG;
-typedef UInt64 ULONGLONG;
-
-typedef struct LARGE_INTEGER { LONGLONG QuadPart; }LARGE_INTEGER;
-typedef struct _ULARGE_INTEGER { ULONGLONG QuadPart;} ULARGE_INTEGER;
-
-typedef const CHAR *LPCSTR;
-typedef CHAR TCHAR;
-typedef const TCHAR *LPCTSTR;
-typedef wchar_t WCHAR;
-typedef WCHAR OLECHAR;
-typedef const WCHAR *LPCWSTR;
-typedef OLECHAR *BSTR;
-typedef const OLECHAR *LPCOLESTR;
-typedef OLECHAR *LPOLESTR;
-
-typedef struct _FILETIME
-{
-  DWORD dwLowDateTime;
-  DWORD dwHighDateTime;
-}FILETIME;
-
-#define HRESULT LONG
-#define FAILED(Status) ((HRESULT)(Status)<0)
-typedef ULONG PROPID;
-typedef LONG SCODE;
-
-#define S_OK    ((HRESULT)0x00000000L)
-#define S_FALSE ((HRESULT)0x00000001L)
-#define E_NOTIMPL ((HRESULT)0x80004001L)
-#define E_NOINTERFACE ((HRESULT)0x80004002L)
-#define E_ABORT ((HRESULT)0x80004004L)
-#define E_FAIL ((HRESULT)0x80004005L)
-#define STG_E_INVALIDFUNCTION ((HRESULT)0x80030001L)
-#define E_OUTOFMEMORY ((HRESULT)0x8007000EL)
-#define E_INVALIDARG ((HRESULT)0x80070057L)
-
-#ifdef _MSC_VER
-#define STDMETHODCALLTYPE __stdcall
-#else
-#define STDMETHODCALLTYPE
-#endif
-
-#define STDMETHOD_(t, f) virtual t STDMETHODCALLTYPE f
-#define STDMETHOD(f) STDMETHOD_(HRESULT, f)
-#define STDMETHODIMP_(type) type STDMETHODCALLTYPE
-#define STDMETHODIMP STDMETHODIMP_(HRESULT)
-
-#define PURE = 0
-
-#define MIDL_INTERFACE(x) struct
-
-struct IUnknown
-{
-  virtual ~IUnknown() {}
-  STDMETHOD(QueryInterface) (REFIID iid, void **outObject) PURE;
-  STDMETHOD_(ULONG, AddRef)() PURE;
-  STDMETHOD_(ULONG, Release)() PURE;
-};
-
-typedef IUnknown *LPUNKNOWN;
-
-#define VARIANT_TRUE ((VARIANT_BOOL)-1)
-#define VARIANT_FALSE ((VARIANT_BOOL)0)
-
-enum VARENUM
-{
-  VT_EMPTY	= 0,
-	VT_NULL	= 1,
-	VT_I2	= 2,
-	VT_I4	= 3,
-	VT_R4	= 4,
-	VT_R8	= 5,
-	VT_CY	= 6,
-	VT_DATE	= 7,
-	VT_BSTR	= 8,
-	VT_DISPATCH	= 9,
-	VT_ERROR	= 10,
-	VT_BOOL	= 11,
-	VT_VARIANT	= 12,
-	VT_UNKNOWN	= 13,
-	VT_DECIMAL	= 14,
-	VT_I1	= 16,
-	VT_UI1	= 17,
-	VT_UI2	= 18,
-	VT_UI4	= 19,
-	VT_I8	= 20,
-	VT_UI8	= 21,
-	VT_INT	= 22,
-	VT_UINT	= 23,
-	VT_VOID	= 24,
-	VT_HRESULT	= 25,
-	VT_FILETIME	= 64
-};
-
-typedef unsigned short VARTYPE;
-typedef WORD PROPVAR_PAD1;
-typedef WORD PROPVAR_PAD2;
-typedef WORD PROPVAR_PAD3;
-
-typedef struct tagPROPVARIANT
-{
-  VARTYPE vt;
-  PROPVAR_PAD1 wReserved1;
-  PROPVAR_PAD2 wReserved2;
-  PROPVAR_PAD3 wReserved3;
-  union
-  {
-    CHAR cVal;
-    UCHAR bVal;
-    SHORT iVal;
-    USHORT uiVal;
-    LONG lVal;
-    ULONG ulVal;
-    INT intVal;
-    UINT uintVal;
-    LARGE_INTEGER hVal;
-    ULARGE_INTEGER uhVal;
-    VARIANT_BOOL boolVal;
-    SCODE scode;
-    FILETIME filetime;
-    BSTR bstrVal;
-  };
-} PROPVARIANT;
-
-typedef PROPVARIANT tagVARIANT;
-typedef tagVARIANT VARIANT;
-typedef VARIANT VARIANTARG;
-
-MY_EXTERN_C BSTR SysAllocStringByteLen(LPCSTR psz, UINT len);
-MY_EXTERN_C BSTR SysAllocString(const OLECHAR *sz);
-MY_EXTERN_C void SysFreeString(BSTR bstr);
-MY_EXTERN_C UINT SysStringByteLen(BSTR bstr);
-MY_EXTERN_C UINT SysStringLen(BSTR bstr);
-
-MY_EXTERN_C DWORD GetLastError();
-MY_EXTERN_C HRESULT VariantClear(VARIANTARG *prop);
-MY_EXTERN_C HRESULT VariantCopy(VARIANTARG *dest, VARIANTARG *src);
-MY_EXTERN_C LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2);
-
-#define CP_ACP    0
-#define CP_OEMCP  1
-
-typedef enum tagSTREAM_SEEK
-{
-  STREAM_SEEK_SET	= 0,
-  STREAM_SEEK_CUR	= 1,
-  STREAM_SEEK_END	= 2
-} STREAM_SEEK;
-
-#endif
-#endif
diff --git a/util/cbfstool/lzma/C/Common/NewHandler.h b/util/cbfstool/lzma/C/Common/NewHandler.h
deleted file mode 100644
index 215ba05..0000000
--- a/util/cbfstool/lzma/C/Common/NewHandler.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Common/NewHandler.h
-
-#ifndef __COMMON_NEWHANDLER_H
-#define __COMMON_NEWHANDLER_H
-
-class CNewException {};
-
-#ifdef _WIN32
-void
-#ifdef _MSC_VER
-__cdecl
-#endif
-operator delete(void *p) throw();
-#endif
-
-#endif
diff --git a/util/cbfstool/lzma/C/Common/StdAfx.h b/util/cbfstool/lzma/C/Common/StdAfx.h
deleted file mode 100644
index b8ba1d5..0000000
--- a/util/cbfstool/lzma/C/Common/StdAfx.h
+++ /dev/null
@@ -1,9 +0,0 @@
-// StdAfx.h
-
-#ifndef __STDAFX_H
-#define __STDAFX_H
-
-// #include "MyWindows.h"
-#include "NewHandler.h"
-
-#endif
diff --git a/util/cbfstool/lzma/C/Common/Types.h b/util/cbfstool/lzma/C/Common/Types.h
deleted file mode 100644
index 0bf66e0..0000000
--- a/util/cbfstool/lzma/C/Common/Types.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Common/Types.h
-
-#ifndef __COMMON_TYPES_H
-#define __COMMON_TYPES_H
-
-typedef unsigned char Byte;
-typedef short Int16;
-typedef unsigned short UInt16;
-typedef int Int32;
-typedef unsigned int UInt32;
-#ifdef _MSC_VER
-typedef __int64 Int64;
-typedef unsigned __int64 UInt64;
-#else
-typedef long long int Int64;
-typedef unsigned long long int UInt64;
-#endif
-
-#endif
diff --git a/util/cbfstool/lzma/C/LGPL.txt b/util/cbfstool/lzma/C/LGPL.txt
deleted file mode 100644
index 1a71fd0..0000000
--- a/util/cbfstool/lzma/C/LGPL.txt
+++ /dev/null
@@ -1,504 +0,0 @@
-      GNU LESSER GENERAL PUBLIC LICENSE
-           Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-          Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-

-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-

-      GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-

-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-

-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-

-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-

-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-

-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-

-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-          NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-         END OF TERMS AND CONDITIONS
-

-           How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/util/cbfstool/lzma/C/LzFind.c b/util/cbfstool/lzma/C/LzFind.c
new file mode 100644
index 0000000..9103890
--- /dev/null
+++ b/util/cbfstool/lzma/C/LzFind.c
@@ -0,0 +1,761 @@
+/* LzFind.c -- Match finder for LZ algorithms
+2009-04-22 : Igor Pavlov : Public domain */
+
+#include <string.h>
+
+#include "LzFind.h"
+#include "LzHash.h"
+
+#define kEmptyHashValue 0
+#define kMaxValForNormalize ((UInt32)0xFFFFFFFF)
+#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */
+#define kNormalizeMask (~(kNormalizeStepMin - 1))
+#define kMaxHistorySize ((UInt32)3 << 30)
+
+#define kStartMaxLen 3
+
+static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc)
+{
+  if (!p->directInput)
+  {
+    alloc->Free(alloc, p->bufferBase);
+    p->bufferBase = 0;
+  }
+}
+
+/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */
+
+static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc)
+{
+  UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;
+  if (p->directInput)
+  {
+    p->blockSize = blockSize;
+    return 1;
+  }
+  if (p->bufferBase == 0 || p->blockSize != blockSize)
+  {
+    LzInWindow_Free(p, alloc);
+    p->blockSize = blockSize;
+    p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize);
+  }
+  return (p->bufferBase != 0);
+}
+
+Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
+static Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 bindex) { return p->buffer[bindex]; }
+
+static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
+
+void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
+{
+  p->posLimit -= subValue;
+  p->pos -= subValue;
+  p->streamPos -= subValue;
+}
+
+static void MatchFinder_ReadBlock(CMatchFinder *p)
+{
+  if (p->streamEndWasReached || p->result != SZ_OK)
+    return;
+  if (p->directInput)
+  {
+    UInt32 curSize = 0xFFFFFFFF - p->streamPos;
+    if (curSize > p->directInputRem)
+      curSize = (UInt32)p->directInputRem;
+    p->directInputRem -= curSize;
+    p->streamPos += curSize;
+    if (p->directInputRem == 0)
+      p->streamEndWasReached = 1;
+    return;
+  }
+  for (;;)
+  {
+    Byte *dest = p->buffer + (p->streamPos - p->pos);
+    size_t size = (p->bufferBase + p->blockSize - dest);
+    if (size == 0)
+      return;
+    p->result = p->stream->Read(p->stream, dest, &size);
+    if (p->result != SZ_OK)
+      return;
+    if (size == 0)
+    {
+      p->streamEndWasReached = 1;
+      return;
+    }
+    p->streamPos += (UInt32)size;
+    if (p->streamPos - p->pos > p->keepSizeAfter)
+      return;
+  }
+}
+
+void MatchFinder_MoveBlock(CMatchFinder *p)
+{
+  memmove(p->bufferBase,
+    p->buffer - p->keepSizeBefore,
+    (size_t)(p->streamPos - p->pos + p->keepSizeBefore));
+  p->buffer = p->bufferBase + p->keepSizeBefore;
+}
+
+int MatchFinder_NeedMove(CMatchFinder *p)
+{
+  if (p->directInput)
+    return 0;
+  /* if (p->streamEndWasReached) return 0; */
+  return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);
+}
+
+void MatchFinder_ReadIfRequired(CMatchFinder *p)
+{
+  if (p->streamEndWasReached)
+    return;
+  if (p->keepSizeAfter >= p->streamPos - p->pos)
+    MatchFinder_ReadBlock(p);
+}
+
+static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p)
+{
+  if (MatchFinder_NeedMove(p))
+    MatchFinder_MoveBlock(p);
+  MatchFinder_ReadBlock(p);
+}
+
+static void MatchFinder_SetDefaultSettings(CMatchFinder *p)
+{
+  p->cutValue = 32;
+  p->btMode = 1;
+  p->numHashBytes = 4;
+  p->bigHash = 0;
+}
+
+#define kCrcPoly 0xEDB88320
+
+void MatchFinder_Construct(CMatchFinder *p)
+{
+  UInt32 i;
+  p->bufferBase = 0;
+  p->directInput = 0;
+  p->hash = 0;
+  MatchFinder_SetDefaultSettings(p);
+
+  for (i = 0; i < 256; i++)
+  {
+    UInt32 r = i;
+    int j;
+    for (j = 0; j < 8; j++)
+      r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1));
+    p->crc[i] = r;
+  }
+}
+
+static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc)
+{
+  alloc->Free(alloc, p->hash);
+  p->hash = 0;
+}
+
+void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc)
+{
+  MatchFinder_FreeThisClassMemory(p, alloc);
+  LzInWindow_Free(p, alloc);
+}
+
+static CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc)
+{
+  size_t sizeInBytes = (size_t)num * sizeof(CLzRef);
+  if (sizeInBytes / sizeof(CLzRef) != num)
+    return 0;
+  return (CLzRef *)alloc->Alloc(alloc, sizeInBytes);
+}
+
+int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
+    UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
+    ISzAlloc *alloc)
+{
+  UInt32 sizeReserv;
+  if (historySize > kMaxHistorySize)
+  {
+    MatchFinder_Free(p, alloc);
+    return 0;
+  }
+  sizeReserv = historySize >> 1;
+  if (historySize > ((UInt32)2 << 30))
+    sizeReserv = historySize >> 2;
+  sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19);
+
+  p->keepSizeBefore = historySize + keepAddBufferBefore + 1;
+  p->keepSizeAfter = matchMaxLen + keepAddBufferAfter;
+  /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */
+  if (LzInWindow_Create(p, sizeReserv, alloc))
+  {
+    UInt32 newCyclicBufferSize = historySize + 1;
+    UInt32 hs;
+    p->matchMaxLen = matchMaxLen;
+    {
+      p->fixedHashSize = 0;
+      if (p->numHashBytes == 2)
+        hs = (1 << 16) - 1;
+      else
+      {
+        hs = historySize - 1;
+        hs |= (hs >> 1);
+        hs |= (hs >> 2);
+        hs |= (hs >> 4);
+        hs |= (hs >> 8);
+        hs >>= 1;
+        hs |= 0xFFFF; /* don't change it! It's required for Deflate */
+        if (hs > (1 << 24))
+        {
+          if (p->numHashBytes == 3)
+            hs = (1 << 24) - 1;
+          else
+            hs >>= 1;
+        }
+      }
+      p->hashMask = hs;
+      hs++;
+      if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size;
+      if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size;
+      if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size;
+      hs += p->fixedHashSize;
+    }
+
+    {
+      UInt32 prevSize = p->hashSizeSum + p->numSons;
+      UInt32 newSize;
+      p->historySize = historySize;
+      p->hashSizeSum = hs;
+      p->cyclicBufferSize = newCyclicBufferSize;
+      p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize);
+      newSize = p->hashSizeSum + p->numSons;
+      if (p->hash != 0 && prevSize == newSize)
+        return 1;
+      MatchFinder_FreeThisClassMemory(p, alloc);
+      p->hash = AllocRefs(newSize, alloc);
+      if (p->hash != 0)
+      {
+        p->son = p->hash + p->hashSizeSum;
+        return 1;
+      }
+    }
+  }
+  MatchFinder_Free(p, alloc);
+  return 0;
+}
+
+static void MatchFinder_SetLimits(CMatchFinder *p)
+{
+  UInt32 limit = kMaxValForNormalize - p->pos;
+  UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos;
+  if (limit2 < limit)
+    limit = limit2;
+  limit2 = p->streamPos - p->pos;
+  if (limit2 <= p->keepSizeAfter)
+  {
+    if (limit2 > 0)
+      limit2 = 1;
+  }
+  else
+    limit2 -= p->keepSizeAfter;
+  if (limit2 < limit)
+    limit = limit2;
+  {
+    UInt32 lenLimit = p->streamPos - p->pos;
+    if (lenLimit > p->matchMaxLen)
+      lenLimit = p->matchMaxLen;
+    p->lenLimit = lenLimit;
+  }
+  p->posLimit = p->pos + limit;
+}
+
+void MatchFinder_Init(CMatchFinder *p)
+{
+  UInt32 i;
+  for (i = 0; i < p->hashSizeSum; i++)
+    p->hash[i] = kEmptyHashValue;
+  p->cyclicBufferPos = 0;
+  p->buffer = p->bufferBase;
+  p->pos = p->streamPos = p->cyclicBufferSize;
+  p->result = SZ_OK;
+  p->streamEndWasReached = 0;
+  MatchFinder_ReadBlock(p);
+  MatchFinder_SetLimits(p);
+}
+
+static UInt32 MatchFinder_GetSubValue(CMatchFinder *p)
+{
+  return (p->pos - p->historySize - 1) & kNormalizeMask;
+}
+
+void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
+{
+  UInt32 i;
+  for (i = 0; i < numItems; i++)
+  {
+    UInt32 value = items[i];
+    if (value <= subValue)
+      value = kEmptyHashValue;
+    else
+      value -= subValue;
+    items[i] = value;
+  }
+}
+
+static void MatchFinder_Normalize(CMatchFinder *p)
+{
+  UInt32 subValue = MatchFinder_GetSubValue(p);
+  MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons);
+  MatchFinder_ReduceOffsets(p, subValue);
+}
+
+static void MatchFinder_CheckLimits(CMatchFinder *p)
+{
+  if (p->pos == kMaxValForNormalize)
+    MatchFinder_Normalize(p);
+  if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos)
+    MatchFinder_CheckAndMoveAndRead(p);
+  if (p->cyclicBufferPos == p->cyclicBufferSize)
+    p->cyclicBufferPos = 0;
+  MatchFinder_SetLimits(p);
+}
+
+static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
+    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
+    UInt32 *distances, UInt32 maxLen)
+{
+  son[_cyclicBufferPos] = curMatch;
+  for (;;)
+  {
+    UInt32 delta = pos - curMatch;
+    if (cutValue-- == 0 || delta >= _cyclicBufferSize)
+      return distances;
+    {
+      const Byte *pb = cur - delta;
+      curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
+      if (pb[maxLen] == cur[maxLen] && *pb == *cur)
+      {
+        UInt32 len = 0;
+        while (++len != lenLimit)
+          if (pb[len] != cur[len])
+            break;
+        if (maxLen < len)
+        {
+          *distances++ = maxLen = len;
+          *distances++ = delta - 1;
+          if (len == lenLimit)
+            return distances;
+        }
+      }
+    }
+  }
+}
+
+UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
+    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
+    UInt32 *distances, UInt32 maxLen)
+{
+  CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;
+  CLzRef *ptr1 = son + (_cyclicBufferPos << 1);
+  UInt32 len0 = 0, len1 = 0;
+  for (;;)
+  {
+    UInt32 delta = pos - curMatch;
+    if (cutValue-- == 0 || delta >= _cyclicBufferSize)
+    {
+      *ptr0 = *ptr1 = kEmptyHashValue;
+      return distances;
+    }
+    {
+      CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
+      const Byte *pb = cur - delta;
+      UInt32 len = (len0 < len1 ? len0 : len1);
+      if (pb[len] == cur[len])
+      {
+        if (++len != lenLimit && pb[len] == cur[len])
+          while (++len != lenLimit)
+            if (pb[len] != cur[len])
+              break;
+        if (maxLen < len)
+        {
+          *distances++ = maxLen = len;
+          *distances++ = delta - 1;
+          if (len == lenLimit)
+          {
+            *ptr1 = pair[0];
+            *ptr0 = pair[1];
+            return distances;
+          }
+        }
+      }
+      if (pb[len] < cur[len])
+      {
+        *ptr1 = curMatch;
+        ptr1 = pair + 1;
+        curMatch = *ptr1;
+        len1 = len;
+      }
+      else
+      {
+        *ptr0 = curMatch;
+        ptr0 = pair;
+        curMatch = *ptr0;
+        len0 = len;
+      }
+    }
+  }
+}
+
+static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
+    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue)
+{
+  CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;
+  CLzRef *ptr1 = son + (_cyclicBufferPos << 1);
+  UInt32 len0 = 0, len1 = 0;
+  for (;;)
+  {
+    UInt32 delta = pos - curMatch;
+    if (cutValue-- == 0 || delta >= _cyclicBufferSize)
+    {
+      *ptr0 = *ptr1 = kEmptyHashValue;
+      return;
+    }
+    {
+      CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
+      const Byte *pb = cur - delta;
+      UInt32 len = (len0 < len1 ? len0 : len1);
+      if (pb[len] == cur[len])
+      {
+        while (++len != lenLimit)
+          if (pb[len] != cur[len])
+            break;
+        {
+          if (len == lenLimit)
+          {
+            *ptr1 = pair[0];
+            *ptr0 = pair[1];
+            return;
+          }
+        }
+      }
+      if (pb[len] < cur[len])
+      {
+        *ptr1 = curMatch;
+        ptr1 = pair + 1;
+        curMatch = *ptr1;
+        len1 = len;
+      }
+      else
+      {
+        *ptr0 = curMatch;
+        ptr0 = pair;
+        curMatch = *ptr0;
+        len0 = len;
+      }
+    }
+  }
+}
+
+#define MOVE_POS \
+  ++p->cyclicBufferPos; \
+  p->buffer++; \
+  if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p);
+
+#define MOVE_POS_RET MOVE_POS return offset;
+
+static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; }
+
+#define GET_MATCHES_HEADER2(minLen, ret_op) \
+  UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \
+  lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \
+  cur = p->buffer;
+
+#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0)
+#define SKIP_HEADER(minLen)        GET_MATCHES_HEADER2(minLen, continue)
+
+#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue
+
+#define GET_MATCHES_FOOTER(offset, maxLen) \
+  offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \
+  distances + offset, maxLen) - distances); MOVE_POS_RET;
+
+#define SKIP_FOOTER \
+  SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS;
+
+static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+{
+  UInt32 offset;
+  GET_MATCHES_HEADER(2)
+  HASH2_CALC;
+  curMatch = p->hash[hashValue];
+  p->hash[hashValue] = p->pos;
+  offset = 0;
+  GET_MATCHES_FOOTER(offset, 1)
+}
+
+UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+{
+  UInt32 offset;
+  GET_MATCHES_HEADER(3)
+  HASH_ZIP_CALC;
+  curMatch = p->hash[hashValue];
+  p->hash[hashValue] = p->pos;
+  offset = 0;
+  GET_MATCHES_FOOTER(offset, 2)
+}
+
+static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+{
+  UInt32 hash2Value, delta2, maxLen, offset;
+  GET_MATCHES_HEADER(3)
+
+  HASH3_CALC;
+
+  delta2 = p->pos - p->hash[hash2Value];
+  curMatch = p->hash[kFix3HashSize + hashValue];
+  
+  p->hash[hash2Value] =
+  p->hash[kFix3HashSize + hashValue] = p->pos;
+
+
+  maxLen = 2;
+  offset = 0;
+  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
+  {
+    for (; maxLen != lenLimit; maxLen++)
+      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
+        break;
+    distances[0] = maxLen;
+    distances[1] = delta2 - 1;
+    offset = 2;
+    if (maxLen == lenLimit)
+    {
+      SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
+      MOVE_POS_RET;
+    }
+  }
+  GET_MATCHES_FOOTER(offset, maxLen)
+}
+
+static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+{
+  UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;
+  GET_MATCHES_HEADER(4)
+
+  HASH4_CALC;
+
+  delta2 = p->pos - p->hash[                hash2Value];
+  delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];
+  curMatch = p->hash[kFix4HashSize + hashValue];
+  
+  p->hash[                hash2Value] =
+  p->hash[kFix3HashSize + hash3Value] =
+  p->hash[kFix4HashSize + hashValue] = p->pos;
+
+  maxLen = 1;
+  offset = 0;
+  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
+  {
+    distances[0] = maxLen = 2;
+    distances[1] = delta2 - 1;
+    offset = 2;
+  }
+  if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)
+  {
+    maxLen = 3;
+    distances[offset + 1] = delta3 - 1;
+    offset += 2;
+    delta2 = delta3;
+  }
+  if (offset != 0)
+  {
+    for (; maxLen != lenLimit; maxLen++)
+      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
+        break;
+    distances[offset - 2] = maxLen;
+    if (maxLen == lenLimit)
+    {
+      SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
+      MOVE_POS_RET;
+    }
+  }
+  if (maxLen < 3)
+    maxLen = 3;
+  GET_MATCHES_FOOTER(offset, maxLen)
+}
+
+static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+{
+  UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;
+  GET_MATCHES_HEADER(4)
+
+  HASH4_CALC;
+
+  delta2 = p->pos - p->hash[                hash2Value];
+  delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];
+  curMatch = p->hash[kFix4HashSize + hashValue];
+
+  p->hash[                hash2Value] =
+  p->hash[kFix3HashSize + hash3Value] =
+  p->hash[kFix4HashSize + hashValue] = p->pos;
+
+  maxLen = 1;
+  offset = 0;
+  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
+  {
+    distances[0] = maxLen = 2;
+    distances[1] = delta2 - 1;
+    offset = 2;
+  }
+  if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)
+  {
+    maxLen = 3;
+    distances[offset + 1] = delta3 - 1;
+    offset += 2;
+    delta2 = delta3;
+  }
+  if (offset != 0)
+  {
+    for (; maxLen != lenLimit; maxLen++)
+      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
+        break;
+    distances[offset - 2] = maxLen;
+    if (maxLen == lenLimit)
+    {
+      p->son[p->cyclicBufferPos] = curMatch;
+      MOVE_POS_RET;
+    }
+  }
+  if (maxLen < 3)
+    maxLen = 3;
+  offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
+    distances + offset, maxLen) - (distances));
+  MOVE_POS_RET
+}
+
+UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+{
+  UInt32 offset;
+  GET_MATCHES_HEADER(3)
+  HASH_ZIP_CALC;
+  curMatch = p->hash[hashValue];
+  p->hash[hashValue] = p->pos;
+  offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
+    distances, 2) - (distances));
+  MOVE_POS_RET
+}
+
+static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+{
+  do
+  {
+    SKIP_HEADER(2)
+    HASH2_CALC;
+    curMatch = p->hash[hashValue];
+    p->hash[hashValue] = p->pos;
+    SKIP_FOOTER
+  }
+  while (--num != 0);
+}
+
+void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+{
+  do
+  {
+    SKIP_HEADER(3)
+    HASH_ZIP_CALC;
+    curMatch = p->hash[hashValue];
+    p->hash[hashValue] = p->pos;
+    SKIP_FOOTER
+  }
+  while (--num != 0);
+}
+
+static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+{
+  do
+  {
+    UInt32 hash2Value;
+    SKIP_HEADER(3)
+    HASH3_CALC;
+    curMatch = p->hash[kFix3HashSize + hashValue];
+    p->hash[hash2Value] =
+    p->hash[kFix3HashSize + hashValue] = p->pos;
+    SKIP_FOOTER
+  }
+  while (--num != 0);
+}
+
+static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+{
+  do
+  {
+    UInt32 hash2Value, hash3Value;
+    SKIP_HEADER(4)
+    HASH4_CALC;
+    curMatch = p->hash[kFix4HashSize + hashValue];
+    p->hash[                hash2Value] =
+    p->hash[kFix3HashSize + hash3Value] = p->pos;
+    p->hash[kFix4HashSize + hashValue] = p->pos;
+    SKIP_FOOTER
+  }
+  while (--num != 0);
+}
+
+static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+{
+  do
+  {
+    UInt32 hash2Value, hash3Value;
+    SKIP_HEADER(4)
+    HASH4_CALC;
+    curMatch = p->hash[kFix4HashSize + hashValue];
+    p->hash[                hash2Value] =
+    p->hash[kFix3HashSize + hash3Value] =
+    p->hash[kFix4HashSize + hashValue] = p->pos;
+    p->son[p->cyclicBufferPos] = curMatch;
+    MOVE_POS
+  }
+  while (--num != 0);
+}
+
+void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+{
+  do
+  {
+    SKIP_HEADER(3)
+    HASH_ZIP_CALC;
+    curMatch = p->hash[hashValue];
+    p->hash[hashValue] = p->pos;
+    p->son[p->cyclicBufferPos] = curMatch;
+    MOVE_POS
+  }
+  while (--num != 0);
+}
+
+void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable)
+{
+  vTable->Init = (Mf_Init_Func)MatchFinder_Init;
+  vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte;
+  vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;
+  vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;
+  if (!p->btMode)
+  {
+    vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;
+    vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;
+  }
+  else if (p->numHashBytes == 2)
+  {
+    vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;
+    vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;
+  }
+  else if (p->numHashBytes == 3)
+  {
+    vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;
+    vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;
+  }
+  else
+  {
+    vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
+    vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
+  }
+}
diff --git a/util/cbfstool/lzma/C/LzFind.h b/util/cbfstool/lzma/C/LzFind.h
new file mode 100644
index 0000000..010c4b9
--- /dev/null
+++ b/util/cbfstool/lzma/C/LzFind.h
@@ -0,0 +1,115 @@
+/* LzFind.h -- Match finder for LZ algorithms
+2009-04-22 : Igor Pavlov : Public domain */
+
+#ifndef __LZ_FIND_H
+#define __LZ_FIND_H
+
+#include "Types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef UInt32 CLzRef;
+
+typedef struct _CMatchFinder
+{
+  Byte *buffer;
+  UInt32 pos;
+  UInt32 posLimit;
+  UInt32 streamPos;
+  UInt32 lenLimit;
+
+  UInt32 cyclicBufferPos;
+  UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */
+
+  UInt32 matchMaxLen;
+  CLzRef *hash;
+  CLzRef *son;
+  UInt32 hashMask;
+  UInt32 cutValue;
+
+  Byte *bufferBase;
+  ISeqInStream *stream;
+  int streamEndWasReached;
+
+  UInt32 blockSize;
+  UInt32 keepSizeBefore;
+  UInt32 keepSizeAfter;
+
+  UInt32 numHashBytes;
+  int directInput;
+  size_t directInputRem;
+  int btMode;
+  int bigHash;
+  UInt32 historySize;
+  UInt32 fixedHashSize;
+  UInt32 hashSizeSum;
+  UInt32 numSons;
+  SRes result;
+  UInt32 crc[256];
+} CMatchFinder;
+
+#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer)
+#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)])
+
+#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)
+
+int MatchFinder_NeedMove(CMatchFinder *p);
+Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p);
+void MatchFinder_MoveBlock(CMatchFinder *p);
+void MatchFinder_ReadIfRequired(CMatchFinder *p);
+
+void MatchFinder_Construct(CMatchFinder *p);
+
+/* Conditions:
+     historySize <= 3 GB
+     keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB
+*/
+int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
+    UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
+    ISzAlloc *alloc);
+void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc);
+void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems);
+void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);
+
+UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,
+    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,
+    UInt32 *distances, UInt32 maxLen);
+
+/*
+Conditions:
+  Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func.
+  Mf_GetPointerToCurrentPos_Func's result must be used only before any other function
+*/
+
+typedef void (*Mf_Init_Func)(void *object);
+typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index);
+typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object);
+typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object);
+typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances);
+typedef void (*Mf_Skip_Func)(void *object, UInt32);
+
+typedef struct _IMatchFinder
+{
+  Mf_Init_Func Init;
+  Mf_GetIndexByte_Func GetIndexByte;
+  Mf_GetNumAvailableBytes_Func GetNumAvailableBytes;
+  Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos;
+  Mf_GetMatches_Func GetMatches;
+  Mf_Skip_Func Skip;
+} IMatchFinder;
+
+void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable);
+
+void MatchFinder_Init(CMatchFinder *p);
+UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
+UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
+void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
+void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/util/cbfstool/lzma/C/LzHash.h b/util/cbfstool/lzma/C/LzHash.h
new file mode 100644
index 0000000..f3e8996
--- /dev/null
+++ b/util/cbfstool/lzma/C/LzHash.h
@@ -0,0 +1,54 @@
+/* LzHash.h -- HASH functions for LZ algorithms
+2009-02-07 : Igor Pavlov : Public domain */
+
+#ifndef __LZ_HASH_H
+#define __LZ_HASH_H
+
+#define kHash2Size (1 << 10)
+#define kHash3Size (1 << 16)
+#define kHash4Size (1 << 20)
+
+#define kFix3HashSize (kHash2Size)
+#define kFix4HashSize (kHash2Size + kHash3Size)
+#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size)
+
+#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8);
+
+#define HASH3_CALC { \
+  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
+  hash2Value = temp & (kHash2Size - 1); \
+  hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; }
+
+#define HASH4_CALC { \
+  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
+  hash2Value = temp & (kHash2Size - 1); \
+  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
+  hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; }
+
+#define HASH5_CALC { \
+  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
+  hash2Value = temp & (kHash2Size - 1); \
+  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
+  hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \
+  hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \
+  hash4Value &= (kHash4Size - 1); }
+
+/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */
+#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF;
+
+
+#define MT_HASH2_CALC \
+  hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1);
+
+#define MT_HASH3_CALC { \
+  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
+  hash2Value = temp & (kHash2Size - 1); \
+  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); }
+
+#define MT_HASH4_CALC { \
+  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
+  hash2Value = temp & (kHash2Size - 1); \
+  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
+  hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); }
+
+#endif
diff --git a/util/cbfstool/lzma/C/LzmaDec.c b/util/cbfstool/lzma/C/LzmaDec.c
new file mode 100644
index 0000000..7efb60a
--- /dev/null
+++ b/util/cbfstool/lzma/C/LzmaDec.c
@@ -0,0 +1,999 @@
+/* LzmaDec.c -- LZMA Decoder
+2009-09-20 : Igor Pavlov : Public domain */
+
+#include "LzmaDec.h"
+
+#include <string.h>
+
+#define kNumTopBits 24
+#define kTopValue ((UInt32)1 << kNumTopBits)
+
+#define kNumBitModelTotalBits 11
+#define kBitModelTotal (1 << kNumBitModelTotalBits)
+#define kNumMoveBits 5
+
+#define RC_INIT_SIZE 5
+
+#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }
+
+#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
+#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));
+#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));
+#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \
+  { UPDATE_0(p); i = (i + i); A0; } else \
+  { UPDATE_1(p); i = (i + i) + 1; A1; }
+#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;)
+
+#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); }
+#define TREE_DECODE(probs, limit, i) \
+  { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }
+
+/* #define _LZMA_SIZE_OPT */
+
+#ifdef _LZMA_SIZE_OPT
+#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)
+#else
+#define TREE_6_DECODE(probs, i) \
+  { i = 1; \
+  TREE_GET_BIT(probs, i); \
+  TREE_GET_BIT(probs, i); \
+  TREE_GET_BIT(probs, i); \
+  TREE_GET_BIT(probs, i); \
+  TREE_GET_BIT(probs, i); \
+  TREE_GET_BIT(probs, i); \
+  i -= 0x40; }
+#endif
+
+#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }
+
+#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
+#define UPDATE_0_CHECK range = bound;
+#define UPDATE_1_CHECK range -= bound; code -= bound;
+#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \
+  { UPDATE_0_CHECK; i = (i + i); A0; } else \
+  { UPDATE_1_CHECK; i = (i + i) + 1; A1; }
+#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)
+#define TREE_DECODE_CHECK(probs, limit, i) \
+  { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }
+
+
+#define kNumPosBitsMax 4
+#define kNumPosStatesMax (1 << kNumPosBitsMax)
+
+#define kLenNumLowBits 3
+#define kLenNumLowSymbols (1 << kLenNumLowBits)
+#define kLenNumMidBits 3
+#define kLenNumMidSymbols (1 << kLenNumMidBits)
+#define kLenNumHighBits 8
+#define kLenNumHighSymbols (1 << kLenNumHighBits)
+
+#define LenChoice 0
+#define LenChoice2 (LenChoice + 1)
+#define LenLow (LenChoice2 + 1)
+#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
+#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
+#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
+
+
+#define kNumStates 12
+#define kNumLitStates 7
+
+#define kStartPosModelIndex 4
+#define kEndPosModelIndex 14
+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
+
+#define kNumPosSlotBits 6
+#define kNumLenToPosStates 4
+
+#define kNumAlignBits 4
+#define kAlignTableSize (1 << kNumAlignBits)
+
+#define kMatchMinLen 2
+#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)
+
+#define IsMatch 0
+#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
+#define IsRepG0 (IsRep + kNumStates)
+#define IsRepG1 (IsRepG0 + kNumStates)
+#define IsRepG2 (IsRepG1 + kNumStates)
+#define IsRep0Long (IsRepG2 + kNumStates)
+#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
+#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
+#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
+#define LenCoder (Align + kAlignTableSize)
+#define RepLenCoder (LenCoder + kNumLenProbs)
+#define Literal (RepLenCoder + kNumLenProbs)
+
+#define LZMA_BASE_SIZE 1846
+#define LZMA_LIT_SIZE 768
+
+#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))
+
+#if Literal != LZMA_BASE_SIZE
+StopCompilingDueBUG
+#endif
+
+#define LZMA_DIC_MIN (1 << 12)
+
+/* First LZMA-symbol is always decoded.
+And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization
+Out:
+  Result:
+    SZ_OK - OK
+    SZ_ERROR_DATA - Error
+  p->remainLen:
+    < kMatchSpecLenStart : normal remain
+    = kMatchSpecLenStart : finished
+    = kMatchSpecLenStart + 1 : Flush marker
+    = kMatchSpecLenStart + 2 : State Init Marker
+*/
+
+static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit_parm, const Byte *bufLimit)
+{
+  CLzmaProb *probs = p->probs;
+
+  unsigned state = p->state;
+  UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];
+  unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;
+  unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1;
+  unsigned lc = p->prop.lc;
+
+  Byte *dic = p->dic;
+  SizeT dicBufSize = p->dicBufSize;
+  SizeT dicPos = p->dicPos;
+  
+  UInt32 processedPos = p->processedPos;
+  UInt32 checkDicSize = p->checkDicSize;
+  unsigned len = 0;
+
+  const Byte *buf = p->buf;
+  UInt32 range = p->range;
+  UInt32 code = p->code;
+
+  do
+  {
+    CLzmaProb *prob;
+    UInt32 bound;
+    unsigned ttt;
+    unsigned posState = processedPos & pbMask;
+
+    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
+    IF_BIT_0(prob)
+    {
+      unsigned symbol;
+      UPDATE_0(prob);
+      prob = probs + Literal;
+      if (checkDicSize != 0 || processedPos != 0)
+        prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) +
+        (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc))));
+
+      if (state < kNumLitStates)
+      {
+        state -= (state < 4) ? state : 3;
+        symbol = 1;
+        do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100);
+      }
+      else
+      {
+        unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
+        unsigned offs = 0x100;
+        state -= (state < 10) ? 3 : 6;
+        symbol = 1;
+        do
+        {
+          unsigned bit;
+          CLzmaProb *probLit;
+          matchByte <<= 1;
+          bit = (matchByte & offs);
+          probLit = prob + offs + bit + symbol;
+          GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit)
+        }
+        while (symbol < 0x100);
+      }
+      dic[dicPos++] = (Byte)symbol;
+      processedPos++;
+      continue;
+    }
+    else
+    {
+      UPDATE_1(prob);
+      prob = probs + IsRep + state;
+      IF_BIT_0(prob)
+      {
+        UPDATE_0(prob);
+        state += kNumStates;
+        prob = probs + LenCoder;
+      }
+      else
+      {
+        UPDATE_1(prob);
+        if (checkDicSize == 0 && processedPos == 0)
+          return SZ_ERROR_DATA;
+        prob = probs + IsRepG0 + state;
+        IF_BIT_0(prob)
+        {
+          UPDATE_0(prob);
+          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
+          IF_BIT_0(prob)
+          {
+            UPDATE_0(prob);
+            dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
+            dicPos++;
+            processedPos++;
+            state = state < kNumLitStates ? 9 : 11;
+            continue;
+          }
+          UPDATE_1(prob);
+        }
+        else
+        {
+          UInt32 distance;
+          UPDATE_1(prob);
+          prob = probs + IsRepG1 + state;
+          IF_BIT_0(prob)
+          {
+            UPDATE_0(prob);
+            distance = rep1;
+          }
+          else
+          {
+            UPDATE_1(prob);
+            prob = probs + IsRepG2 + state;
+            IF_BIT_0(prob)
+            {
+              UPDATE_0(prob);
+              distance = rep2;
+            }
+            else
+            {
+              UPDATE_1(prob);
+              distance = rep3;
+              rep3 = rep2;
+            }
+            rep2 = rep1;
+          }
+          rep1 = rep0;
+          rep0 = distance;
+        }
+        state = state < kNumLitStates ? 8 : 11;
+        prob = probs + RepLenCoder;
+      }
+      {
+        unsigned limit, offset;
+        CLzmaProb *probLen = prob + LenChoice;
+        IF_BIT_0(probLen)
+        {
+          UPDATE_0(probLen);
+          probLen = prob + LenLow + (posState << kLenNumLowBits);
+          offset = 0;
+          limit = (1 << kLenNumLowBits);
+        }
+        else
+        {
+          UPDATE_1(probLen);
+          probLen = prob + LenChoice2;
+          IF_BIT_0(probLen)
+          {
+            UPDATE_0(probLen);
+            probLen = prob + LenMid + (posState << kLenNumMidBits);
+            offset = kLenNumLowSymbols;
+            limit = (1 << kLenNumMidBits);
+          }
+          else
+          {
+            UPDATE_1(probLen);
+            probLen = prob + LenHigh;
+            offset = kLenNumLowSymbols + kLenNumMidSymbols;
+            limit = (1 << kLenNumHighBits);
+          }
+        }
+        TREE_DECODE(probLen, limit, len);
+        len += offset;
+      }
+
+      if (state >= kNumStates)
+      {
+        UInt32 distance;
+        prob = probs + PosSlot +
+            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);
+        TREE_6_DECODE(prob, distance);
+        if (distance >= kStartPosModelIndex)
+        {
+          unsigned posSlot = (unsigned)distance;
+          int numDirectBits = (int)(((distance >> 1) - 1));
+          distance = (2 | (distance & 1));
+          if (posSlot < kEndPosModelIndex)
+          {
+            distance <<= numDirectBits;
+            prob = probs + SpecPos + distance - posSlot - 1;
+            {
+              UInt32 mask = 1;
+              unsigned i = 1;
+              do
+              {
+                GET_BIT2(prob + i, i, ; , distance |= mask);
+                mask <<= 1;
+              }
+              while (--numDirectBits != 0);
+            }
+          }
+          else
+          {
+            numDirectBits -= kNumAlignBits;
+            do
+            {
+              NORMALIZE
+              range >>= 1;
+              
+              {
+                UInt32 t;
+                code -= range;
+                t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */
+                distance = (distance << 1) + (t + 1);
+                code += range & t;
+              }
+              /*
+              distance <<= 1;
+              if (code >= range)
+              {
+                code -= range;
+                distance |= 1;
+              }
+              */
+            }
+            while (--numDirectBits != 0);
+            prob = probs + Align;
+            distance <<= kNumAlignBits;
+            {
+              unsigned i = 1;
+              GET_BIT2(prob + i, i, ; , distance |= 1);
+              GET_BIT2(prob + i, i, ; , distance |= 2);
+              GET_BIT2(prob + i, i, ; , distance |= 4);
+              GET_BIT2(prob + i, i, ; , distance |= 8);
+            }
+            if (distance == (UInt32)0xFFFFFFFF)
+            {
+              len += kMatchSpecLenStart;
+              state -= kNumStates;
+              break;
+            }
+          }
+        }
+        rep3 = rep2;
+        rep2 = rep1;
+        rep1 = rep0;
+        rep0 = distance + 1;
+        if (checkDicSize == 0)
+        {
+          if (distance >= processedPos)
+            return SZ_ERROR_DATA;
+        }
+        else if (distance >= checkDicSize)
+          return SZ_ERROR_DATA;
+        state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;
+      }
+
+      len += kMatchMinLen;
+
+      if (limit_parm == dicPos)
+        return SZ_ERROR_DATA;
+      {
+        SizeT rem = limit_parm - dicPos;
+        unsigned curLen = ((rem < len) ? (unsigned)rem : len);
+        SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0);
+
+        processedPos += curLen;
+
+        len -= curLen;
+        if (pos + curLen <= dicBufSize)
+        {
+          Byte *dest = dic + dicPos;
+          ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;
+          const Byte *lim = dest + curLen;
+          dicPos += curLen;
+          do
+            *(dest) = (Byte)*(dest + src);
+          while (++dest != lim);
+        }
+        else
+        {
+          do
+          {
+            dic[dicPos++] = dic[pos];
+            if (++pos == dicBufSize)
+              pos = 0;
+          }
+          while (--curLen != 0);
+        }
+      }
+    }
+  }
+  while (dicPos < limit_parm && buf < bufLimit);
+  NORMALIZE;
+  p->buf = buf;
+  p->range = range;
+  p->code = code;
+  p->remainLen = len;
+  p->dicPos = dicPos;
+  p->processedPos = processedPos;
+  p->reps[0] = rep0;
+  p->reps[1] = rep1;
+  p->reps[2] = rep2;
+  p->reps[3] = rep3;
+  p->state = state;
+
+  return SZ_OK;
+}
+
+static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)
+{
+  if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart)
+  {
+    Byte *dic = p->dic;
+    SizeT dicPos = p->dicPos;
+    SizeT dicBufSize = p->dicBufSize;
+    unsigned len = p->remainLen;
+    UInt32 rep0 = p->reps[0];
+    if (limit - dicPos < len)
+      len = (unsigned)(limit - dicPos);
+
+    if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)
+      p->checkDicSize = p->prop.dicSize;
+
+    p->processedPos += len;
+    p->remainLen -= len;
+    while (len-- != 0)
+    {
+      dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
+      dicPos++;
+    }
+    p->dicPos = dicPos;
+  }
+}
+
+static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
+{
+  do
+  {
+    SizeT limit2 = limit;
+    if (p->checkDicSize == 0)
+    {
+      UInt32 rem = p->prop.dicSize - p->processedPos;
+      if (limit - p->dicPos > rem)
+        limit2 = p->dicPos + rem;
+    }
+    RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit));
+    if (p->processedPos >= p->prop.dicSize)
+      p->checkDicSize = p->prop.dicSize;
+    LzmaDec_WriteRem(p, limit);
+  }
+  while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);
+
+  if (p->remainLen > kMatchSpecLenStart)
+  {
+    p->remainLen = kMatchSpecLenStart;
+  }
+  return 0;
+}
+
+typedef enum
+{
+  DUMMY_ERROR, /* unexpected end of input stream */
+  DUMMY_LIT,
+  DUMMY_MATCH,
+  DUMMY_REP
+} ELzmaDummy;
+
+static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize)
+{
+  UInt32 range = p->range;
+  UInt32 code = p->code;
+  const Byte *bufLimit = buf + inSize;
+  CLzmaProb *probs = p->probs;
+  unsigned state = p->state;
+  ELzmaDummy res;
+
+  {
+    CLzmaProb *prob;
+    UInt32 bound;
+    unsigned ttt;
+    unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1);
+
+    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
+    IF_BIT_0_CHECK(prob)
+    {
+      UPDATE_0_CHECK
+
+      /* if (bufLimit - buf >= 7) return DUMMY_LIT; */
+
+      prob = probs + Literal;
+      if (p->checkDicSize != 0 || p->processedPos != 0)
+        prob += (LZMA_LIT_SIZE *
+          ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +
+          (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));
+
+      if (state < kNumLitStates)
+      {
+        unsigned symbol = 1;
+        do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100);
+      }
+      else
+      {
+        unsigned matchByte = p->dic[p->dicPos - p->reps[0] +
+            ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)];
+        unsigned offs = 0x100;
+        unsigned symbol = 1;
+        do
+        {
+          unsigned bit;
+          CLzmaProb *probLit;
+          matchByte <<= 1;
+          bit = (matchByte & offs);
+          probLit = prob + offs + bit + symbol;
+          GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit)
+        }
+        while (symbol < 0x100);
+      }
+      res = DUMMY_LIT;
+    }
+    else
+    {
+      unsigned len;
+      UPDATE_1_CHECK;
+
+      prob = probs + IsRep + state;
+      IF_BIT_0_CHECK(prob)
+      {
+        UPDATE_0_CHECK;
+        state = 0;
+        prob = probs + LenCoder;
+        res = DUMMY_MATCH;
+      }
+      else
+      {
+        UPDATE_1_CHECK;
+        res = DUMMY_REP;
+        prob = probs + IsRepG0 + state;
+        IF_BIT_0_CHECK(prob)
+        {
+          UPDATE_0_CHECK;
+          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
+          IF_BIT_0_CHECK(prob)
+          {
+            UPDATE_0_CHECK;
+            NORMALIZE_CHECK;
+            return DUMMY_REP;
+          }
+          else
+          {
+            UPDATE_1_CHECK;
+          }
+        }
+        else
+        {
+          UPDATE_1_CHECK;
+          prob = probs + IsRepG1 + state;
+          IF_BIT_0_CHECK(prob)
+          {
+            UPDATE_0_CHECK;
+          }
+          else
+          {
+            UPDATE_1_CHECK;
+            prob = probs + IsRepG2 + state;
+            IF_BIT_0_CHECK(prob)
+            {
+              UPDATE_0_CHECK;
+            }
+            else
+            {
+              UPDATE_1_CHECK;
+            }
+          }
+        }
+        state = kNumStates;
+        prob = probs + RepLenCoder;
+      }
+      {
+        unsigned limit, offset;
+        CLzmaProb *probLen = prob + LenChoice;
+        IF_BIT_0_CHECK(probLen)
+        {
+          UPDATE_0_CHECK;
+          probLen = prob + LenLow + (posState << kLenNumLowBits);
+          offset = 0;
+          limit = 1 << kLenNumLowBits;
+        }
+        else
+        {
+          UPDATE_1_CHECK;
+          probLen = prob + LenChoice2;
+          IF_BIT_0_CHECK(probLen)
+          {
+            UPDATE_0_CHECK;
+            probLen = prob + LenMid + (posState << kLenNumMidBits);
+            offset = kLenNumLowSymbols;
+            limit = 1 << kLenNumMidBits;
+          }
+          else
+          {
+            UPDATE_1_CHECK;
+            probLen = prob + LenHigh;
+            offset = kLenNumLowSymbols + kLenNumMidSymbols;
+            limit = 1 << kLenNumHighBits;
+          }
+        }
+        TREE_DECODE_CHECK(probLen, limit, len);
+        len += offset;
+      }
+
+      if (state < 4)
+      {
+        unsigned posSlot;
+        prob = probs + PosSlot +
+            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
+            kNumPosSlotBits);
+        TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);
+        if (posSlot >= kStartPosModelIndex)
+        {
+          int numDirectBits = ((posSlot >> 1) - 1);
+
+          /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */
+
+          if (posSlot < kEndPosModelIndex)
+          {
+            prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1;
+          }
+          else
+          {
+            numDirectBits -= kNumAlignBits;
+            do
+            {
+              NORMALIZE_CHECK
+              range >>= 1;
+              code -= range & (((code - range) >> 31) - 1);
+              /* if (code >= range) code -= range; */
+            }
+            while (--numDirectBits != 0);
+            prob = probs + Align;
+            numDirectBits = kNumAlignBits;
+          }
+          {
+            unsigned i = 1;
+            do
+            {
+              GET_BIT_CHECK(prob + i, i);
+            }
+            while (--numDirectBits != 0);
+          }
+        }
+      }
+    }
+  }
+  NORMALIZE_CHECK;
+  return res;
+}
+
+
+static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)
+{
+  p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]);
+  p->range = 0xFFFFFFFF;
+  p->needFlush = 0;
+}
+
+static void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
+{
+  p->needFlush = 1;
+  p->remainLen = 0;
+  p->tempBufSize = 0;
+
+  if (initDic)
+  {
+    p->processedPos = 0;
+    p->checkDicSize = 0;
+    p->needInitState = 1;
+  }
+  if (initState)
+    p->needInitState = 1;
+}
+
+void LzmaDec_Init(CLzmaDec *p)
+{
+  p->dicPos = 0;
+  LzmaDec_InitDicAndState(p, True, True);
+}
+
+static void LzmaDec_InitStateReal(CLzmaDec *p)
+{
+  UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp));
+  UInt32 i;
+  CLzmaProb *probs = p->probs;
+  for (i = 0; i < numProbs; i++)
+    probs[i] = kBitModelTotal >> 1;
+  p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;
+  p->state = 0;
+  p->needInitState = 0;
+}
+
+SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
+    ELzmaFinishMode finishMode, ELzmaStatus *status)
+{
+  SizeT inSize = *srcLen;
+  (*srcLen) = 0;
+  LzmaDec_WriteRem(p, dicLimit);
+  
+  *status = LZMA_STATUS_NOT_SPECIFIED;
+
+  while (p->remainLen != kMatchSpecLenStart)
+  {
+      int checkEndMarkNow;
+
+      if (p->needFlush != 0)
+      {
+        for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)
+          p->tempBuf[p->tempBufSize++] = *src++;
+        if (p->tempBufSize < RC_INIT_SIZE)
+        {
+          *status = LZMA_STATUS_NEEDS_MORE_INPUT;
+          return SZ_OK;
+        }
+        if (p->tempBuf[0] != 0)
+          return SZ_ERROR_DATA;
+
+        LzmaDec_InitRc(p, p->tempBuf);
+        p->tempBufSize = 0;
+      }
+
+      checkEndMarkNow = 0;
+      if (p->dicPos >= dicLimit)
+      {
+        if (p->remainLen == 0 && p->code == 0)
+        {
+          *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;
+          return SZ_OK;
+        }
+        if (finishMode == LZMA_FINISH_ANY)
+        {
+          *status = LZMA_STATUS_NOT_FINISHED;
+          return SZ_OK;
+        }
+        if (p->remainLen != 0)
+        {
+          *status = LZMA_STATUS_NOT_FINISHED;
+          return SZ_ERROR_DATA;
+        }
+        checkEndMarkNow = 1;
+      }
+
+      if (p->needInitState)
+        LzmaDec_InitStateReal(p);
+  
+      if (p->tempBufSize == 0)
+      {
+        SizeT processed;
+        const Byte *bufLimit;
+        if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
+        {
+          int dummyRes = LzmaDec_TryDummy(p, src, inSize);
+          if (dummyRes == DUMMY_ERROR)
+          {
+            memcpy(p->tempBuf, src, inSize);
+            p->tempBufSize = (unsigned)inSize;
+            (*srcLen) += inSize;
+            *status = LZMA_STATUS_NEEDS_MORE_INPUT;
+            return SZ_OK;
+          }
+          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
+          {
+            *status = LZMA_STATUS_NOT_FINISHED;
+            return SZ_ERROR_DATA;
+          }
+          bufLimit = src;
+        }
+        else
+          bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;
+        p->buf = src;
+        if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0)
+          return SZ_ERROR_DATA;
+        processed = (SizeT)(p->buf - src);
+        (*srcLen) += processed;
+        src += processed;
+        inSize -= processed;
+      }
+      else
+      {
+        unsigned rem = p->tempBufSize, lookAhead = 0;
+        while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize)
+          p->tempBuf[rem++] = src[lookAhead++];
+        p->tempBufSize = rem;
+        if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
+        {
+          int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem);
+          if (dummyRes == DUMMY_ERROR)
+          {
+            (*srcLen) += lookAhead;
+            *status = LZMA_STATUS_NEEDS_MORE_INPUT;
+            return SZ_OK;
+          }
+          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
+          {
+            *status = LZMA_STATUS_NOT_FINISHED;
+            return SZ_ERROR_DATA;
+          }
+        }
+        p->buf = p->tempBuf;
+        if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0)
+          return SZ_ERROR_DATA;
+        lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf));
+        (*srcLen) += lookAhead;
+        src += lookAhead;
+        inSize -= lookAhead;
+        p->tempBufSize = 0;
+      }
+  }
+  if (p->code == 0)
+    *status = LZMA_STATUS_FINISHED_WITH_MARK;
+  return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
+}
+
+SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
+{
+  SizeT outSize = *destLen;
+  SizeT inSize = *srcLen;
+  *srcLen = *destLen = 0;
+  for (;;)
+  {
+    SizeT inSizeCur = inSize, outSizeCur, dicPos;
+    ELzmaFinishMode curFinishMode;
+    SRes res;
+    if (p->dicPos == p->dicBufSize)
+      p->dicPos = 0;
+    dicPos = p->dicPos;
+    if (outSize > p->dicBufSize - dicPos)
+    {
+      outSizeCur = p->dicBufSize;
+      curFinishMode = LZMA_FINISH_ANY;
+    }
+    else
+    {
+      outSizeCur = dicPos + outSize;
+      curFinishMode = finishMode;
+    }
+
+    res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);
+    src += inSizeCur;
+    inSize -= inSizeCur;
+    *srcLen += inSizeCur;
+    outSizeCur = p->dicPos - dicPos;
+    memcpy(dest, p->dic + dicPos, outSizeCur);
+    dest += outSizeCur;
+    outSize -= outSizeCur;
+    *destLen += outSizeCur;
+    if (res != 0)
+      return res;
+    if (outSizeCur == 0 || outSize == 0)
+      return SZ_OK;
+  }
+}
+
+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
+{
+  alloc->Free(alloc, p->probs);
+  p->probs = 0;
+}
+
+static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)
+{
+  alloc->Free(alloc, p->dic);
+  p->dic = 0;
+}
+
+void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
+{
+  LzmaDec_FreeProbs(p, alloc);
+  LzmaDec_FreeDict(p, alloc);
+}
+
+SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
+{
+  UInt32 dicSize;
+  Byte d;
+  
+  if (size < LZMA_PROPS_SIZE)
+    return SZ_ERROR_UNSUPPORTED;
+  else
+    dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);
+ 
+  if (dicSize < LZMA_DIC_MIN)
+    dicSize = LZMA_DIC_MIN;
+  p->dicSize = dicSize;
+
+  d = data[0];
+  if (d >= (9 * 5 * 5))
+    return SZ_ERROR_UNSUPPORTED;
+
+  p->lc = d % 9;
+  d /= 9;
+  p->pb = d / 5;
+  p->lp = d % 5;
+
+  return SZ_OK;
+}
+
+static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc)
+{
+  UInt32 numProbs = LzmaProps_GetNumProbs(propNew);
+  if (p->probs == 0 || numProbs != p->numProbs)
+  {
+    LzmaDec_FreeProbs(p, alloc);
+    p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb));
+    p->numProbs = numProbs;
+    if (p->probs == 0)
+      return SZ_ERROR_MEM;
+  }
+  return SZ_OK;
+}
+
+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
+{
+  CLzmaProps propNew;
+  RINOK(LzmaProps_Decode(&propNew, props, propsSize));
+  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
+  p->prop = propNew;
+  return SZ_OK;
+}
+
+SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
+{
+  CLzmaProps propNew;
+  SizeT dicBufSize;
+  RINOK(LzmaProps_Decode(&propNew, props, propsSize));
+  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
+  dicBufSize = propNew.dicSize;
+  if (p->dic == 0 || dicBufSize != p->dicBufSize)
+  {
+    LzmaDec_FreeDict(p, alloc);
+    p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);
+    if (p->dic == 0)
+    {
+      LzmaDec_FreeProbs(p, alloc);
+      return SZ_ERROR_MEM;
+    }
+  }
+  p->dicBufSize = dicBufSize;
+  p->prop = propNew;
+  return SZ_OK;
+}
+
+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
+    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
+    ELzmaStatus *status, ISzAlloc *alloc)
+{
+  CLzmaDec p;
+  SRes res;
+  SizeT inSize = *srcLen;
+  SizeT outSize = *destLen;
+  *srcLen = *destLen = 0;
+  if (inSize < RC_INIT_SIZE)
+    return SZ_ERROR_INPUT_EOF;
+
+  LzmaDec_Construct(&p);
+  res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc);
+  if (res != 0)
+    return res;
+  p.dic = dest;
+  p.dicBufSize = outSize;
+
+  LzmaDec_Init(&p);
+  
+  *srcLen = inSize;
+  res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status);
+
+  if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)
+    res = SZ_ERROR_INPUT_EOF;
+
+  (*destLen) = p.dicPos;
+  LzmaDec_FreeProbs(&p, alloc);
+  return res;
+}
diff --git a/util/cbfstool/lzma/C/LzmaDec.h b/util/cbfstool/lzma/C/LzmaDec.h
new file mode 100644
index 0000000..bf7f084
--- /dev/null
+++ b/util/cbfstool/lzma/C/LzmaDec.h
@@ -0,0 +1,231 @@
+/* LzmaDec.h -- LZMA Decoder
+2009-02-07 : Igor Pavlov : Public domain */
+
+#ifndef __LZMA_DEC_H
+#define __LZMA_DEC_H
+
+#include "Types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* #define _LZMA_PROB32 */
+/* _LZMA_PROB32 can increase the speed on some CPUs,
+   but memory usage for CLzmaDec::probs will be doubled in that case */
+
+#ifdef _LZMA_PROB32
+#define CLzmaProb UInt32
+#else
+#define CLzmaProb UInt16
+#endif
+
+
+/* ---------- LZMA Properties ---------- */
+
+#define LZMA_PROPS_SIZE 5
+
+typedef struct _CLzmaProps
+{
+  unsigned lc, lp, pb;
+  UInt32 dicSize;
+} CLzmaProps;
+
+/* LzmaProps_Decode - decodes properties
+Returns:
+  SZ_OK
+  SZ_ERROR_UNSUPPORTED - Unsupported properties
+*/
+
+SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
+
+
+/* ---------- LZMA Decoder state ---------- */
+
+/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.
+   Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */
+
+#define LZMA_REQUIRED_INPUT_MAX 20
+
+typedef struct
+{
+  CLzmaProps prop;
+  CLzmaProb *probs;
+  Byte *dic;
+  const Byte *buf;
+  UInt32 range, code;
+  SizeT dicPos;
+  SizeT dicBufSize;
+  UInt32 processedPos;
+  UInt32 checkDicSize;
+  unsigned state;
+  UInt32 reps[4];
+  unsigned remainLen;
+  int needFlush;
+  int needInitState;
+  UInt32 numProbs;
+  unsigned tempBufSize;
+  Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];
+} CLzmaDec;
+
+#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }
+
+void LzmaDec_Init(CLzmaDec *p);
+
+/* There are two types of LZMA streams:
+     0) Stream with end mark. That end mark adds about 6 bytes to compressed size.
+     1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */
+
+typedef enum
+{
+  LZMA_FINISH_ANY,   /* finish at any point */
+  LZMA_FINISH_END    /* block must be finished at the end */
+} ELzmaFinishMode;
+
+/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!
+
+   You must use LZMA_FINISH_END, when you know that current output buffer
+   covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.
+
+   If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,
+   and output value of destLen will be less than output buffer size limit.
+   You can check status result also.
+
+   You can use multiple checks to test data integrity after full decompression:
+     1) Check Result and "status" variable.
+     2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
+     3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
+        You must use correct finish mode in that case. */
+
+typedef enum
+{
+  LZMA_STATUS_NOT_SPECIFIED,               /* use main error code instead */
+  LZMA_STATUS_FINISHED_WITH_MARK,          /* stream was finished with end mark. */
+  LZMA_STATUS_NOT_FINISHED,                /* stream was not finished */
+  LZMA_STATUS_NEEDS_MORE_INPUT,            /* you must provide more input bytes */
+  LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK  /* there is probability that stream was finished without end mark */
+} ELzmaStatus;
+
+/* ELzmaStatus is used only as output value for function call */
+
+
+/* ---------- Interfaces ---------- */
+
+/* There are 3 levels of interfaces:
+     1) Dictionary Interface
+     2) Buffer Interface
+     3) One Call Interface
+   You can select any of these interfaces, but don't mix functions from different
+   groups for same object. */
+
+
+/* There are two variants to allocate state for Dictionary Interface:
+     1) LzmaDec_Allocate / LzmaDec_Free
+     2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
+   You can use variant 2, if you set dictionary buffer manually.
+   For Buffer Interface you must always use variant 1.
+
+LzmaDec_Allocate* can return:
+  SZ_OK
+  SZ_ERROR_MEM         - Memory allocation error
+  SZ_ERROR_UNSUPPORTED - Unsupported properties
+*/
+   
+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);
+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);
+
+SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);
+void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);
+
+/* ---------- Dictionary Interface ---------- */
+
+/* You can use it, if you want to eliminate the overhead for data copying from
+   dictionary to some other external buffer.
+   You must work with CLzmaDec variables directly in this interface.
+
+   STEPS:
+     LzmaDec_Constr()
+     LzmaDec_Allocate()
+     for (each new stream)
+     {
+       LzmaDec_Init()
+       while (it needs more decompression)
+       {
+         LzmaDec_DecodeToDic()
+         use data from CLzmaDec::dic and update CLzmaDec::dicPos
+       }
+     }
+     LzmaDec_Free()
+*/
+
+/* LzmaDec_DecodeToDic
+   
+   The decoding to internal dictionary buffer (CLzmaDec::dic).
+   You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
+
+finishMode:
+  It has meaning only if the decoding reaches output limit (dicLimit).
+  LZMA_FINISH_ANY - Decode just dicLimit bytes.
+  LZMA_FINISH_END - Stream must be finished after dicLimit.
+
+Returns:
+  SZ_OK
+    status:
+      LZMA_STATUS_FINISHED_WITH_MARK
+      LZMA_STATUS_NOT_FINISHED
+      LZMA_STATUS_NEEDS_MORE_INPUT
+      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
+  SZ_ERROR_DATA - Data error
+*/
+
+SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
+    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
+
+
+/* ---------- Buffer Interface ---------- */
+
+/* It's zlib-like interface.
+   See LzmaDec_DecodeToDic description for information about STEPS and return results,
+   but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
+   to work with CLzmaDec variables manually.
+
+finishMode:
+  It has meaning only if the decoding reaches output limit (*destLen).
+  LZMA_FINISH_ANY - Decode just destLen bytes.
+  LZMA_FINISH_END - Stream must be finished after (*destLen).
+*/
+
+SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
+    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
+
+
+/* ---------- One Call Interface ---------- */
+
+/* LzmaDecode
+
+finishMode:
+  It has meaning only if the decoding reaches output limit (*destLen).
+  LZMA_FINISH_ANY - Decode just destLen bytes.
+  LZMA_FINISH_END - Stream must be finished after (*destLen).
+
+Returns:
+  SZ_OK
+    status:
+      LZMA_STATUS_FINISHED_WITH_MARK
+      LZMA_STATUS_NOT_FINISHED
+      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
+  SZ_ERROR_DATA - Data error
+  SZ_ERROR_MEM  - Memory allocation error
+  SZ_ERROR_UNSUPPORTED - Unsupported properties
+  SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
+*/
+
+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
+    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
+    ELzmaStatus *status, ISzAlloc *alloc);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/util/cbfstool/lzma/C/LzmaEnc.c b/util/cbfstool/lzma/C/LzmaEnc.c
new file mode 100644
index 0000000..aca097d
--- /dev/null
+++ b/util/cbfstool/lzma/C/LzmaEnc.c
@@ -0,0 +1,2270 @@
+/* LzmaEnc.c -- LZMA Encoder
+2009-11-24 : Igor Pavlov : Public domain */
+
+#include <string.h>
+
+/* #define SHOW_STAT */
+/* #define SHOW_STAT2 */
+
+#if defined(SHOW_STAT) || defined(SHOW_STAT2)
+#include <stdio.h>
+#endif
+
+#include "LzmaEnc.h"
+
+#include "LzFind.h"
+#ifndef _7ZIP_ST
+#include "LzFindMt.h"
+#endif
+
+#ifdef SHOW_STAT
+static int ttt = 0;
+#endif
+
+#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1)
+
+#define kBlockSize (9 << 10)
+#define kUnpackBlockSize (1 << 18)
+#define kMatchArraySize (1 << 21)
+#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX)
+
+#define kNumMaxDirectBits (31)
+
+#define kNumTopBits 24
+#define kTopValue ((UInt32)1 << kNumTopBits)
+
+#define kNumBitModelTotalBits 11
+#define kBitModelTotal (1 << kNumBitModelTotalBits)
+#define kNumMoveBits 5
+#define kProbInitValue (kBitModelTotal >> 1)
+
+#define kNumMoveReducingBits 4
+#define kNumBitPriceShiftBits 4
+#define kBitPrice (1 << kNumBitPriceShiftBits)
+
+void LzmaEncProps_Init(CLzmaEncProps *p)
+{
+  p->level = 5;
+  p->dictSize = p->mc = 0;
+  p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1;
+  p->writeEndMark = 0;
+}
+
+void LzmaEncProps_Normalize(CLzmaEncProps *p)
+{
+  int level = p->level;
+  if (level < 0) level = 5;
+  p->level = level;
+  if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26)));
+  if (p->lc < 0) p->lc = 3;
+  if (p->lp < 0) p->lp = 0;
+  if (p->pb < 0) p->pb = 2;
+  if (p->algo < 0) p->algo = (level < 5 ? 0 : 1);
+  if (p->fb < 0) p->fb = (level < 7 ? 32 : 64);
+  if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1);
+  if (p->numHashBytes < 0) p->numHashBytes = 4;
+  if (p->mc == 0)  p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1);
+  if (p->numThreads < 0)
+    p->numThreads =
+      #ifndef _7ZIP_ST
+      ((p->btMode && p->algo) ? 2 : 1);
+      #else
+      1;
+      #endif
+}
+
+UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
+{
+  CLzmaEncProps props = *props2;
+  LzmaEncProps_Normalize(&props);
+  return props.dictSize;
+}
+
+/* #define LZMA_LOG_BSR */
+/* Define it for Intel's CPU */
+
+
+#ifdef LZMA_LOG_BSR
+
+#define kDicLogSizeMaxCompress 30
+
+#define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); }
+
+UInt32 GetPosSlot1(UInt32 pos)
+{
+  UInt32 res;
+  BSR2_RET(pos, res);
+  return res;
+}
+#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }
+#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); }
+
+#else
+
+#define kNumLogBits (9 + (int)sizeof(size_t) / 2)
+#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)
+
+static void LzmaEnc_FastPosInit(Byte *g_FastPos)
+{
+  int c = 2, slotFast;
+  g_FastPos[0] = 0;
+  g_FastPos[1] = 1;
+  
+  for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++)
+  {
+    UInt32 k = (1 << ((slotFast >> 1) - 1));
+    UInt32 j;
+    for (j = 0; j < k; j++, c++)
+      g_FastPos[c] = (Byte)slotFast;
+  }
+}
+
+#define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \
+  (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \
+  res = p->g_FastPos[pos >> i] + (i * 2); }
+/*
+#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \
+  p->g_FastPos[pos >> 6] + 12 : \
+  p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; }
+*/
+
+#define GetPosSlot1(pos) p->g_FastPos[pos]
+#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }
+#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); }
+
+#endif
+
+
+#define LZMA_NUM_REPS 4
+
+typedef unsigned CState;
+
+typedef struct
+{
+  UInt32 price;
+
+  CState state;
+  int prev1IsChar;
+  int prev2;
+
+  UInt32 posPrev2;
+  UInt32 backPrev2;
+
+  UInt32 posPrev;
+  UInt32 backPrev;
+  UInt32 backs[LZMA_NUM_REPS];
+} COptimal;
+
+#define kNumOpts (1 << 12)
+
+#define kNumLenToPosStates 4
+#define kNumPosSlotBits 6
+#define kDicLogSizeMin 0
+#define kDicLogSizeMax 32
+#define kDistTableSizeMax (kDicLogSizeMax * 2)
+
+
+#define kNumAlignBits 4
+#define kAlignTableSize (1 << kNumAlignBits)
+#define kAlignMask (kAlignTableSize - 1)
+
+#define kStartPosModelIndex 4
+#define kEndPosModelIndex 14
+#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex)
+
+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
+
+#ifdef _LZMA_PROB32
+#define CLzmaProb UInt32
+#else
+#define CLzmaProb UInt16
+#endif
+
+#define LZMA_PB_MAX 4
+#define LZMA_LC_MAX 8
+#define LZMA_LP_MAX 4
+
+#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX)
+
+
+#define kLenNumLowBits 3
+#define kLenNumLowSymbols (1 << kLenNumLowBits)
+#define kLenNumMidBits 3
+#define kLenNumMidSymbols (1 << kLenNumMidBits)
+#define kLenNumHighBits 8
+#define kLenNumHighSymbols (1 << kLenNumHighBits)
+
+#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)
+
+#define LZMA_MATCH_LEN_MIN 2
+#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1)
+
+#define kNumStates 12
+
+typedef struct
+{
+  CLzmaProb choice;
+  CLzmaProb choice2;
+  CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits];
+  CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits];
+  CLzmaProb high[kLenNumHighSymbols];
+} CLenEnc;
+
+typedef struct
+{
+  CLenEnc p;
+  UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal];
+  UInt32 tableSize;
+  UInt32 counters[LZMA_NUM_PB_STATES_MAX];
+} CLenPriceEnc;
+
+typedef struct
+{
+  UInt32 range;
+  Byte cache;
+  UInt64 low;
+  UInt64 cacheSize;
+  Byte *buf;
+  Byte *bufLim;
+  Byte *bufBase;
+  ISeqOutStream *outStream;
+  UInt64 processed;
+  SRes res;
+} CRangeEnc;
+
+typedef struct
+{
+  CLzmaProb *litProbs;
+
+  CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];
+  CLzmaProb isRep[kNumStates];
+  CLzmaProb isRepG0[kNumStates];
+  CLzmaProb isRepG1[kNumStates];
+  CLzmaProb isRepG2[kNumStates];
+  CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];
+
+  CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];
+  CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex];
+  CLzmaProb posAlignEncoder[1 << kNumAlignBits];
+  
+  CLenPriceEnc lenEnc;
+  CLenPriceEnc repLenEnc;
+
+  UInt32 reps[LZMA_NUM_REPS];
+  UInt32 state;
+} CSaveState;
+
+typedef struct
+{
+  IMatchFinder matchFinder;
+  void *matchFinderObj;
+
+  #ifndef _7ZIP_ST
+  Bool mtMode;
+  CMatchFinderMt matchFinderMt;
+  #endif
+
+  CMatchFinder matchFinderBase;
+
+  #ifndef _7ZIP_ST
+  Byte pad[128];
+  #endif
+  
+  UInt32 optimumEndIndex;
+  UInt32 optimumCurrentIndex;
+
+  UInt32 longestMatchLength;
+  UInt32 numPairs;
+  UInt32 numAvail;
+  COptimal opt[kNumOpts];
+  
+  #ifndef LZMA_LOG_BSR
+  Byte g_FastPos[1 << kNumLogBits];
+  #endif
+
+  UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits];
+  UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1];
+  UInt32 numFastBytes;
+  UInt32 additionalOffset;
+  UInt32 reps[LZMA_NUM_REPS];
+  UInt32 state;
+
+  UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax];
+  UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances];
+  UInt32 alignPrices[kAlignTableSize];
+  UInt32 alignPriceCount;
+
+  UInt32 distTableSize;
+
+  unsigned lc, lp, pb;
+  unsigned lpMask, pbMask;
+
+  CLzmaProb *litProbs;
+
+  CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];
+  CLzmaProb isRep[kNumStates];
+  CLzmaProb isRepG0[kNumStates];
+  CLzmaProb isRepG1[kNumStates];
+  CLzmaProb isRepG2[kNumStates];
+  CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];
+
+  CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];
+  CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex];
+  CLzmaProb posAlignEncoder[1 << kNumAlignBits];
+  
+  CLenPriceEnc lenEnc;
+  CLenPriceEnc repLenEnc;
+
+  unsigned lclp;
+
+  Bool fastMode;
+  
+  CRangeEnc rc;
+
+  Bool writeEndMark;
+  UInt64 nowPos64;
+  UInt32 matchPriceCount;
+  Bool finished;
+  Bool multiThread;
+
+  SRes result;
+  UInt32 dictSize;
+  UInt32 matchFinderCycles;
+
+  int needInit;
+
+  CSaveState saveState;
+} CLzmaEnc;
+
+/*static void LzmaEnc_SaveState(CLzmaEncHandle pp)
+{
+  CLzmaEnc *p = (CLzmaEnc *)pp;
+  CSaveState *dest = &p->saveState;
+  int i;
+  dest->lenEnc = p->lenEnc;
+  dest->repLenEnc = p->repLenEnc;
+  dest->state = p->state;
+
+  for (i = 0; i < kNumStates; i++)
+  {
+    memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
+    memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
+  }
+  for (i = 0; i < kNumLenToPosStates; i++)
+    memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
+  memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
+  memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
+  memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
+  memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
+  memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
+  memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
+  memcpy(dest->reps, p->reps, sizeof(p->reps));
+  memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb));
+}*/
+
+/*static void LzmaEnc_RestoreState(CLzmaEncHandle pp)
+{
+  CLzmaEnc *dest = (CLzmaEnc *)pp;
+  const CSaveState *p = &dest->saveState;
+  int i;
+  dest->lenEnc = p->lenEnc;
+  dest->repLenEnc = p->repLenEnc;
+  dest->state = p->state;
+
+  for (i = 0; i < kNumStates; i++)
+  {
+    memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
+    memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
+  }
+  for (i = 0; i < kNumLenToPosStates; i++)
+    memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
+  memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
+  memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
+  memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
+  memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
+  memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
+  memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
+  memcpy(dest->reps, p->reps, sizeof(p->reps));
+  memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb));
+}*/
+
+SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2)
+{
+  CLzmaEnc *p = (CLzmaEnc *)pp;
+  CLzmaEncProps props = *props2;
+  LzmaEncProps_Normalize(&props);
+
+  if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX ||
+      props.dictSize > (1 << kDicLogSizeMaxCompress) || props.dictSize > (1 << 30))
+    return SZ_ERROR_PARAM;
+  p->dictSize = props.dictSize;
+  p->matchFinderCycles = props.mc;
+  {
+    unsigned fb = props.fb;
+    if (fb < 5)
+      fb = 5;
+    if (fb > LZMA_MATCH_LEN_MAX)
+      fb = LZMA_MATCH_LEN_MAX;
+    p->numFastBytes = fb;
+  }
+  p->lc = props.lc;
+  p->lp = props.lp;
+  p->pb = props.pb;
+  p->fastMode = (props.algo == 0);
+  p->matchFinderBase.btMode = props.btMode;
+  {
+    UInt32 numHashBytes = 4;
+    if (props.btMode)
+    {
+      if (props.numHashBytes < 2)
+        numHashBytes = 2;
+      else if (props.numHashBytes < 4)
+        numHashBytes = props.numHashBytes;
+    }
+    p->matchFinderBase.numHashBytes = numHashBytes;
+  }
+
+  p->matchFinderBase.cutValue = props.mc;
+
+  p->writeEndMark = props.writeEndMark;
+
+  #ifndef _7ZIP_ST
+  /*
+  if (newMultiThread != _multiThread)
+  {
+    ReleaseMatchFinder();
+    _multiThread = newMultiThread;
+  }
+  */
+  p->multiThread = (props.numThreads > 1);
+  #endif
+
+  return SZ_OK;
+}
+
+static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4,  5,  6,   4, 5};
+static const int kMatchNextStates[kNumStates]   = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10};
+static const int kRepNextStates[kNumStates]     = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11};
+static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11};
+
+#define IsCharState(s) ((s) < 7)
+
+#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1)
+
+#define kInfinityPrice (1 << 30)
+
+static void RangeEnc_Construct(CRangeEnc *p)
+{
+  p->outStream = 0;
+  p->bufBase = 0;
+}
+
+#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize)
+
+#define RC_BUF_SIZE (1 << 16)
+static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc)
+{
+  if (p->bufBase == 0)
+  {
+    p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE);
+    if (p->bufBase == 0)
+      return 0;
+    p->bufLim = p->bufBase + RC_BUF_SIZE;
+  }
+  return 1;
+}
+
+static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc)
+{
+  alloc->Free(alloc, p->bufBase);
+  p->bufBase = 0;
+}
+
+static void RangeEnc_Init(CRangeEnc *p)
+{
+  /* Stream.Init(); */
+  p->low = 0;
+  p->range = 0xFFFFFFFF;
+  p->cacheSize = 1;
+  p->cache = 0;
+
+  p->buf = p->bufBase;
+
+  p->processed = 0;
+  p->res = SZ_OK;
+}
+
+static void RangeEnc_FlushStream(CRangeEnc *p)
+{
+  size_t num;
+  if (p->res != SZ_OK)
+    return;
+  num = p->buf - p->bufBase;
+  if (num != p->outStream->Write(p->outStream, p->bufBase, num))
+    p->res = SZ_ERROR_WRITE;
+  p->processed += num;
+  p->buf = p->bufBase;
+}
+
+static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p)
+{
+  if ((UInt32)p->low < (UInt32)0xFF000000 || (int)(p->low >> 32) != 0)
+  {
+    Byte temp = p->cache;
+    do
+    {
+      Byte *buf = p->buf;
+      *buf++ = (Byte)(temp + (Byte)(p->low >> 32));
+      p->buf = buf;
+      if (buf == p->bufLim)
+        RangeEnc_FlushStream(p);
+      temp = 0xFF;
+    }
+    while (--p->cacheSize != 0);
+    p->cache = (Byte)((UInt32)p->low >> 24);
+  }
+  p->cacheSize++;
+  p->low = (UInt32)p->low << 8;
+}
+
+static void RangeEnc_FlushData(CRangeEnc *p)
+{
+  int i;
+  for (i = 0; i < 5; i++)
+    RangeEnc_ShiftLow(p);
+}
+
+static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, int numBits)
+{
+  do
+  {
+    p->range >>= 1;
+    p->low += p->range & (0 - ((value >> --numBits) & 1));
+    if (p->range < kTopValue)
+    {
+      p->range <<= 8;
+      RangeEnc_ShiftLow(p);
+    }
+  }
+  while (numBits != 0);
+}
+
+static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol)
+{
+  UInt32 ttt = *prob;
+  UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt;
+  if (symbol == 0)
+  {
+    p->range = newBound;
+    ttt += (kBitModelTotal - ttt) >> kNumMoveBits;
+  }
+  else
+  {
+    p->low += newBound;
+    p->range -= newBound;
+    ttt -= ttt >> kNumMoveBits;
+  }
+  *prob = (CLzmaProb)ttt;
+  if (p->range < kTopValue)
+  {
+    p->range <<= 8;
+    RangeEnc_ShiftLow(p);
+  }
+}
+
+static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol)
+{
+  symbol |= 0x100;
+  do
+  {
+    RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1);
+    symbol <<= 1;
+  }
+  while (symbol < 0x10000);
+}
+
+static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte)
+{
+  UInt32 offs = 0x100;
+  symbol |= 0x100;
+  do
+  {
+    matchByte <<= 1;
+    RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1);
+    symbol <<= 1;
+    offs &= ~(matchByte ^ symbol);
+  }
+  while (symbol < 0x10000);
+}
+
+static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
+{
+  UInt32 i;
+  for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits))
+  {
+    const int kCyclesBits = kNumBitPriceShiftBits;
+    UInt32 w = i;
+    UInt32 bitCount = 0;
+    int j;
+    for (j = 0; j < kCyclesBits; j++)
+    {
+      w = w * w;
+      bitCount <<= 1;
+      while (w >= ((UInt32)1 << 16))
+      {
+        w >>= 1;
+        bitCount++;
+      }
+    }
+    ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount);
+  }
+}
+
+
+#define GET_PRICE(prob, symbol) \
+  p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];
+
+#define GET_PRICEa(prob, symbol) \
+  ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];
+
+#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits]
+#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]
+
+#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits]
+#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]
+
+static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices)
+{
+  UInt32 price = 0;
+  symbol |= 0x100;
+  do
+  {
+    price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1);
+    symbol <<= 1;
+  }
+  while (symbol < 0x10000);
+  return price;
+}
+
+static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices)
+{
+  UInt32 price = 0;
+  UInt32 offs = 0x100;
+  symbol |= 0x100;
+  do
+  {
+    matchByte <<= 1;
+    price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1);
+    symbol <<= 1;
+    offs &= ~(matchByte ^ symbol);
+  }
+  while (symbol < 0x10000);
+  return price;
+}
+
+
+static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol)
+{
+  UInt32 m = 1;
+  int i;
+  for (i = numBitLevels; i != 0;)
+  {
+    UInt32 bit;
+    i--;
+    bit = (symbol >> i) & 1;
+    RangeEnc_EncodeBit(rc, probs + m, bit);
+    m = (m << 1) | bit;
+  }
+}
+
+static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol)
+{
+  UInt32 m = 1;
+  int i;
+  for (i = 0; i < numBitLevels; i++)
+  {
+    UInt32 bit = symbol & 1;
+    RangeEnc_EncodeBit(rc, probs + m, bit);
+    m = (m << 1) | bit;
+    symbol >>= 1;
+  }
+}
+
+static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices)
+{
+  UInt32 price = 0;
+  symbol |= (1 << numBitLevels);
+  while (symbol != 1)
+  {
+    price += GET_PRICEa(probs[symbol >> 1], symbol & 1);
+    symbol >>= 1;
+  }
+  return price;
+}
+
+static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices)
+{
+  UInt32 price = 0;
+  UInt32 m = 1;
+  int i;
+  for (i = numBitLevels; i != 0; i--)
+  {
+    UInt32 bit = symbol & 1;
+    symbol >>= 1;
+    price += GET_PRICEa(probs[m], bit);
+    m = (m << 1) | bit;
+  }
+  return price;
+}
+
+
+static void LenEnc_Init(CLenEnc *p)
+{
+  unsigned i;
+  p->choice = p->choice2 = kProbInitValue;
+  for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++)
+    p->low[i] = kProbInitValue;
+  for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++)
+    p->mid[i] = kProbInitValue;
+  for (i = 0; i < kLenNumHighSymbols; i++)
+    p->high[i] = kProbInitValue;
+}
+
+static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState)
+{
+  if (symbol < kLenNumLowSymbols)
+  {
+    RangeEnc_EncodeBit(rc, &p->choice, 0);
+    RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol);
+  }
+  else
+  {
+    RangeEnc_EncodeBit(rc, &p->choice, 1);
+    if (symbol < kLenNumLowSymbols + kLenNumMidSymbols)
+    {
+      RangeEnc_EncodeBit(rc, &p->choice2, 0);
+      RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols);
+    }
+    else
+    {
+      RangeEnc_EncodeBit(rc, &p->choice2, 1);
+      RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols);
+    }
+  }
+}
+
+static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices)
+{
+  UInt32 a0 = GET_PRICE_0a(p->choice);
+  UInt32 a1 = GET_PRICE_1a(p->choice);
+  UInt32 b0 = a1 + GET_PRICE_0a(p->choice2);
+  UInt32 b1 = a1 + GET_PRICE_1a(p->choice2);
+  UInt32 i = 0;
+  for (i = 0; i < kLenNumLowSymbols; i++)
+  {
+    if (i >= numSymbols)
+      return;
+    prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices);
+  }
+  for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++)
+  {
+    if (i >= numSymbols)
+      return;
+    prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices);
+  }
+  for (; i < numSymbols; i++)
+    prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices);
+}
+
+static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices)
+{
+  LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices);
+  p->counters[posState] = p->tableSize;
+}
+
+static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices)
+{
+  UInt32 posState;
+  for (posState = 0; posState < numPosStates; posState++)
+    LenPriceEnc_UpdateTable(p, posState, ProbPrices);
+}
+
+static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices)
+{
+  LenEnc_Encode(&p->p, rc, symbol, posState);
+  if (updatePrice)
+    if (--p->counters[posState] == 0)
+      LenPriceEnc_UpdateTable(p, posState, ProbPrices);
+}
+
+
+
+
+static void MovePos(CLzmaEnc *p, UInt32 num)
+{
+  #ifdef SHOW_STAT
+  ttt += num;
+  printf("\n MovePos %d", num);
+  #endif
+  if (num != 0)
+  {
+    p->additionalOffset += num;
+    p->matchFinder.Skip(p->matchFinderObj, num);
+  }
+}
+
+static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes)
+{
+  UInt32 lenRes = 0, numPairs;
+  p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
+  numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches);
+  #ifdef SHOW_STAT
+  printf("\n i = %d numPairs = %d    ", ttt, numPairs / 2);
+  ttt++;
+  {
+    UInt32 i;
+    for (i = 0; i < numPairs; i += 2)
+      printf("%2d %6d   | ", p->matches[i], p->matches[i + 1]);
+  }
+  #endif
+  if (numPairs > 0)
+  {
+    lenRes = p->matches[numPairs - 2];
+    if (lenRes == p->numFastBytes)
+    {
+      const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
+      UInt32 distance = p->matches[numPairs - 1] + 1;
+      UInt32 numAvail = p->numAvail;
+      if (numAvail > LZMA_MATCH_LEN_MAX)
+        numAvail = LZMA_MATCH_LEN_MAX;
+      {
+        const Byte *pby2 = pby - distance;
+        for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++);
+      }
+    }
+  }
+  p->additionalOffset++;
+  *numDistancePairsRes = numPairs;
+  return lenRes;
+}
+
+
+#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False;
+#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False;
+#define IsShortRep(p) ((p)->backPrev == 0)
+
+static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState)
+{
+  return
+    GET_PRICE_0(p->isRepG0[state]) +
+    GET_PRICE_0(p->isRep0Long[state][posState]);
+}
+
+static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState)
+{
+  UInt32 price;
+  if (repIndex == 0)
+  {
+    price = GET_PRICE_0(p->isRepG0[state]);
+    price += GET_PRICE_1(p->isRep0Long[state][posState]);
+  }
+  else
+  {
+    price = GET_PRICE_1(p->isRepG0[state]);
+    if (repIndex == 1)
+      price += GET_PRICE_0(p->isRepG1[state]);
+    else
+    {
+      price += GET_PRICE_1(p->isRepG1[state]);
+      price += GET_PRICE(p->isRepG2[state], repIndex - 2);
+    }
+  }
+  return price;
+}
+
+static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState)
+{
+  return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] +
+    GetPureRepPrice(p, repIndex, state, posState);
+}
+
+static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur)
+{
+  UInt32 posMem = p->opt[cur].posPrev;
+  UInt32 backMem = p->opt[cur].backPrev;
+  p->optimumEndIndex = cur;
+  do
+  {
+    if (p->opt[cur].prev1IsChar)
+    {
+      MakeAsChar(&p->opt[posMem])
+      p->opt[posMem].posPrev = posMem - 1;
+      if (p->opt[cur].prev2)
+      {
+        p->opt[posMem - 1].prev1IsChar = False;
+        p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2;
+        p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2;
+      }
+    }
+    {
+      UInt32 posPrev = posMem;
+      UInt32 backCur = backMem;
+      
+      backMem = p->opt[posPrev].backPrev;
+      posMem = p->opt[posPrev].posPrev;
+      
+      p->opt[posPrev].backPrev = backCur;
+      p->opt[posPrev].posPrev = cur;
+      cur = posPrev;
+    }
+  }
+  while (cur != 0);
+  *backRes = p->opt[0].backPrev;
+  p->optimumCurrentIndex  = p->opt[0].posPrev;
+  return p->optimumCurrentIndex;
+}
+
+#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300)
+
+static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes)
+{
+  UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, lenEnd, len, cur;
+  UInt32 matchPrice, repMatchPrice, normalMatchPrice;
+  UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS];
+  UInt32 *matches;
+  const Byte *data;
+  Byte curByte, matchByte;
+  if (p->optimumEndIndex != p->optimumCurrentIndex)
+  {
+    const COptimal *opt = &p->opt[p->optimumCurrentIndex];
+    UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex;
+    *backRes = opt->backPrev;
+    p->optimumCurrentIndex = opt->posPrev;
+    return lenRes;
+  }
+  p->optimumCurrentIndex = p->optimumEndIndex = 0;
+  
+  if (p->additionalOffset == 0)
+    mainLen = ReadMatchDistances(p, &numPairs);
+  else
+  {
+    mainLen = p->longestMatchLength;
+    numPairs = p->numPairs;
+  }
+
+  numAvail = p->numAvail;
+  if (numAvail < 2)
+  {
+    *backRes = (UInt32)(-1);
+    return 1;
+  }
+  if (numAvail > LZMA_MATCH_LEN_MAX)
+    numAvail = LZMA_MATCH_LEN_MAX;
+
+  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
+  repMaxIndex = 0;
+  for (i = 0; i < LZMA_NUM_REPS; i++)
+  {
+    UInt32 lenTest;
+    const Byte *data2;
+    reps[i] = p->reps[i];
+    data2 = data - (reps[i] + 1);
+    if (data[0] != data2[0] || data[1] != data2[1])
+    {
+      repLens[i] = 0;
+      continue;
+    }
+    for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++);
+    repLens[i] = lenTest;
+    if (lenTest > repLens[repMaxIndex])
+      repMaxIndex = i;
+  }
+  if (repLens[repMaxIndex] >= p->numFastBytes)
+  {
+    UInt32 lenRes;
+    *backRes = repMaxIndex;
+    lenRes = repLens[repMaxIndex];
+    MovePos(p, lenRes - 1);
+    return lenRes;
+  }
+
+  matches = p->matches;
+  if (mainLen >= p->numFastBytes)
+  {
+    *backRes = matches[numPairs - 1] + LZMA_NUM_REPS;
+    MovePos(p, mainLen - 1);
+    return mainLen;
+  }
+  curByte = *data;
+  matchByte = *(data - (reps[0] + 1));
+
+  if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2)
+  {
+    *backRes = (UInt32)-1;
+    return 1;
+  }
+
+  p->opt[0].state = (CState)p->state;
+
+  posState = (position & p->pbMask);
+
+  {
+    const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));
+    p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) +
+        (!IsCharState(p->state) ?
+          LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) :
+          LitEnc_GetPrice(probs, curByte, p->ProbPrices));
+  }
+
+  MakeAsChar(&p->opt[1]);
+
+  matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]);
+  repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]);
+
+  if (matchByte == curByte)
+  {
+    UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState);
+    if (shortRepPrice < p->opt[1].price)
+    {
+      p->opt[1].price = shortRepPrice;
+      MakeAsShortRep(&p->opt[1]);
+    }
+  }
+  lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]);
+
+  if (lenEnd < 2)
+  {
+    *backRes = p->opt[1].backPrev;
+    return 1;
+  }
+
+  p->opt[1].posPrev = 0;
+  for (i = 0; i < LZMA_NUM_REPS; i++)
+    p->opt[0].backs[i] = reps[i];
+
+  len = lenEnd;
+  do
+    p->opt[len--].price = kInfinityPrice;
+  while (len >= 2);
+
+  for (i = 0; i < LZMA_NUM_REPS; i++)
+  {
+    UInt32 repLen = repLens[i];
+    UInt32 price;
+    if (repLen < 2)
+      continue;
+    price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState);
+    do
+    {
+      UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2];
+      COptimal *opt = &p->opt[repLen];
+      if (curAndLenPrice < opt->price)
+      {
+        opt->price = curAndLenPrice;
+        opt->posPrev = 0;
+        opt->backPrev = i;
+        opt->prev1IsChar = False;
+      }
+    }
+    while (--repLen >= 2);
+  }
+
+  normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]);
+
+  len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2);
+  if (len <= mainLen)
+  {
+    UInt32 offs = 0;
+    while (len > matches[offs])
+      offs += 2;
+    for (; ; len++)
+    {
+      COptimal *opt;
+      UInt32 distance = matches[offs + 1];
+
+      UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN];
+      UInt32 lenToPosState = GetLenToPosState(len);
+      if (distance < kNumFullDistances)
+        curAndLenPrice += p->distancesPrices[lenToPosState][distance];
+      else
+      {
+        UInt32 slot;
+        GetPosSlot2(distance, slot);
+        curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot];
+      }
+      opt = &p->opt[len];
+      if (curAndLenPrice < opt->price)
+      {
+        opt->price = curAndLenPrice;
+        opt->posPrev = 0;
+        opt->backPrev = distance + LZMA_NUM_REPS;
+        opt->prev1IsChar = False;
+      }
+      if (len == matches[offs])
+      {
+        offs += 2;
+        if (offs == numPairs)
+          break;
+      }
+    }
+  }
+
+  cur = 0;
+
+    #ifdef SHOW_STAT2
+    if (position >= 0)
+    {
+      unsigned i;
+      printf("\n pos = %4X", position);
+      for (i = cur; i <= lenEnd; i++)
+      printf("\nprice[%4X] = %d", position - cur + i, p->opt[i].price);
+    }
+    #endif
+
+  for (;;)
+  {
+    UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen;
+    UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice;
+    Bool nextIsChar;
+    Byte curByte, matchByte;
+    const Byte *data;
+    COptimal *curOpt;
+    COptimal *nextOpt;
+
+    cur++;
+    if (cur == lenEnd)
+      return Backward(p, backRes, cur);
+
+    newLen = ReadMatchDistances(p, &numPairs);
+    if (newLen >= p->numFastBytes)
+    {
+      p->numPairs = numPairs;
+      p->longestMatchLength = newLen;
+      return Backward(p, backRes, cur);
+    }
+    position++;
+    curOpt = &p->opt[cur];
+    posPrev = curOpt->posPrev;
+    if (curOpt->prev1IsChar)
+    {
+      posPrev--;
+      if (curOpt->prev2)
+      {
+        state = p->opt[curOpt->posPrev2].state;
+        if (curOpt->backPrev2 < LZMA_NUM_REPS)
+          state = kRepNextStates[state];
+        else
+          state = kMatchNextStates[state];
+      }
+      else
+        state = p->opt[posPrev].state;
+      state = kLiteralNextStates[state];
+    }
+    else
+      state = p->opt[posPrev].state;
+    if (posPrev == cur - 1)
+    {
+      if (IsShortRep(curOpt))
+        state = kShortRepNextStates[state];
+      else
+        state = kLiteralNextStates[state];
+    }
+    else
+    {
+      UInt32 pos;
+      const COptimal *prevOpt;
+      if (curOpt->prev1IsChar && curOpt->prev2)
+      {
+        posPrev = curOpt->posPrev2;
+        pos = curOpt->backPrev2;
+        state = kRepNextStates[state];
+      }
+      else
+      {
+        pos = curOpt->backPrev;
+        if (pos < LZMA_NUM_REPS)
+          state = kRepNextStates[state];
+        else
+          state = kMatchNextStates[state];
+      }
+      prevOpt = &p->opt[posPrev];
+      if (pos < LZMA_NUM_REPS)
+      {
+        UInt32 i;
+        reps[0] = prevOpt->backs[pos];
+        for (i = 1; i <= pos; i++)
+          reps[i] = prevOpt->backs[i - 1];
+        for (; i < LZMA_NUM_REPS; i++)
+          reps[i] = prevOpt->backs[i];
+      }
+      else
+      {
+        UInt32 i;
+        reps[0] = (pos - LZMA_NUM_REPS);
+        for (i = 1; i < LZMA_NUM_REPS; i++)
+          reps[i] = prevOpt->backs[i - 1];
+      }
+    }
+    curOpt->state = (CState)state;
+
+    curOpt->backs[0] = reps[0];
+    curOpt->backs[1] = reps[1];
+    curOpt->backs[2] = reps[2];
+    curOpt->backs[3] = reps[3];
+
+    curPrice = curOpt->price;
+    nextIsChar = False;
+    data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
+    curByte = *data;
+    matchByte = *(data - (reps[0] + 1));
+
+    posState = (position & p->pbMask);
+
+    curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]);
+    {
+      const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));
+      curAnd1Price +=
+        (!IsCharState(state) ?
+          LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) :
+          LitEnc_GetPrice(probs, curByte, p->ProbPrices));
+    }
+
+    nextOpt = &p->opt[cur + 1];
+
+    if (curAnd1Price < nextOpt->price)
+    {
+      nextOpt->price = curAnd1Price;
+      nextOpt->posPrev = cur;
+      MakeAsChar(nextOpt);
+      nextIsChar = True;
+    }
+
+    matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]);
+    repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]);
+    
+    if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0))
+    {
+      UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState);
+      if (shortRepPrice <= nextOpt->price)
+      {
+        nextOpt->price = shortRepPrice;
+        nextOpt->posPrev = cur;
+        MakeAsShortRep(nextOpt);
+        nextIsChar = True;
+      }
+    }
+    numAvailFull = p->numAvail;
+    {
+      UInt32 temp = kNumOpts - 1 - cur;
+      if (temp < numAvailFull)
+        numAvailFull = temp;
+    }
+
+    if (numAvailFull < 2)
+      continue;
+    numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes);
+
+    if (!nextIsChar && matchByte != curByte) /* speed optimization */
+    {
+      /* try Literal + rep0 */
+      UInt32 temp;
+      UInt32 lenTest2;
+      const Byte *data2 = data - (reps[0] + 1);
+      UInt32 limit = p->numFastBytes + 1;
+      if (limit > numAvailFull)
+        limit = numAvailFull;
+
+      for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++);
+      lenTest2 = temp - 1;
+      if (lenTest2 >= 2)
+      {
+        UInt32 state2 = kLiteralNextStates[state];
+        UInt32 posStateNext = (position + 1) & p->pbMask;
+        UInt32 nextRepMatchPrice = curAnd1Price +
+            GET_PRICE_1(p->isMatch[state2][posStateNext]) +
+            GET_PRICE_1(p->isRep[state2]);
+        /* for (; lenTest2 >= 2; lenTest2--) */
+        {
+          UInt32 curAndLenPrice;
+          COptimal *opt;
+          UInt32 offset = cur + 1 + lenTest2;
+          while (lenEnd < offset)
+            p->opt[++lenEnd].price = kInfinityPrice;
+          curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
+          opt = &p->opt[offset];
+          if (curAndLenPrice < opt->price)
+          {
+            opt->price = curAndLenPrice;
+            opt->posPrev = cur + 1;
+            opt->backPrev = 0;
+            opt->prev1IsChar = True;
+            opt->prev2 = False;
+          }
+        }
+      }
+    }
+    
+    startLen = 2; /* speed optimization */
+    {
+    UInt32 repIndex;
+    for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++)
+    {
+      UInt32 lenTest;
+      UInt32 lenTestTemp;
+      UInt32 price;
+      const Byte *data2 = data - (reps[repIndex] + 1);
+      if (data[0] != data2[0] || data[1] != data2[1])
+        continue;
+      for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++);
+      while (lenEnd < cur + lenTest)
+        p->opt[++lenEnd].price = kInfinityPrice;
+      lenTestTemp = lenTest;
+      price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState);
+      do
+      {
+        UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2];
+        COptimal *opt = &p->opt[cur + lenTest];
+        if (curAndLenPrice < opt->price)
+        {
+          opt->price = curAndLenPrice;
+          opt->posPrev = cur;
+          opt->backPrev = repIndex;
+          opt->prev1IsChar = False;
+        }
+      }
+      while (--lenTest >= 2);
+      lenTest = lenTestTemp;
+      
+      if (repIndex == 0)
+        startLen = lenTest + 1;
+        
+      /* if (_maxMode) */
+        {
+          UInt32 lenTest2 = lenTest + 1;
+          UInt32 limit = lenTest2 + p->numFastBytes;
+          UInt32 nextRepMatchPrice;
+          if (limit > numAvailFull)
+            limit = numAvailFull;
+          for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++);
+          lenTest2 -= lenTest + 1;
+          if (lenTest2 >= 2)
+          {
+            UInt32 state2 = kRepNextStates[state];
+            UInt32 posStateNext = (position + lenTest) & p->pbMask;
+            UInt32 curAndLenCharPrice =
+                price + p->repLenEnc.prices[posState][lenTest - 2] +
+                GET_PRICE_0(p->isMatch[state2][posStateNext]) +
+                LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]),
+                    data[lenTest], data2[lenTest], p->ProbPrices);
+            state2 = kLiteralNextStates[state2];
+            posStateNext = (position + lenTest + 1) & p->pbMask;
+            nextRepMatchPrice = curAndLenCharPrice +
+                GET_PRICE_1(p->isMatch[state2][posStateNext]) +
+                GET_PRICE_1(p->isRep[state2]);
+            
+            /* for (; lenTest2 >= 2; lenTest2--) */
+            {
+              UInt32 curAndLenPrice;
+              COptimal *opt;
+              UInt32 offset = cur + lenTest + 1 + lenTest2;
+              while (lenEnd < offset)
+                p->opt[++lenEnd].price = kInfinityPrice;
+              curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
+              opt = &p->opt[offset];
+              if (curAndLenPrice < opt->price)
+              {
+                opt->price = curAndLenPrice;
+                opt->posPrev = cur + lenTest + 1;
+                opt->backPrev = 0;
+                opt->prev1IsChar = True;
+                opt->prev2 = True;
+                opt->posPrev2 = cur;
+                opt->backPrev2 = repIndex;
+              }
+            }
+          }
+        }
+    }
+    }
+    /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */
+    if (newLen > numAvail)
+    {
+      newLen = numAvail;
+      for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2);
+      matches[numPairs] = newLen;
+      numPairs += 2;
+    }
+    if (newLen >= startLen)
+    {
+      UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]);
+      UInt32 offs, curBack, posSlot;
+      UInt32 lenTest;
+      while (lenEnd < cur + newLen)
+        p->opt[++lenEnd].price = kInfinityPrice;
+
+      offs = 0;
+      while (startLen > matches[offs])
+        offs += 2;
+      curBack = matches[offs + 1];
+      GetPosSlot2(curBack, posSlot);
+      for (lenTest = /*2*/ startLen; ; lenTest++)
+      {
+        UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN];
+        UInt32 lenToPosState = GetLenToPosState(lenTest);
+        COptimal *opt;
+        if (curBack < kNumFullDistances)
+          curAndLenPrice += p->distancesPrices[lenToPosState][curBack];
+        else
+          curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask];
+        
+        opt = &p->opt[cur + lenTest];
+        if (curAndLenPrice < opt->price)
+        {
+          opt->price = curAndLenPrice;
+          opt->posPrev = cur;
+          opt->backPrev = curBack + LZMA_NUM_REPS;
+          opt->prev1IsChar = False;
+        }
+
+        if (/*_maxMode && */lenTest == matches[offs])
+        {
+          /* Try Match + Literal + Rep0 */
+          const Byte *data2 = data - (curBack + 1);
+          UInt32 lenTest2 = lenTest + 1;
+          UInt32 limit = lenTest2 + p->numFastBytes;
+          UInt32 nextRepMatchPrice;
+          if (limit > numAvailFull)
+            limit = numAvailFull;
+          for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++);
+          lenTest2 -= lenTest + 1;
+          if (lenTest2 >= 2)
+          {
+            UInt32 state2 = kMatchNextStates[state];
+            UInt32 posStateNext = (position + lenTest) & p->pbMask;
+            UInt32 curAndLenCharPrice = curAndLenPrice +
+                GET_PRICE_0(p->isMatch[state2][posStateNext]) +
+                LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]),
+                    data[lenTest], data2[lenTest], p->ProbPrices);
+            state2 = kLiteralNextStates[state2];
+            posStateNext = (posStateNext + 1) & p->pbMask;
+            nextRepMatchPrice = curAndLenCharPrice +
+                GET_PRICE_1(p->isMatch[state2][posStateNext]) +
+                GET_PRICE_1(p->isRep[state2]);
+            
+            /* for (; lenTest2 >= 2; lenTest2--) */
+            {
+              UInt32 offset = cur + lenTest + 1 + lenTest2;
+              UInt32 curAndLenPrice;
+              COptimal *opt;
+              while (lenEnd < offset)
+                p->opt[++lenEnd].price = kInfinityPrice;
+              curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
+              opt = &p->opt[offset];
+              if (curAndLenPrice < opt->price)
+              {
+                opt->price = curAndLenPrice;
+                opt->posPrev = cur + lenTest + 1;
+                opt->backPrev = 0;
+                opt->prev1IsChar = True;
+                opt->prev2 = True;
+                opt->posPrev2 = cur;
+                opt->backPrev2 = curBack + LZMA_NUM_REPS;
+              }
+            }
+          }
+          offs += 2;
+          if (offs == numPairs)
+            break;
+          curBack = matches[offs + 1];
+          if (curBack >= kNumFullDistances)
+            GetPosSlot2(curBack, posSlot);
+        }
+      }
+    }
+  }
+}
+
+#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist))
+
+static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes)
+{
+  UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i;
+  const Byte *data;
+  const UInt32 *matches;
+
+  if (p->additionalOffset == 0)
+    mainLen = ReadMatchDistances(p, &numPairs);
+  else
+  {
+    mainLen = p->longestMatchLength;
+    numPairs = p->numPairs;
+  }
+
+  numAvail = p->numAvail;
+  *backRes = (UInt32)-1;
+  if (numAvail < 2)
+    return 1;
+  if (numAvail > LZMA_MATCH_LEN_MAX)
+    numAvail = LZMA_MATCH_LEN_MAX;
+  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
+
+  repLen = repIndex = 0;
+  for (i = 0; i < LZMA_NUM_REPS; i++)
+  {
+    UInt32 len;
+    const Byte *data2 = data - (p->reps[i] + 1);
+    if (data[0] != data2[0] || data[1] != data2[1])
+      continue;
+    for (len = 2; len < numAvail && data[len] == data2[len]; len++);
+    if (len >= p->numFastBytes)
+    {
+      *backRes = i;
+      MovePos(p, len - 1);
+      return len;
+    }
+    if (len > repLen)
+    {
+      repIndex = i;
+      repLen = len;
+    }
+  }
+
+  matches = p->matches;
+  if (mainLen >= p->numFastBytes)
+  {
+    *backRes = matches[numPairs - 1] + LZMA_NUM_REPS;
+    MovePos(p, mainLen - 1);
+    return mainLen;
+  }
+
+  mainDist = 0; /* for GCC */
+  if (mainLen >= 2)
+  {
+    mainDist = matches[numPairs - 1];
+    while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1)
+    {
+      if (!ChangePair(matches[numPairs - 3], mainDist))
+        break;
+      numPairs -= 2;
+      mainLen = matches[numPairs - 2];
+      mainDist = matches[numPairs - 1];
+    }
+    if (mainLen == 2 && mainDist >= 0x80)
+      mainLen = 1;
+  }
+
+  if (repLen >= 2 && (
+        (repLen + 1 >= mainLen) ||
+        (repLen + 2 >= mainLen && mainDist >= (1 << 9)) ||
+        (repLen + 3 >= mainLen && mainDist >= (1 << 15))))
+  {
+    *backRes = repIndex;
+    MovePos(p, repLen - 1);
+    return repLen;
+  }
+  
+  if (mainLen < 2 || numAvail <= 2)
+    return 1;
+
+  p->longestMatchLength = ReadMatchDistances(p, &p->numPairs);
+  if (p->longestMatchLength >= 2)
+  {
+    UInt32 newDistance = matches[p->numPairs - 1];
+    if ((p->longestMatchLength >= mainLen && newDistance < mainDist) ||
+        (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) ||
+        (p->longestMatchLength > mainLen + 1) ||
+        (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist)))
+      return 1;
+  }
+  
+  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
+  for (i = 0; i < LZMA_NUM_REPS; i++)
+  {
+    UInt32 len, limit;
+    const Byte *data2 = data - (p->reps[i] + 1);
+    if (data[0] != data2[0] || data[1] != data2[1])
+      continue;
+    limit = mainLen - 1;
+    for (len = 2; len < limit && data[len] == data2[len]; len++);
+    if (len >= limit)
+      return 1;
+  }
+  *backRes = mainDist + LZMA_NUM_REPS;
+  MovePos(p, mainLen - 2);
+  return mainLen;
+}
+
+static void WriteEndMarker(CLzmaEnc *p, UInt32 posState)
+{
+  UInt32 len;
+  RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1);
+  RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);
+  p->state = kMatchNextStates[p->state];
+  len = LZMA_MATCH_LEN_MIN;
+  LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
+  RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1);
+  RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits);
+  RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask);
+}
+
+static SRes CheckErrors(CLzmaEnc *p)
+{
+  if (p->result != SZ_OK)
+    return p->result;
+  if (p->rc.res != SZ_OK)
+    p->result = SZ_ERROR_WRITE;
+  if (p->matchFinderBase.result != SZ_OK)
+    p->result = SZ_ERROR_READ;
+  if (p->result != SZ_OK)
+    p->finished = True;
+  return p->result;
+}
+
+static SRes Flush(CLzmaEnc *p, UInt32 nowPos)
+{
+  /* ReleaseMFStream(); */
+  p->finished = True;
+  if (p->writeEndMark)
+    WriteEndMarker(p, nowPos & p->pbMask);
+  RangeEnc_FlushData(&p->rc);
+  RangeEnc_FlushStream(&p->rc);
+  return CheckErrors(p);
+}
+
+static void FillAlignPrices(CLzmaEnc *p)
+{
+  UInt32 i;
+  for (i = 0; i < kAlignTableSize; i++)
+    p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices);
+  p->alignPriceCount = 0;
+}
+
+static void FillDistancesPrices(CLzmaEnc *p)
+{
+  UInt32 tempPrices[kNumFullDistances];
+  UInt32 i, lenToPosState;
+  for (i = kStartPosModelIndex; i < kNumFullDistances; i++)
+  {
+    UInt32 posSlot = GetPosSlot1(i);
+    UInt32 footerBits = ((posSlot >> 1) - 1);
+    UInt32 base = ((2 | (posSlot & 1)) << footerBits);
+    tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices);
+  }
+
+  for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++)
+  {
+    UInt32 posSlot;
+    const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState];
+    UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState];
+    for (posSlot = 0; posSlot < p->distTableSize; posSlot++)
+      posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices);
+    for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++)
+      posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits);
+
+    {
+      UInt32 *distancesPrices = p->distancesPrices[lenToPosState];
+      UInt32 i;
+      for (i = 0; i < kStartPosModelIndex; i++)
+        distancesPrices[i] = posSlotPrices[i];
+      for (; i < kNumFullDistances; i++)
+        distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i];
+    }
+  }
+  p->matchPriceCount = 0;
+}
+
+static void LzmaEnc_Construct(CLzmaEnc *p)
+{
+  RangeEnc_Construct(&p->rc);
+  MatchFinder_Construct(&p->matchFinderBase);
+  #ifndef _7ZIP_ST
+  MatchFinderMt_Construct(&p->matchFinderMt);
+  p->matchFinderMt.MatchFinder = &p->matchFinderBase;
+  #endif
+
+  {
+    CLzmaEncProps props;
+    LzmaEncProps_Init(&props);
+    LzmaEnc_SetProps(p, &props);
+  }
+
+  #ifndef LZMA_LOG_BSR
+  LzmaEnc_FastPosInit(p->g_FastPos);
+  #endif
+
+  LzmaEnc_InitPriceTables(p->ProbPrices);
+  p->litProbs = 0;
+  p->saveState.litProbs = 0;
+}
+
+CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc)
+{
+  void *p;
+  p = alloc->Alloc(alloc, sizeof(CLzmaEnc));
+  if (p != 0)
+    LzmaEnc_Construct((CLzmaEnc *)p);
+  return p;
+}
+
+static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
+{
+  alloc->Free(alloc, p->litProbs);
+  alloc->Free(alloc, p->saveState.litProbs);
+  p->litProbs = 0;
+  p->saveState.litProbs = 0;
+}
+
+static void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)
+{
+  #ifndef _7ZIP_ST
+  MatchFinderMt_Destruct(&p->matchFinderMt, allocBig);
+  #endif
+  MatchFinder_Free(&p->matchFinderBase, allocBig);
+  LzmaEnc_FreeLits(p, alloc);
+  RangeEnc_Free(&p->rc, alloc);
+}
+
+void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig)
+{
+  LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig);
+  alloc->Free(alloc, p);
+}
+
+static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize)
+{
+  UInt32 nowPos32, startPos32;
+  if (p->needInit)
+  {
+    p->matchFinder.Init(p->matchFinderObj);
+    p->needInit = 0;
+  }
+
+  if (p->finished)
+    return p->result;
+  RINOK(CheckErrors(p));
+
+  nowPos32 = (UInt32)p->nowPos64;
+  startPos32 = nowPos32;
+
+  if (p->nowPos64 == 0)
+  {
+    UInt32 numPairs;
+    Byte curByte;
+    if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)
+      return Flush(p, nowPos32);
+    ReadMatchDistances(p, &numPairs);
+    RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0);
+    p->state = kLiteralNextStates[p->state];
+    curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset);
+    LitEnc_Encode(&p->rc, p->litProbs, curByte);
+    p->additionalOffset--;
+    nowPos32++;
+  }
+
+  if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0)
+  for (;;)
+  {
+    UInt32 pos, len, posState;
+
+    if (p->fastMode)
+      len = GetOptimumFast(p, &pos);
+    else
+      len = GetOptimum(p, nowPos32, &pos);
+
+    #ifdef SHOW_STAT2
+    printf("\n pos = %4X,   len = %d   pos = %d", nowPos32, len, pos);
+    #endif
+
+    posState = nowPos32 & p->pbMask;
+    if (len == 1 && pos == (UInt32)-1)
+    {
+      Byte curByte;
+      CLzmaProb *probs;
+      const Byte *data;
+
+      RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0);
+      data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
+      curByte = *data;
+      probs = LIT_PROBS(nowPos32, *(data - 1));
+      if (IsCharState(p->state))
+        LitEnc_Encode(&p->rc, probs, curByte);
+      else
+        LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1));
+      p->state = kLiteralNextStates[p->state];
+    }
+    else
+    {
+      RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1);
+      if (pos < LZMA_NUM_REPS)
+      {
+        RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1);
+        if (pos == 0)
+        {
+          RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0);
+          RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1));
+        }
+        else
+        {
+          UInt32 distance = p->reps[pos];
+          RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1);
+          if (pos == 1)
+            RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0);
+          else
+          {
+            RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1);
+            RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2);
+            if (pos == 3)
+              p->reps[3] = p->reps[2];
+            p->reps[2] = p->reps[1];
+          }
+          p->reps[1] = p->reps[0];
+          p->reps[0] = distance;
+        }
+        if (len == 1)
+          p->state = kShortRepNextStates[p->state];
+        else
+        {
+          LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
+          p->state = kRepNextStates[p->state];
+        }
+      }
+      else
+      {
+        UInt32 posSlot;
+        RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);
+        p->state = kMatchNextStates[p->state];
+        LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
+        pos -= LZMA_NUM_REPS;
+        GetPosSlot(pos, posSlot);
+        RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot);
+        
+        if (posSlot >= kStartPosModelIndex)
+        {
+          UInt32 footerBits = ((posSlot >> 1) - 1);
+          UInt32 base = ((2 | (posSlot & 1)) << footerBits);
+          UInt32 posReduced = pos - base;
+
+          if (posSlot < kEndPosModelIndex)
+            RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced);
+          else
+          {
+            RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits);
+            RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask);
+            p->alignPriceCount++;
+          }
+        }
+        p->reps[3] = p->reps[2];
+        p->reps[2] = p->reps[1];
+        p->reps[1] = p->reps[0];
+        p->reps[0] = pos;
+        p->matchPriceCount++;
+      }
+    }
+    p->additionalOffset -= len;
+    nowPos32 += len;
+    if (p->additionalOffset == 0)
+    {
+      UInt32 processed;
+      if (!p->fastMode)
+      {
+        if (p->matchPriceCount >= (1 << 7))
+          FillDistancesPrices(p);
+        if (p->alignPriceCount >= kAlignTableSize)
+          FillAlignPrices(p);
+      }
+      if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)
+        break;
+      processed = nowPos32 - startPos32;
+      if (useLimits)
+      {
+        if (processed + kNumOpts + 300 >= maxUnpackSize ||
+            RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize)
+          break;
+      }
+      else if (processed >= (1 << 15))
+      {
+        p->nowPos64 += nowPos32 - startPos32;
+        return CheckErrors(p);
+      }
+    }
+  }
+  p->nowPos64 += nowPos32 - startPos32;
+  return Flush(p, nowPos32);
+}
+
+#define kBigHashDicLimit ((UInt32)1 << 24)
+
+static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
+{
+  UInt32 beforeSize = kNumOpts;
+  #ifndef _7ZIP_ST
+  Bool btMode;
+  #endif
+  if (!RangeEnc_Alloc(&p->rc, alloc))
+    return SZ_ERROR_MEM;
+  #ifndef _7ZIP_ST
+  btMode = (p->matchFinderBase.btMode != 0);
+  p->mtMode = (p->multiThread && !p->fastMode && btMode);
+  #endif
+
+  {
+    unsigned lclp = p->lc + p->lp;
+    if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp)
+    {
+      LzmaEnc_FreeLits(p, alloc);
+      p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb));
+      p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb));
+      if (p->litProbs == 0 || p->saveState.litProbs == 0)
+      {
+        LzmaEnc_FreeLits(p, alloc);
+        return SZ_ERROR_MEM;
+      }
+      p->lclp = lclp;
+    }
+  }
+
+  p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit);
+
+  if (beforeSize + p->dictSize < keepWindowSize)
+    beforeSize = keepWindowSize - p->dictSize;
+
+  #ifndef _7ZIP_ST
+  if (p->mtMode)
+  {
+    RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig));
+    p->matchFinderObj = &p->matchFinderMt;
+    MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder);
+  }
+  else
+  #endif
+  {
+    if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig))
+      return SZ_ERROR_MEM;
+    p->matchFinderObj = &p->matchFinderBase;
+    MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder);
+  }
+  return SZ_OK;
+}
+
+static void LzmaEnc_Init(CLzmaEnc *p)
+{
+  UInt32 i;
+  p->state = 0;
+  for (i = 0 ; i < LZMA_NUM_REPS; i++)
+    p->reps[i] = 0;
+
+  RangeEnc_Init(&p->rc);
+
+
+  for (i = 0; i < kNumStates; i++)
+  {
+    UInt32 j;
+    for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++)
+    {
+      p->isMatch[i][j] = kProbInitValue;
+      p->isRep0Long[i][j] = kProbInitValue;
+    }
+    p->isRep[i] = kProbInitValue;
+    p->isRepG0[i] = kProbInitValue;
+    p->isRepG1[i] = kProbInitValue;
+    p->isRepG2[i] = kProbInitValue;
+  }
+
+  {
+    UInt32 num = 0x300 << (p->lp + p->lc);
+    for (i = 0; i < num; i++)
+      p->litProbs[i] = kProbInitValue;
+  }
+
+  {
+    for (i = 0; i < kNumLenToPosStates; i++)
+    {
+      CLzmaProb *probs = p->posSlotEncoder[i];
+      UInt32 j;
+      for (j = 0; j < (1 << kNumPosSlotBits); j++)
+        probs[j] = kProbInitValue;
+    }
+  }
+  {
+    for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++)
+      p->posEncoders[i] = kProbInitValue;
+  }
+
+  LenEnc_Init(&p->lenEnc.p);
+  LenEnc_Init(&p->repLenEnc.p);
+
+  for (i = 0; i < (1 << kNumAlignBits); i++)
+    p->posAlignEncoder[i] = kProbInitValue;
+
+  p->optimumEndIndex = 0;
+  p->optimumCurrentIndex = 0;
+  p->additionalOffset = 0;
+
+  p->pbMask = (1 << p->pb) - 1;
+  p->lpMask = (1 << p->lp) - 1;
+}
+
+static void LzmaEnc_InitPrices(CLzmaEnc *p)
+{
+  if (!p->fastMode)
+  {
+    FillDistancesPrices(p);
+    FillAlignPrices(p);
+  }
+
+  p->lenEnc.tableSize =
+  p->repLenEnc.tableSize =
+      p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN;
+  LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices);
+  LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices);
+}
+
+static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
+{
+  UInt32 i;
+  for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++)
+    if (p->dictSize <= ((UInt32)1 << i))
+      break;
+  p->distTableSize = i * 2;
+
+  p->finished = False;
+  p->result = SZ_OK;
+  RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig));
+  LzmaEnc_Init(p);
+  LzmaEnc_InitPrices(p);
+  p->nowPos64 = 0;
+  return SZ_OK;
+}
+
+static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream,
+    ISzAlloc *alloc, ISzAlloc *allocBig)
+{
+  CLzmaEnc *p = (CLzmaEnc *)pp;
+  p->matchFinderBase.stream = inStream;
+  p->needInit = 1;
+  p->rc.outStream = outStream;
+  return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig);
+}
+
+/*static SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp,
+    ISeqInStream *inStream, UInt32 keepWindowSize,
+    ISzAlloc *alloc, ISzAlloc *allocBig)
+{
+  CLzmaEnc *p = (CLzmaEnc *)pp;
+  p->matchFinderBase.stream = inStream;
+  p->needInit = 1;
+  return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
+}*/
+
+static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen)
+{
+  p->matchFinderBase.directInput = 1;
+  p->matchFinderBase.bufferBase = (Byte *)src;
+  p->matchFinderBase.directInputRem = srcLen;
+}
+
+static SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
+    UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
+{
+  CLzmaEnc *p = (CLzmaEnc *)pp;
+  LzmaEnc_SetInputBuf(p, src, srcLen);
+  p->needInit = 1;
+
+  return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
+}
+
+static void LzmaEnc_Finish(CLzmaEncHandle pp)
+{
+  #ifndef _7ZIP_ST
+  CLzmaEnc *p = (CLzmaEnc *)pp;
+  if (p->mtMode)
+    MatchFinderMt_ReleaseStream(&p->matchFinderMt);
+  #else
+  pp = pp;
+  #endif
+}
+
+typedef struct
+{
+  ISeqOutStream funcTable;
+  Byte *data;
+  SizeT rem;
+  Bool overflow;
+} CSeqOutStreamBuf;
+
+static size_t MyWrite(void *pp, const void *data, size_t size)
+{
+  CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp;
+  if (p->rem < size)
+  {
+    size = p->rem;
+    p->overflow = True;
+  }
+  memcpy(p->data, data, size);
+  p->rem -= size;
+  p->data += size;
+  return size;
+}
+
+
+/*static UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)
+{
+  const CLzmaEnc *p = (CLzmaEnc *)pp;
+  return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
+}*/
+
+/*static const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp)
+{
+  const CLzmaEnc *p = (CLzmaEnc *)pp;
+  return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
+}*/
+
+/*static SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,
+    Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize)
+{
+  CLzmaEnc *p = (CLzmaEnc *)pp;
+  UInt64 nowPos64;
+  SRes res;
+  CSeqOutStreamBuf outStream;
+
+  outStream.funcTable.Write = MyWrite;
+  outStream.data = dest;
+  outStream.rem = *destLen;
+  outStream.overflow = False;
+
+  p->writeEndMark = False;
+  p->finished = False;
+  p->result = SZ_OK;
+
+  if (reInit)
+    LzmaEnc_Init(p);
+  LzmaEnc_InitPrices(p);
+  nowPos64 = p->nowPos64;
+  RangeEnc_Init(&p->rc);
+  p->rc.outStream = &outStream.funcTable;
+
+  res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize);
+  
+  *unpackSize = (UInt32)(p->nowPos64 - nowPos64);
+  *destLen -= outStream.rem;
+  if (outStream.overflow)
+    return SZ_ERROR_OUTPUT_EOF;
+
+  return res;
+}*/
+
+static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress)
+{
+  SRes res = SZ_OK;
+
+  #ifndef _7ZIP_ST
+  Byte allocaDummy[0x300];
+  int i = 0;
+  for (i = 0; i < 16; i++)
+    allocaDummy[i] = (Byte)i;
+  #endif
+
+  for (;;)
+  {
+    res = LzmaEnc_CodeOneBlock(p, False, 0, 0);
+    if (res != SZ_OK || p->finished != 0)
+      break;
+    if (progress != 0)
+    {
+      res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc));
+      if (res != SZ_OK)
+      {
+        res = SZ_ERROR_PROGRESS;
+        break;
+      }
+    }
+  }
+  LzmaEnc_Finish(p);
+  return res;
+}
+
+SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress,
+    ISzAlloc *alloc, ISzAlloc *allocBig)
+{
+  RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig));
+  return LzmaEnc_Encode2((CLzmaEnc *)pp, progress);
+}
+
+SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size)
+{
+  CLzmaEnc *p = (CLzmaEnc *)pp;
+  int i;
+  UInt32 dictSize = p->dictSize;
+  if (*size < LZMA_PROPS_SIZE)
+    return SZ_ERROR_PARAM;
+  *size = LZMA_PROPS_SIZE;
+  props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc);
+
+  for (i = 11; i <= 30; i++)
+  {
+    if (dictSize <= ((UInt32)2 << i))
+    {
+      dictSize = (2 << i);
+      break;
+    }
+    if (dictSize <= ((UInt32)3 << i))
+    {
+      dictSize = (3 << i);
+      break;
+    }
+  }
+
+  for (i = 0; i < 4; i++)
+    props[1 + i] = (Byte)(dictSize >> (8 * i));
+  return SZ_OK;
+}
+
+SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
+    int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
+{
+  SRes res;
+  CLzmaEnc *p = (CLzmaEnc *)pp;
+
+  CSeqOutStreamBuf outStream;
+
+  LzmaEnc_SetInputBuf(p, src, srcLen);
+
+  outStream.funcTable.Write = MyWrite;
+  outStream.data = dest;
+  outStream.rem = *destLen;
+  outStream.overflow = False;
+
+  p->writeEndMark = writeEndMark;
+
+  p->rc.outStream = &outStream.funcTable;
+  res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig);
+  if (res == SZ_OK)
+    res = LzmaEnc_Encode2(p, progress);
+
+  *destLen -= outStream.rem;
+  if (outStream.overflow)
+    return SZ_ERROR_OUTPUT_EOF;
+  return res;
+}
+
+SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
+    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
+    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
+{
+  CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc);
+  SRes res;
+  if (p == 0)
+    return SZ_ERROR_MEM;
+
+  res = LzmaEnc_SetProps(p, props);
+  if (res == SZ_OK)
+  {
+    res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize);
+    if (res == SZ_OK)
+      res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen,
+          writeEndMark, progress, alloc, allocBig);
+  }
+
+  LzmaEnc_Destroy(p, alloc, allocBig);
+  return res;
+}
diff --git a/util/cbfstool/lzma/C/LzmaEnc.h b/util/cbfstool/lzma/C/LzmaEnc.h
new file mode 100644
index 0000000..200d60e
--- /dev/null
+++ b/util/cbfstool/lzma/C/LzmaEnc.h
@@ -0,0 +1,80 @@
+/*  LzmaEnc.h -- LZMA Encoder
+2009-02-07 : Igor Pavlov : Public domain */
+
+#ifndef __LZMA_ENC_H
+#define __LZMA_ENC_H
+
+#include "Types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define LZMA_PROPS_SIZE 5
+
+typedef struct _CLzmaEncProps
+{
+  int level;       /*  0 <= level <= 9 */
+  UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version
+                      (1 << 12) <= dictSize <= (1 << 30) for 64-bit version
+                       default = (1 << 24) */
+  int lc;          /* 0 <= lc <= 8, default = 3 */
+  int lp;          /* 0 <= lp <= 4, default = 0 */
+  int pb;          /* 0 <= pb <= 4, default = 2 */
+  int algo;        /* 0 - fast, 1 - normal, default = 1 */
+  int fb;          /* 5 <= fb <= 273, default = 32 */
+  int btMode;      /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */
+  int numHashBytes; /* 2, 3 or 4, default = 4 */
+  UInt32 mc;        /* 1 <= mc <= (1 << 30), default = 32 */
+  unsigned writeEndMark;  /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */
+  int numThreads;  /* 1 or 2, default = 2 */
+} CLzmaEncProps;
+
+void LzmaEncProps_Init(CLzmaEncProps *p);
+void LzmaEncProps_Normalize(CLzmaEncProps *p);
+UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);
+
+
+/* ---------- CLzmaEncHandle Interface ---------- */
+
+/* LzmaEnc_* functions can return the following exit codes:
+Returns:
+  SZ_OK           - OK
+  SZ_ERROR_MEM    - Memory allocation error
+  SZ_ERROR_PARAM  - Incorrect paramater in props
+  SZ_ERROR_WRITE  - Write callback error.
+  SZ_ERROR_PROGRESS - some break from progress callback
+  SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
+*/
+
+typedef void * CLzmaEncHandle;
+
+CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc);
+void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig);
+SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);
+SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);
+SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,
+    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
+SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
+    int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
+
+/* ---------- One Call Interface ---------- */
+
+/* LzmaEncode
+Return code:
+  SZ_OK               - OK
+  SZ_ERROR_MEM        - Memory allocation error
+  SZ_ERROR_PARAM      - Incorrect paramater
+  SZ_ERROR_OUTPUT_EOF - output buffer overflow
+  SZ_ERROR_THREAD     - errors in multithreading functions (only for Mt version)
+*/
+
+SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
+    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
+    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/util/cbfstool/lzma/C/ORIGIN b/util/cbfstool/lzma/C/ORIGIN
deleted file mode 100644
index d1fbb77..0000000
--- a/util/cbfstool/lzma/C/ORIGIN
+++ /dev/null
@@ -1,3 +0,0 @@
-The contents of this directory are extracted from
-the official LZMA SDK, version lzma442.tar.bz2 ,
-for the use in mkcromfs.
diff --git a/util/cbfstool/lzma/C/Types.h b/util/cbfstool/lzma/C/Types.h
new file mode 100644
index 0000000..d7bc78d
--- /dev/null
+++ b/util/cbfstool/lzma/C/Types.h
@@ -0,0 +1,242 @@
+/* Types.h -- Basic types
+2010-03-11 : Igor Pavlov : Public domain */
+
+#ifndef __7Z_TYPES_H
+#define __7Z_TYPES_H
+
+#include <stddef.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
+#ifndef EXTERN_C_BEGIN
+#ifdef __cplusplus
+#define EXTERN_C_BEGIN extern "C" {
+#define EXTERN_C_END }
+#else
+#define EXTERN_C_BEGIN
+#define EXTERN_C_END
+#endif
+#endif
+
+EXTERN_C_BEGIN
+
+#define SZ_OK 0
+
+#define SZ_ERROR_DATA 1
+#define SZ_ERROR_MEM 2
+#define SZ_ERROR_CRC 3
+#define SZ_ERROR_UNSUPPORTED 4
+#define SZ_ERROR_PARAM 5
+#define SZ_ERROR_INPUT_EOF 6
+#define SZ_ERROR_OUTPUT_EOF 7
+#define SZ_ERROR_READ 8
+#define SZ_ERROR_WRITE 9
+#define SZ_ERROR_PROGRESS 10
+#define SZ_ERROR_FAIL 11
+#define SZ_ERROR_THREAD 12
+
+#define SZ_ERROR_ARCHIVE 16
+#define SZ_ERROR_NO_ARCHIVE 17
+
+typedef int SRes;
+
+#ifdef _WIN32
+typedef DWORD WRes;
+#else
+typedef int WRes;
+#endif
+
+#ifndef RINOK
+#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }
+#endif
+
+typedef unsigned char Byte;
+typedef short Int16;
+typedef unsigned short UInt16;
+
+#ifdef _LZMA_UINT32_IS_ULONG
+typedef long Int32;
+typedef unsigned long UInt32;
+#else
+typedef int Int32;
+typedef unsigned int UInt32;
+#endif
+
+#ifdef _SZ_NO_INT_64
+
+/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.
+   NOTES: Some code will work incorrectly in that case! */
+
+typedef long Int64;
+typedef unsigned long UInt64;
+
+#else
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+typedef __int64 Int64;
+typedef unsigned __int64 UInt64;
+#else
+typedef long long int Int64;
+typedef unsigned long long int UInt64;
+#endif
+
+#endif
+
+#ifdef _LZMA_NO_SYSTEM_SIZE_T
+typedef UInt32 SizeT;
+#else
+typedef size_t SizeT;
+#endif
+
+typedef int Bool;
+#define True 1
+#define False 0
+
+
+#ifdef _WIN32
+#define MY_STD_CALL __stdcall
+#else
+#define MY_STD_CALL
+#endif
+
+#ifdef _MSC_VER
+
+#if _MSC_VER >= 1300
+#define MY_NO_INLINE __declspec(noinline)
+#else
+#define MY_NO_INLINE
+#endif
+
+#define MY_CDECL __cdecl
+#define MY_FAST_CALL __fastcall
+
+#else
+
+#define MY_CDECL
+#define MY_FAST_CALL
+
+#endif
+
+
+/* The following interfaces use first parameter as pointer to structure */
+
+typedef struct
+{
+  Byte (*Read)(void *p); /* reads one byte, returns 0 in case of EOF or error */
+} IByteIn;
+
+typedef struct
+{
+  void (*Write)(void *p, Byte b);
+} IByteOut;
+
+typedef struct ISeqInStream
+{
+  SRes (*Read)(void *p, void *buf, size_t *size);
+    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
+       (output(*size) < input(*size)) is allowed */
+#ifdef __cplusplus
+  ISeqInStream(): Read() { } // -Weffc++
+#endif
+} ISeqInStream;
+
+/* it can return SZ_ERROR_INPUT_EOF */
+SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size);
+SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType);
+SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf);
+
+typedef struct ISeqOutStream
+{
+  size_t (*Write)(void *p, const void *buf, size_t size);
+    /* Returns: result - the number of actually written bytes.
+       (result < size) means error */
+#ifdef __cplusplus
+  ISeqOutStream(): Write() { } // -Weffc++
+#endif
+} ISeqOutStream;
+
+typedef enum
+{
+  SZ_SEEK_SET = 0,
+  SZ_SEEK_CUR = 1,
+  SZ_SEEK_END = 2
+} ESzSeek;
+
+typedef struct
+{
+  SRes (*Read)(void *p, void *buf, size_t *size);  /* same as ISeqInStream::Read */
+  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
+} ISeekInStream;
+
+typedef struct
+{
+  SRes (*Look)(void *p, const void **buf, size_t *size);
+    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
+       (output(*size) > input(*size)) is not allowed
+       (output(*size) < input(*size)) is allowed */
+  SRes (*Skip)(void *p, size_t offset);
+    /* offset must be <= output(*size) of Look */
+
+  SRes (*Read)(void *p, void *buf, size_t *size);
+    /* reads directly (without buffer). It's same as ISeqInStream::Read */
+  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
+} ILookInStream;
+
+SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size);
+SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset);
+
+/* reads via ILookInStream::Read */
+SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType);
+SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size);
+
+#define LookToRead_BUF_SIZE (1 << 14)
+
+typedef struct
+{
+  ILookInStream s;
+  ISeekInStream *realStream;
+  size_t pos;
+  size_t size;
+  Byte buf[LookToRead_BUF_SIZE];
+} CLookToRead;
+
+void LookToRead_CreateVTable(CLookToRead *p, int lookahead);
+void LookToRead_Init(CLookToRead *p);
+
+typedef struct
+{
+  ISeqInStream s;
+  ILookInStream *realStream;
+} CSecToLook;
+
+void SecToLook_CreateVTable(CSecToLook *p);
+
+typedef struct
+{
+  ISeqInStream s;
+  ILookInStream *realStream;
+} CSecToRead;
+
+void SecToRead_CreateVTable(CSecToRead *p);
+
+typedef struct
+{
+  SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize);
+    /* Returns: result. (result != SZ_OK) means break.
+       Value (UInt64)(Int64)-1 for size means unknown value. */
+} ICompressProgress;
+
+typedef struct
+{
+  void *(*Alloc)(void *p, size_t size);
+  void (*Free)(void *p, void *address); /* address can be 0 */
+} ISzAlloc;
+
+#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)
+#define IAlloc_Free(p, a) (p)->Free((p), a)
+
+EXTERN_C_END
+
+#endif
diff --git a/util/cbfstool/lzma/Makefile b/util/cbfstool/lzma/Makefile
deleted file mode 100644
index 9ac4ca2..0000000
--- a/util/cbfstool/lzma/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-##
-## This file is part of the coreboot project.
-##
-## Copyright (C) 2007 coresystems GmbH
-##
-## This program is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 2 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program; if not, write to the Free Software
-## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
-##
-
-LZMA_OBJ := lzma/LZMAEncoder.o lzma/LZInWindow.o
-LZMA_OBJ += lzma/RangeCoderBit.o lzma/StreamUtils.o
-LZMA_OBJ += lzma/OutBuffer.o lzma/Alloc.o
-LZMA_OBJ += lzma/CRC.o
-LZMA_OBJ += lzma/lzma-compress.o
-
-$(tobj)/lzma/lzma-compress.o: $(tsrc)/lzma/minilzma.cc
-	$(CXX) $(CFLAGS) -o $@ -c -DCOMPACT $<
-
-$(tobj)/lzma/%.o: $(tsrc)/lzma/C/7zip/Compress/LZMA/%.cpp
-	$(CXX) $(CFLAGS) -o $@ -c $<
-
-$(tobj)/lzma/%.o: $(tsrc)/lzma/C/7zip/Compress/LZ/%.cpp
-	$(CXX) $(CFLAGS) -o $@ -c $<
-
-$(tobj)/lzma/%.o: $(tsrc)/lzma/C/7zip/Compress/RangeCoder/%.cpp
-	$(CXX) $(CFLAGS) -o $@ -c $<
-
-$(tobj)/lzma/%.o: $(tsrc)/lzma/C/7zip/Decompress/%.cpp
-	$(CXX) $(CFLAGS) -o $@ -c $<
-
-$(tobj)/lzma/%.o: $(tsrc)/lzma/C/7zip/Common/%.cpp
-	$(CXX) $(CFLAGS) -o $@ -c $<
-
-$(tobj)/lzma/%.o: $(tsrc)/lzma/C/Common/%.cpp
-	$(CXX) $(CFLAGS) -o $@ -c $<
-
-$(tobj)/lzma/%.o: $(tsrc)/lzma/%.cc
-	$(CXX) $(CFLAGS) -o $@ -c $<
-
diff --git a/util/cbfstool/lzma/Makefile.inc b/util/cbfstool/lzma/Makefile.inc
deleted file mode 100644
index 0dcec63..0000000
--- a/util/cbfstool/lzma/Makefile.inc
+++ /dev/null
@@ -1,60 +0,0 @@
-##
-## This file is part of the coreboot project.
-##
-## Copyright (C) 2007 coresystems GmbH
-##
-## This program is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 2 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program; if not, write to the Free Software
-## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
-##
-
-LZMA_OBJ := lzma/LZMAEncoder.o lzma/LZInWindow.o
-LZMA_OBJ += lzma/RangeCoderBit.o lzma/StreamUtils.o
-LZMA_OBJ += lzma/OutBuffer.o lzma/Alloc.o
-LZMA_OBJ += lzma/CRC.o
-LZMA_OBJ += lzma/lzma-compress.o
-
-ifdef POST_EVALUATION
-$(tobj)/lzma/lzma-compress.o: $(tsrc)/lzma/minilzma.cc
-	printf "    HOSTCXX    $(subst $(obj)/,,$(@))\n"
-	$(HOSTCXX) $(HOSTCXXFLAGS) -o $@ -c -DCOMPACT $<
-
-$(tobj)/lzma/%.o: $(tsrc)/lzma/C/7zip/Compress/LZMA/%.cpp
-	printf "    HOSTCXX    $(subst $(obj)/,,$(@))\n"
-	$(HOSTCXX) $(HOSTCXXFLAGS) -o $@ -c $<
-
-$(tobj)/lzma/%.o: $(tsrc)/lzma/C/7zip/Compress/LZ/%.cpp
-	printf "    HOSTCXX    $(subst $(obj)/,,$(@))\n"
-	$(HOSTCXX) $(HOSTCXXFLAGS) -o $@ -c $<
-
-$(tobj)/lzma/%.o: $(tsrc)/lzma/C/7zip/Compress/RangeCoder/%.cpp
-	printf "    HOSTCXX    $(subst $(obj)/,,$(@))\n"
-	$(HOSTCXX) $(HOSTCXXFLAGS) -o $@ -c $<
-
-$(tobj)/lzma/%.o: $(tsrc)/lzma/C/7zip/Decompress/%.cpp
-	printf "    HOSTCXX    $(subst $(obj)/,,$(@))\n"
-	$(HOSTCXX) $(HOSTCXXFLAGS) -o $@ -c $<
-
-$(tobj)/lzma/%.o: $(tsrc)/lzma/C/7zip/Common/%.cpp
-	printf "    HOSTCXX    $(subst $(obj)/,,$(@))\n"
-	$(HOSTCXX) $(HOSTCXXFLAGS) -o $@ -c $<
-
-$(tobj)/lzma/%.o: $(tsrc)/lzma/C/Common/%.cpp
-	printf "    HOSTCXX    $(subst $(obj)/,,$(@))\n"
-	$(HOSTCXX) $(HOSTCXXFLAGS) -o $@ -c $<
-
-$(tobj)/lzma/%.o: $(tsrc)/lzma/%.cc
-	printf "    HOSTCXX    $(subst $(obj)/,,$(@))\n"
-	$(HOSTCXX) $(HOSTCXXFLAGS) -o $@ -c $<
-
-endif
diff --git a/util/cbfstool/lzma/ORIGIN b/util/cbfstool/lzma/ORIGIN
new file mode 100644
index 0000000..ac4f084
--- /dev/null
+++ b/util/cbfstool/lzma/ORIGIN
@@ -0,0 +1,8 @@
+The contents of this directory are extracted from
+the official LZMA SDK, version 9.12, for the use in
+mkcromfs (cromfs 1.5.10.1).
+
+However, cromfs does not include all files from that
+archive. Basically, only those which are required in
+compiling cromfs, plus a few text files.
+
diff --git a/util/cbfstool/lzma/endian.hh b/util/cbfstool/lzma/endian.hh
new file mode 100644
index 0000000..425374d
--- /dev/null
+++ b/util/cbfstool/lzma/endian.hh
@@ -0,0 +1,178 @@
+#ifndef bqtEndianHH
+#define bqtEndianHH
+
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS /* for UINT16_C etc */
+#endif
+
+#include <stdint.h>
+
+#if defined(__x86_64)||defined(__i386)
+#define LITTLE_ENDIAN_AND_UNALIGNED_ACCESS_OK
+#else
+#undef LITTLE_ENDIAN_AND_UNALIGNED_ACCESS_OK
+#endif
+
+#ifdef WIN32
+# define LL_FMT "I64"
+#else
+# define LL_FMT "ll"
+#endif
+
+
+static inline uint_fast16_t get_8(const void* p)
+{
+    const unsigned char* data = (const unsigned char*)p;
+    return data[0];
+}
+static inline uint_fast16_t get_16(const void* p)
+{
+  #ifdef LITTLE_ENDIAN_AND_UNALIGNED_ACCESS_OK
+    return *(const uint_least16_t*)p;
+  #else
+    const unsigned char* data = (const unsigned char*)p;
+    return get_8(data)  | (get_8(data+1) << UINT16_C(8));
+  #endif
+}
+static inline uint_fast16_t R16r(const void* p)
+{
+  #ifdef BIG_ENDIAN_AND_UNALIGNED_ACCESS_OK
+    return *(const uint_least16_t*)p;
+  #else
+    const unsigned char* data = (const unsigned char*)p;
+    return get_8(data+1)  | (get_8(data) << UINT16_C(8));
+  #endif
+}
+static inline uint_fast32_t R24(const void* p)
+{
+    /* Note: This might be faster if implemented through R32 and a bitwise and,
+     * but we cannot do that because we don't know if the third byte is a valid
+     * memory location.
+     */
+    const unsigned char* data = (const unsigned char*)p;
+    return get_16(data) | (get_8(data+2) << UINT32_C(16));
+}
+static inline uint_fast32_t R24r(const void* p)
+{
+    const unsigned char* data = (const unsigned char*)p;
+    return get_16(data+1) | (get_8(data) << UINT32_C(16));
+}
+static inline uint_fast32_t get_32(const void* p)
+{
+  #ifdef LITTLE_ENDIAN_AND_UNALIGNED_ACCESS_OK
+    return *(const uint_least32_t*)p;
+  #else
+    const unsigned char* data = (const unsigned char*)p;
+    return get_16(data) | (get_16(data+2) << UINT32_C(16));
+  #endif
+}
+static inline uint_fast32_t R32r(const void* p)
+{
+  #ifdef BIG_ENDIAN_AND_UNALIGNED_ACCESS_OK
+    return *(const uint_least32_t*)p;
+  #else
+    const unsigned char* data = (const unsigned char*)p;
+    return get_16(data+2) | (get_16(data) << UINT32_C(16));
+  #endif
+}
+
+#define L (uint_fast64_t)
+
+static inline uint_fast64_t get_64(const void* p)
+{
+  #ifdef LITTLE_ENDIAN_AND_UNALIGNED_ACCESS_OK
+    return *(const uint_least64_t*)p;
+  #else
+    const unsigned char* data = (const unsigned char*)p;
+    return (L get_32(data)) | ((L get_32(data+4)) << UINT64_C(32));
+  #endif
+}
+static inline uint_fast64_t R64r(const void* p)
+{
+  #ifdef BIG_ENDIAN_AND_UNALIGNED_ACCESS_OK
+    return *(const uint_least64_t*)p;
+  #else
+    const unsigned char* data = (const unsigned char*)p;
+    return (L get_32(data+4)) | ((L get_32(data)) << UINT64_C(32));
+  #endif
+}
+
+#undef L
+
+static inline uint_fast64_t get_n(const void* p, unsigned bytes)
+{
+    const unsigned char* data = (const unsigned char*)p;
+    uint_fast64_t res(0);
+    switch(bytes)
+    {
+        case 8: return get_64(p);
+        case 4: return get_32(p);
+        case 2: return get_16(p);
+        case 7: res |= ((uint_fast64_t)get_8(data+6)) << 48;
+        case 6: res |= ((uint_fast64_t)get_8(data+5)) << 40;
+        case 5: res |= ((uint_fast64_t)get_16(data+3)) << 24;
+        case 3: res |= ((uint_fast64_t)get_16(data+1)) << 8;
+        case 1: res |= get_8(data);
+    }
+    return res;
+}
+
+static void put_8(void* p, uint_fast8_t value)
+{
+    unsigned char* data = (unsigned char*)p;
+    data[0] = value;
+}
+static void put_16(void* p, uint_fast16_t value)
+{
+  #ifdef LITTLE_ENDIAN_AND_UNALIGNED_ACCESS_OK
+    *(uint_least16_t*)p = value;
+  #else
+    unsigned char* data = (unsigned char*)p;
+    put_8(data+0, value   );
+    put_8(data+1, value>>8);
+  #endif
+}
+static void W24(void* p, uint_fast32_t value)
+{
+    unsigned char* data = (unsigned char*)p;
+    put_16(data+0, value);
+    put_8(data+2,  value >> UINT32_C(16));
+}
+static void put_32(void* p, uint_fast32_t value)
+{
+  #ifdef LITTLE_ENDIAN_AND_UNALIGNED_ACCESS_OK
+    *(uint_least32_t*)p = value;
+  #else
+    unsigned char* data = (unsigned char*)p;
+    put_16(data+0, value);
+    put_16(data+2, value >> UINT32_C(16));
+  #endif
+}
+static void put_64(void* p, uint_fast64_t value)
+{
+  #ifdef LITTLE_ENDIAN_AND_UNALIGNED_ACCESS_OK
+    *(uint_least64_t*)p = value;
+  #else
+    unsigned char* data = (unsigned char*)p;
+    put_32(data+0, (value));
+    put_32(data+4, (value >> UINT64_C(32)));
+  #endif
+}
+
+static inline void put_n(void* p, uint_fast64_t value, unsigned bytes)
+{
+    unsigned char* data = (unsigned char*)p;
+    switch(bytes)
+    {
+        case 8: put_64(p, value); break;
+        case 7: put_8(data+6, value>>48);
+        case 6: put_8(data+5, value>>40);
+        case 5: put_8(data+4, value>>32);
+        case 4: put_32(p, value); break;
+        case 3: W24(p, value); break;
+        case 2: put_16(p, value); break;
+        case 1: put_8(p, value); break;
+    }
+}
+
+#endif
diff --git a/util/cbfstool/lzma/lzma.cc b/util/cbfstool/lzma/lzma.cc
new file mode 100644
index 0000000..4e555ff
--- /dev/null
+++ b/util/cbfstool/lzma/lzma.cc
@@ -0,0 +1,842 @@
+#include "endian.hh" /* For R64 */
+
+extern "C" {
+#include "C/LzmaDec.h"
+#include "C/LzmaEnc.h"
+}
+
+#include "lzma.hh"
+
+#include <algorithm> // min,max,swap
+#include <vector>
+#include <string>
+#include <cstring> // std::memcpy
+
+
+#include <cstdio>
+
+#include <stdint.h>
+
+/* We don't want threads */
+#ifdef linux
+#include <sched.h>
+#define ForceSwitchThread() sched_yield()
+#else
+#define ForceSwitchThread()
+#endif
+
+
+int LZMA_verbose = 0;
+
+// -fb
+unsigned LZMA_NumFastBytes = 273;
+/*from lzma.txt:
+          Set number of fast bytes - [5, 273], default: 273
+          Usually big number gives a little bit better compression ratio
+          and slower compression process.
+  from anonymous:
+This one is hard to explain... To my knowledge (please correct me if I
+am wrong), this refers to the optimal parsing algorithm. The algorithm
+tries many different combinations of matches to find the best one. If a
+match is found that is over the fb value, then it will not be optimised,
+and will just be used straight.
+This speeds up corner cases such as pic.
+*/
+
+/* apparently, 0 and 1 are valid values. 0 = fast mode */
+unsigned LZMA_AlgorithmNo  = 1;
+
+unsigned LZMA_MatchFinderCycles = 0; // default: 0
+
+// -pb
+unsigned LZMA_PosStateBits = 0; // default: 2, range: 0..4
+/*from lzma.txt:
+          pb switch is intended for periodical data
+          when period is equal 2^N.
+*/
+
+
+// -lp
+unsigned LZMA_LiteralPosStateBits = 0; // default: 0, range: 0..4
+/*from lzma.txt:
+          lp switch is intended for periodical data when period is
+          equal 2^N. For example, for 32-bit (4 bytes)
+          periodical data you can use lp=2.
+          Often it's better to set lc0, if you change lp switch.
+*/
+
+// -lc
+unsigned LZMA_LiteralContextBits = 1; // default: 3, range: 0..8
+/*from lzma.txt:
+          Sometimes lc=4 gives gain for big files.
+  from anonymous:
+The context for the literal coder is 2^(lc) long. The longer it is, the
+better the statistics, but also the slower it adapts. A tradeoff, which
+is why 3 or 4 is reccommended.
+*/
+
+/*
+
+Discoveries:
+
+ INODES:
+    Best LZMA for raw_inotab_inode(40->48): pb0 lp0 lc0
+    Best LZMA for raw_root_inode(28->32): pb0 lp0 lc0
+
+    Start LZMA(rootdir, 736 bytes)
+    Yay result with pb0 lp0 lc0: 218
+    Yay result with pb0 lp0 lc1: 217
+    Best LZMA for rootdir(736->217): pb0 lp0 lc1
+
+    Start LZMA(inotab, 379112 bytes)
+    Yay result with pb0 lp0 lc0: 24504
+    Best LZMA for inotab(379112->24504): pb0 lp0 lc0
+
+ BLKTAB:
+    Best LZMA for raw_blktab(10068->2940): pb2 lp2 lc0
+
+    ---with fastbytes=128---
+    Start LZMA(blktab, 12536608 bytes)
+    Yay result with pb0 lp0 lc0: 1386141
+    Yay result with pb0 lp1 lc0: 1308137
+    Yay result with pb0 lp2 lc0: 1305403
+    Yay result with pb0 lp3 lc0: 1303072
+    Yay result with pb1 lp1 lc0: 1238990
+    Yay result with pb1 lp2 lc0: 1227973
+    Yay result with pb1 lp3 lc0: 1221205
+    Yay result with pb2 lp1 lc0: 1197035
+    Yay result with pb2 lp2 lc0: 1188979
+    Yay result with pb2 lp3 lc0: 1184531
+    Yay result with pb3 lp1 lc0: 1183866
+    Yay result with pb3 lp2 lc0: 1172994
+    Yay result with pb3 lp3 lc0: 1169048
+    Best LZMA for blktab(12536608->1169048): pb3 lp3 lc0
+
+    It seems, lc=0 and pb=lp=N is a wise choice,
+    where N is 2 for packed blktab and 3 for unpacked.
+
+ FBLOCKS:
+    For SPC sound+code data, the best results
+     are between:
+      pb0 lp0 lc0 (10%)
+      pb0 lp0 lc1 (90%)
+     For inotab, these were observed:
+      pb1 lp0 lc1
+      pb2 lp0 lc0
+      pb1 lp1 lc0
+      pb3 lp1 lc0
+      pb1 lp2 lc0
+      pb2 lp1 lc0
+
+    For C source code data, the best results
+     are between:
+      pb1 lp0 lc3 (10%)
+      pb0 lp0 lc3 (90%)
+     Occasionally:
+      pb0 lp1 lc0
+      pb0 lp0 lc3 (mostly)
+      pb0 lp0 lc2
+      pb0 lp0 lc4
+     Occasionally 2:
+      pb0 lp0 lc8
+      pb0 lp0 lc4
+
+    BUT:
+    Best LZMA for fblock(204944->192060): pb0 lp4 lc8 -- surprise! (INOTAB PROBABLY)
+
+*/
+
+static UInt32 SelectDictionarySizeFor(unsigned datasize)
+{
+   #if 1
+    if(datasize >= (1 << 30U)) return 1 << 30U;
+    return datasize;
+   #else
+#ifdef __GNUC__
+    /* gnu c can optimize this switch statement into a fast binary
+     * search, but it cannot do so for the list of the if statements.
+     */
+    switch(datasize)
+    {
+        case 0 ... 512 : return 512;
+        case 513 ... 1024: return 2048;
+        case 1025 ... 4096: return 8192;
+        case 4097 ... 16384: return 32768;
+        case 16385 ... 65536: return 528288;
+        case 65537 ... 528288: return 1048576*4;
+        case 528289 ... 786432: return 1048576*16;
+        default: return 1048576*32;
+    }
+#else
+    if(datasize <= 512) return 512;
+    if(datasize <= 1024) return 1024;
+    if(datasize <= 4096) return 4096;
+    if(datasize <= 16384) return 32768;
+    if(datasize <= 65536) return 528288;
+    if(datasize <= 528288) return 1048576*4;
+    if(datasize <= 786432) reutrn 1048576*16;
+    return 32*1048576;
+#endif
+   #endif
+}
+
+static void *SzAlloc(void*, size_t size)
+    { return new unsigned char[size]; }
+static void SzFree(void*, void *address)
+    { unsigned char*a = (unsigned char*)address; delete[] a; }
+static ISzAlloc LZMAalloc = { SzAlloc, SzFree };
+
+class MemReader: public ISeqInStream
+{
+public:
+    const unsigned char* const indata;
+    const size_t         inlength;
+    size_t pos;
+public:
+    MemReader(const unsigned char* d, size_t l)
+        : ISeqInStream(), indata(d), inlength(l), pos(0)
+    {
+        Read = ReadMethod;
+    }
+    static SRes ReadMethod(void *pp, void *buf, size_t *size)
+    {
+        MemReader& p = *(MemReader*)pp;
+        size_t rem = p.inlength-p.pos;
+        size_t read = *size;
+        if(read > rem) read= rem;
+        std::memcpy(buf, &p.indata[p.pos], read);
+        *size = read;
+        p.pos += read;
+        return SZ_OK;
+    }
+};
+class MemWriter: public ISeqOutStream
+{
+public:
+    std::vector<unsigned char> buf;
+public:
+    MemWriter(): ISeqOutStream(), buf() { Write = WriteMethod; }
+
+    static size_t WriteMethod(void*pp, const void* from, size_t size)
+    {
+        MemWriter& p = *(MemWriter*)pp;
+        const unsigned char* i = (const unsigned char*)from;
+        p.buf.insert(p.buf.end(), i, i+size);
+        return size;
+    }
+};
+
+const std::vector<unsigned char> LZMACompress(const unsigned char* data, size_t length,
+    unsigned pb,
+    unsigned lp,
+    unsigned lc)
+{
+    return LZMACompress(data,length, pb,lp,lc,
+        SelectDictionarySizeFor(length));
+}
+
+const std::vector<unsigned char> LZMACompress(
+    const unsigned char* data, size_t length,
+    unsigned pb,
+    unsigned lp,
+    unsigned lc,
+    unsigned dictionarysize)
+{
+    if(!length) return std::vector<unsigned char>();
+
+    CLzmaEncProps props;
+    LzmaEncProps_Init(&props);
+    props.dictSize = dictionarysize;
+    props.pb       = pb;
+    props.lp       = lp;
+    props.lc       = lc;
+    props.fb       = LZMA_NumFastBytes;
+    props.mc       = LZMA_MatchFinderCycles;
+    props.algo     = LZMA_AlgorithmNo;
+    props.numThreads = 1;
+
+    switch(LZMA_AlgorithmNo)
+    {
+        case 0: // quick: HC4
+            props.btMode = 0;
+            props.level = 1;
+            break;
+        case 1: // full: BT4
+        default:
+            props.level = 9;
+            props.btMode       = 1;
+            props.numHashBytes = 4;
+            break;
+    }
+
+    CLzmaEncHandle p = LzmaEnc_Create(&LZMAalloc);
+    struct AutoReleaseLzmaEnc
+    {
+        AutoReleaseLzmaEnc(CLzmaEncHandle pp) : p(pp) { }
+        ~AutoReleaseLzmaEnc()
+        { LzmaEnc_Destroy(p, &LZMAalloc, &LZMAalloc); }
+        CLzmaEncHandle p;
+
+
+        AutoReleaseLzmaEnc(const AutoReleaseLzmaEnc&);
+        void operator=(const AutoReleaseLzmaEnc&);
+
+    } AutoReleaser(p); // Create a destructor that ensures
+    // that the CLzmaEncHandle is not leaked, even if an
+    // exception happens
+
+    int res = LzmaEnc_SetProps(p, &props);
+    if(res != SZ_OK)
+    {
+    Error:
+        return std::vector<unsigned char> ();
+    }
+
+    unsigned char propsEncoded[LZMA_PROPS_SIZE + 8];
+    size_t propsSize = sizeof propsEncoded;
+    res = LzmaEnc_WriteProperties(p, propsEncoded, &propsSize);
+    if(res != SZ_OK) goto Error;
+
+    MemReader is(data, length);
+    MemWriter os;
+    put_64(propsEncoded+LZMA_PROPS_SIZE, length);
+    os.buf.insert(os.buf.end(), propsEncoded, propsEncoded+LZMA_PROPS_SIZE+8);
+
+    res = LzmaEnc_Encode(p, &os, &is, 0, &LZMAalloc, &LZMAalloc);
+    if(res != SZ_OK) goto Error;
+
+    return os.buf;
+}
+
+const std::vector<unsigned char> LZMACompress(const unsigned char* data, size_t length)
+{
+    return LZMACompress(data, length,
+        LZMA_PosStateBits,
+        LZMA_LiteralPosStateBits,
+        LZMA_LiteralContextBits);
+}
+
+#undef RC_NORMALIZE
+
+const std::vector<unsigned char> LZMADeCompress
+    (const unsigned char* data, size_t length, bool& ok)
+{
+    if(length <= LZMA_PROPS_SIZE+8)
+    {
+    /*clearly_not_ok:*/
+        ok = false;
+        return std::vector<unsigned char> ();
+    }
+
+    uint_least64_t out_sizemax = get_64(&data[LZMA_PROPS_SIZE]);
+
+    /*if(out_sizemax >= (size_t)~0ULL)
+    {
+        // cannot even allocate a vector this large.
+        goto clearly_not_ok;
+    }*/
+
+    std::vector<unsigned char> result(out_sizemax);
+
+    ELzmaStatus status;
+    SizeT destlen = result.size();
+    SizeT srclen = length-(LZMA_PROPS_SIZE+8);
+    int res = LzmaDecode(
+        &result[0], &destlen,
+        &data[LZMA_PROPS_SIZE+8], &srclen,
+        &data[0], LZMA_PROPS_SIZE,
+        LZMA_FINISH_END,
+        &status,
+        &LZMAalloc);
+
+    /*
+    std::fprintf(stderr, "res=%d, status=%d, in_done=%d (buf=%d), out_done=%d (max=%d)\n",
+        res,
+        (int)status,
+        (int)srclen, (int)length,
+        (int)destlen, (int)out_sizemax);
+    */
+
+    ok = res == SZ_OK && (status == LZMA_STATUS_FINISHED_WITH_MARK
+                       || status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK)
+      && srclen == (length-(LZMA_PROPS_SIZE+8))
+      && destlen == out_sizemax;
+    return result;
+}
+
+const std::vector<unsigned char> LZMADeCompress
+    (const unsigned char* data, size_t length)
+{
+    bool ok_unused;
+    return LZMADeCompress(data, length, ok_unused);
+}
+
+#if 0
+#include <stdio.h>
+int main(void)
+{
+    char Buf[2048*2048];
+    int s = fread(Buf,1,sizeof(Buf),stdin);
+    std::vector<unsigned char> result = LZMADeCompress(std::vector<unsigned char>(Buf,Buf+s));
+    fwrite(&result[0],1,result.size(),stdout);
+}
+#endif
+
+const std::vector<unsigned char> LZMACompressHeavy(const unsigned char* data, size_t length,
+    const char* why)
+{
+    std::vector<unsigned char> bestresult;
+    char best[512];
+    bool first = true;
+    if(LZMA_verbose >= 1)
+    {
+        std::fprintf(stderr, "Start LZMA(%s, %u bytes)\n", why, (unsigned)length);
+        std::fflush(stderr);
+    }
+
+    unsigned minresultsize=0, maxresultsize=0;
+    unsigned sizemap[5][5][9] = {{{0}}};
+
+    bool use_small_dict = false;
+
+    for(int compress_mode = 0; compress_mode < (5*5*9); ++compress_mode)
+    {
+        const unsigned pb = compress_mode % 5;
+        const unsigned lp = (compress_mode / 5) % 5;
+        const unsigned lc = (compress_mode / 5 / 5) % 9;
+
+        std::vector<unsigned char>
+            result = use_small_dict
+                ? LZMACompress(data,length,pb,lp,lc, 4096)
+                : LZMACompress(data,length,pb,lp,lc);
+
+       {
+        sizemap[pb][lp][lc] = result.size();
+
+        if(first || result.size() < minresultsize) minresultsize = result.size();
+        if(first || result.size() > maxresultsize) maxresultsize = result.size();
+        if(first || result.size() < bestresult.size())
+        {
+            sprintf(best, "pb%u lp%u lc%u",
+                pb,lp,lc);
+            if(LZMA_verbose >= 1)
+                std::fprintf(stderr, "Yay result with %s: %u\n", best, (unsigned)result.size());
+            bestresult.swap(result);
+            first = false;
+        }
+        else
+        {
+            char tmp[512];
+            sprintf(tmp, "pb%u lp%u lc%u",
+                pb,lp,lc);
+            if(LZMA_verbose >= 2)
+                std::fprintf(stderr, "Blaa result with %s: %u\n", tmp, (unsigned)result.size());
+        }
+        if(LZMA_verbose >= 2)
+        {
+            std::fprintf(stderr, "%*s\n", (5 * (4+9+2)), "");
+            /* Visualize the size map: */
+            std::string lines[6] = {};
+            for(unsigned pbt = 0; pbt <= 4; ++pbt)
+            {
+                char buf[64]; sprintf(buf, "pb%u:%11s", pbt,"");
+                lines[0] += buf;
+
+                for(unsigned lpt = 0; lpt <= 4; ++lpt)
+                {
+                    char buf[64]; sprintf(buf, "lp%u:", lpt);
+                    std::string line;
+                    line += buf;
+                    for(unsigned lct = 0; lct <= 8; ++lct)
+                    {
+                        unsigned s = sizemap[pbt][lpt][lct];
+                        char c;
+                        if(!s) c = '.';
+                        else c = 'a' + ('z'-'a'+1)
+                                     * (s - minresultsize)
+                                     / (maxresultsize-minresultsize+1);
+                        line += c;
+                    }
+                    lines[1 + lpt] += line + "  ";
+                }
+            }
+            for(unsigned a=0; a<6; ++a) std::fprintf(stderr, "%s\n", lines[a].c_str());
+            std::fprintf(stderr, "\33[%uA", 7);
+        }
+       }
+    }
+    if(LZMA_verbose >= 2)
+        std::fprintf(stderr, "\n\n\n\n\n\n\n\n");
+
+    if(LZMA_verbose >= 1)
+    {
+        std::fprintf(stderr, "Best LZMA for %s(%u->%u): %s\n",
+            why,
+            (unsigned)length,
+            (unsigned)bestresult.size(),
+            best);
+    }
+    std::fflush(stderr);
+    return bestresult;
+}
+
+/*
+
+The LZMA compression power is controlled by these parameters:
+  Dictionary size (we use the maximum)
+  Compression algorithm (we use BT4, the heaviest available)
+  Number of fast bytes (we use the maximum)
+  pb (0..4), lp (0..4) and lc (0..8) -- the effect of these depends on data.
+
+Since the only parameters whose effect depends on the data to be compressed
+are the three (pb, lp, lc), the "auto" and "full" compression algorithms
+only try to find the optimal values for those.
+
+The "auto" LZMA compression algorithm is based on these two assumptions:
+  - It is possible to find the best value for each component (pb, lp, lc)
+    by individually testing the most effective one of them while keeping
+    the others static.
+    I.e.,    step 1: pb=<find best>, lp=0, lc=0
+             step 2: pb=<use result>, lp=<find best>, lc=0
+             step 3: pb=<use result>, lp=<use result>, lc=<find best>
+             final: pb=<use result>, lp=<use result>, lc=<use result>
+  - That the effect of each of these components forms a parabolic function
+    that has a starting point, ending point, and possibly a mountain or a
+    valley somewhere in the middle, but never a valley _and_ a mountain, nor
+    two valleys nor two mountains.
+These assumptions are not always true, but it gets very close to the optimum.
+
+The ParabolicFinder class below finds the lowest point in a parabolic curve
+with a small number of tests, determining the shape of the curve by sampling
+a few cue values as needed.
+
+The algorithm is like this:
+  Never check any value more than once.
+  Check the first two values.
+  If they differ, then check the last in sequence.
+    If not, then check everything in sequential order.
+  If the first two values and the last form an ascending sequence, accept the first value.
+    If they form a descending sequence, start Focus Mode
+    such that the focus lower limit is index 2 and upper
+    limit is the second last. Then check the second last.
+      If they don't, then check the third value of sequence,
+      and everything else in sequential order.
+  If in Focus Mode, check if being in the lower or upper end of the focus.
+    If in upper end, check if the current value is bigger than the next one.
+      If it is, end the process, because the smallest value has already been found.
+        If not, next check the value at focus_low, and increase focus_low.
+    If in lower end, check if the current value is bigger than the previous one.
+      If it is, end the process, because the smallest value has already been found.
+        If not, next check the value at focus_high, and decrease focus_high.
+
+For any sample space, it generally does 3 tests, but if it detects a curve
+forming a valley, it may do more.
+
+Note that ParabolicFinder does not _indicate_ the lowest value. It leaves that
+to the caller. It just stops searching when it thinks that no lower value will
+be found.
+
+Note: The effect of pb, lp and lc depend also on the dictionary size setting
+and compression algorithm. You cannot estimate the optimal value for those
+parameters reliably using different compression settings than in the actual case.
+
+*/
+class ParabolicFinder
+{
+public:
+    enum QueryState      { Unknown, Pending, Done };
+    enum InstructionType { HereYouGo, WaitingResults, End };
+public:
+    ParabolicFinder(unsigned Start, unsigned End)
+        : begin(Start),
+          results(End-Start+1, 0),
+          state  (End-Start+1, Unknown),
+          LeftRightSwap(false)
+    {
+    }
+
+    InstructionType GetNextInstruction(unsigned& attempt)
+    {
+      InstructionType result = End;
+
+      const int Last  = begin + results.size()-1;
+
+      #define RetIns(n) do{ result = (n); goto DoneCrit; }while(0)
+      #define RetVal(n) do{ state[attempt = (n)] = Pending; RetIns(HereYouGo); }while(0)
+
+      {
+        /*
+        std::fprintf(stderr, "NextInstruction...");
+        for(unsigned a=0; a<state.size(); ++a)
+            std::fprintf(stderr, " %u=%s", a,
+                state[a]==Unknown?"??"
+               :state[a]==Done?"Ok"
+               :"..");
+        std::fprintf(stderr, "\n");*/
+
+        if(CountUnknown() == 0)
+        {
+            // No unassigned slots remain. Don't need more workers.
+            RetIns(End);
+        }
+
+        if(1) // scope for local variables
+        {
+            // Alternate which side to do next if both are available.
+            bool LeftSideFirst = LeftRightSwap ^= 1;
+
+            // Check left side descend type
+            int LeftSideNext = -1; bool LeftSideDoable = false;
+            for(int c=0; c<=Last; ++c)
+                switch(state[c])
+                {
+                    case Unknown: LeftSideNext = c; LeftSideDoable = true; goto ExitLeftSideFor;
+                    case Pending: LeftSideNext = c; LeftSideDoable = false; goto ExitLeftSideFor;
+                    case Done:
+                        if(c == 0) continue;
+                        if(results[c] > results[c-1])
+                        {
+                            // Left side stopped descending.
+                            if(state[Last] != Unknown) RetIns(End);
+                            goto ExitLeftSideFor;
+                        }
+                        else if(results[c] == results[c-1])
+                            LeftSideFirst = true;
+                }
+        ExitLeftSideFor: ;
+
+            // Check right side descend type
+            int RightSideNext = -1; bool RightSideDoable = false;
+            for(int c=Last; c>=0; --c)
+                switch(state[c])
+                {
+                    case Unknown: RightSideNext = c; RightSideDoable = true; goto ExitRightSideFor;
+                    case Pending: RightSideNext = c; RightSideDoable = false; goto ExitRightSideFor;
+                    case Done:
+                        if(c == Last) continue;
+                        if(results[c] > results[c+1])
+                        {
+                            // Right side stopped descending.
+                            if(state[0] != Unknown) RetIns(End);
+                            goto ExitRightSideFor;
+                        }
+                        else if(results[c] == results[c+1])
+                            LeftSideFirst = false;
+                }
+        ExitRightSideFor: ;
+
+            if(!LeftSideFirst)
+                 { std::swap(LeftSideDoable, RightSideDoable);
+                   std::swap(LeftSideNext,   RightSideNext); }
+
+            if(LeftSideDoable) RetVal(LeftSideNext);
+            if(RightSideDoable) RetVal(RightSideNext);
+
+            // If we have excess threads and work to do, give them something
+            if(CountHandled() > 2) if(LeftSideNext >= 0) RetVal(LeftSideNext);
+            if(CountHandled() > 3) if(RightSideNext >= 0) RetVal(RightSideNext);
+
+            RetIns(WaitingResults);
+        }
+
+      DoneCrit: ;
+      }
+      return result;
+    }
+
+    void GotResult(unsigned attempt, unsigned value)
+    {
+      {
+        results[attempt] = value;
+        state[attempt]   = Done;
+      }
+    }
+
+private:
+    unsigned CountUnknown() const
+    {
+        unsigned result=0;
+        for(size_t a=0, b=state.size(); a<b; ++a)
+            if(state[a] == Unknown) ++result;
+        return result;
+    }
+    unsigned CountHandled() const
+    {
+        return state.size() - CountUnknown();
+    }
+private:
+    unsigned begin;
+    std::vector<unsigned>   results;
+    std::vector<QueryState> state;
+    bool LeftRightSwap;
+};
+
+static void LZMACompressAutoHelper(
+    const unsigned char* data, size_t length,
+    bool use_small_dict,
+    const char* why,
+    unsigned& pb, unsigned& lp, unsigned& lc,
+    unsigned& which_iterate, ParabolicFinder& finder,
+    bool&first, std::vector<unsigned char>& bestresult)
+{
+    for(;;)
+    {
+        unsigned t=0;
+        switch(finder.GetNextInstruction(t))
+        {
+            case ParabolicFinder::End:
+                return;
+            case ParabolicFinder::HereYouGo:
+                break;
+            case ParabolicFinder::WaitingResults:
+                ForceSwitchThread();
+                continue;
+        }
+
+        const unsigned try_pb = &which_iterate == &pb ? t : pb;
+        const unsigned try_lp = &which_iterate == &lp ? t : lp;
+        const unsigned try_lc = &which_iterate == &lc ? t : lc;
+
+        if(LZMA_verbose >= 2)
+            std::fprintf(stderr, "%s:Trying pb%u lp%u lc%u\n",
+                why,try_pb,try_lp,try_lc);
+
+        std::vector<unsigned char> result = use_small_dict
+            ? LZMACompress(data,length,try_pb,try_lp,try_lc, 65536)
+            : LZMACompress(data,length,try_pb,try_lp,try_lc);
+
+        if(LZMA_verbose >= 2)
+            std::fprintf(stderr, "%s:       pb%u lp%u lc%u -> %u\n",
+                why,try_pb,try_lp,try_lc, (unsigned)result.size());
+
+        finder.GotResult(t, result.size());
+
+      {
+        if(first || result.size() <= bestresult.size())
+        {
+            first    = false;
+            bestresult.swap(result);
+            which_iterate = t;
+        }
+      }
+    }
+}
+
+
+const std::vector<unsigned char> LZMACompressAuto(const unsigned char* data, size_t length,
+    const char* why)
+{
+    if(LZMA_verbose >= 1)
+    {
+        std::fprintf(stderr, "Start LZMA(%s, %u bytes)\n", why, (unsigned)length);
+        std::fflush(stderr);
+    }
+
+    unsigned backup_algorithm = LZMA_AlgorithmNo;
+
+    bool use_small_dict = false;//length >= 1048576;
+
+    if(use_small_dict) LZMA_AlgorithmNo = 0;
+
+    unsigned pb=0, lp=0, lc=0;
+
+    std::vector<unsigned char> bestresult;
+
+  {
+    ParabolicFinder pb_finder(0,4);
+    ParabolicFinder lp_finder(0,4);
+    ParabolicFinder lc_finder(0,8);
+    bool first=true;
+   {
+    /* Using parallelism here. However, we need barriers after
+     * each step, because the comparisons are made based on the
+     * result size, and if the pb/lp/lc values other than the
+     * one being focused change, it won't work. Only one parameter
+     * must change in the loop.
+     */
+
+    /* step 1: find best value in pb axis */
+    LZMACompressAutoHelper(data,length,use_small_dict,why,
+        pb, lp, lc,
+        pb, pb_finder, first, bestresult);
+
+
+    lp_finder.GotResult(lp, bestresult.size());
+
+    /* step 2: find best value in lp axis */
+    LZMACompressAutoHelper(data,length,use_small_dict,why,
+        pb, lp, lc,
+        lp, lp_finder, first, bestresult);
+
+    lc_finder.GotResult(lc, bestresult.size());
+
+    /* step 3: find best value in lc axis */
+    LZMACompressAutoHelper(data,length,use_small_dict,why,
+        pb, lp, lc,
+        lc, lc_finder, first, bestresult);
+   }
+  }
+
+    if(use_small_dict || LZMA_AlgorithmNo != backup_algorithm)
+    {
+        LZMA_AlgorithmNo = backup_algorithm;
+        bestresult = LZMACompress(data,length, pb,lp,lc);
+    }
+
+    if(LZMA_verbose >= 1)
+    {
+        std::fprintf(stderr, "Best LZMA for %s(%u->%u): pb%u lp%u lc%u\n",
+            why,
+            (unsigned)length,
+            (unsigned)bestresult.size(),
+            pb,lp,lc);
+    }
+    std::fflush(stderr);
+
+    return bestresult;
+}
+
+const std::vector<unsigned char>
+    DoLZMACompress(int HeavyLevel,
+        const unsigned char* data, size_t length,
+        const char* why)
+{
+    if(HeavyLevel >= 2) return LZMACompressHeavy(data,length, why);
+    if(HeavyLevel >= 1) return LZMACompressAuto(data,length, why);
+    return LZMACompress(data,length);
+}
+
+extern "C" {
+
+/**
+ * Compress a buffer with lzma
+ * Don't copy the result back if it is too large.
+ * @param in a pointer to the buffer
+ * @param in_len the length in bytes
+ * @param out a pointer to a buffer of at least size in_len
+ * @param out_len a pointer to the compressed length of in
+ */
+
+void do_lzma_compress(char *in, int in_len, char *out, int *out_len) {
+	std::vector<unsigned char> result;
+	result = LZMACompress(std::vector<unsigned char>(in, in + in_len));
+	*out_len = result.size();
+	if (*out_len < in_len)
+		std::memcpy(out, &result[0], *out_len);
+}
+
+void do_lzma_uncompress(char *dst, int dst_len, char *src, int src_len) {
+	std::vector<unsigned char> result;
+	result = LZMADeCompress(std::vector<unsigned char>(src, src + src_len));
+	if (result.size() <= (SizeT)dst_len)
+		std::memcpy(dst, &result[0], result.size());
+	else
+	{
+		fprintf(stderr, "Not copying %d bytes to %d-byte buffer!\n",
+			(unsigned int)result.size(), dst_len);
+		exit(1);
+	}
+}
+
+}
+
diff --git a/util/cbfstool/lzma/lzma.hh b/util/cbfstool/lzma/lzma.hh
new file mode 100644
index 0000000..5e00ef2
--- /dev/null
+++ b/util/cbfstool/lzma/lzma.hh
@@ -0,0 +1,109 @@
+#ifndef HHlzmaHH
+#define HHlzmaHH
+
+#include <vector>
+
+extern int LZMA_verbose;
+
+extern unsigned LZMA_NumFastBytes;
+extern unsigned LZMA_AlgorithmNo;
+extern unsigned LZMA_PosStateBits;
+extern unsigned LZMA_LiteralPosStateBits;
+extern unsigned LZMA_LiteralContextBits;
+
+/* decompress LZMA-compressed data. */
+const std::vector<unsigned char> LZMADeCompress
+    (const unsigned char* data, std::size_t length);
+
+const std::vector<unsigned char> LZMADeCompress
+    (const unsigned char* data, std::size_t length, bool& ok);
+
+static inline const std::vector<unsigned char> LZMADeCompress
+    (const std::vector<unsigned char>& buf)
+    { return LZMADeCompress(&buf[0], buf.size()); }
+
+static inline const std::vector<unsigned char> LZMADeCompress
+    (const std::vector<unsigned char>& buf, bool& ok)
+    { return LZMADeCompress(&buf[0], buf.size(), ok); }
+
+/* LZMA-compress data with current settings. */
+const std::vector<unsigned char> LZMACompress
+    (const unsigned char* data, std::size_t length);
+
+static inline const std::vector<unsigned char> LZMACompress
+    (const std::vector<unsigned char>& buf)
+        { return LZMACompress(&buf[0], buf.size()); }
+
+/* LZMA-compress data with given settings. */
+const std::vector<unsigned char> LZMACompress
+    (const unsigned char* data, std::size_t length,
+     unsigned pb,
+     unsigned lp,
+     unsigned lc);
+
+static inline const std::vector<unsigned char> LZMACompress
+    (const std::vector<unsigned char>& buf,
+     unsigned pb,
+     unsigned lp,
+     unsigned lc)
+     { return LZMACompress(&buf[0], buf.size(), pb,lp,lc); }
+
+const std::vector<unsigned char> LZMACompress(
+    const unsigned char* data, std::size_t length,
+    unsigned pb,
+    unsigned lp,
+    unsigned lc,
+    unsigned dictionarysize);
+
+static inline const std::vector<unsigned char> LZMACompress(
+    const std::vector<unsigned char>& buf,
+    unsigned pb,
+    unsigned lp,
+    unsigned lc,
+    unsigned dictionarysize)
+    { return LZMACompress(&buf[0], buf.size(), pb,lp,lc,dictionarysize); }
+
+/* LZMA-compress data with every settings (5*5*9 times), taking the best.
+ * It will consume a lot of time and output useful statistics,
+ * so a context parameter ("why") is also given.
+ */
+const std::vector<unsigned char> LZMACompressHeavy
+    (const unsigned char* data, std::size_t length,
+     const char* why = "?");
+
+const std::vector<unsigned char> LZMACompressAuto
+    (const unsigned char* data, std::size_t length,
+     const char* why = "?");
+
+static inline const std::vector<unsigned char> LZMACompressHeavy
+    (const std::vector<unsigned char>& buf,
+     const char* why = "?")
+     { return LZMACompressHeavy(&buf[0],buf.size(),why); }
+
+static inline const std::vector<unsigned char> LZMACompressAuto
+    (const std::vector<unsigned char>& buf,
+     const char* why = "?")
+     { return LZMACompressAuto(&buf[0],buf.size(),why); }
+
+const std::vector<unsigned char>
+    DoLZMACompress(int HeavyLevel,
+        const unsigned char* data,
+        std::size_t          length,
+        const char* why = "?");
+
+static inline const std::vector<unsigned char>
+    DoLZMACompress(int HeavyLevel,
+        const std::vector<unsigned char>& data, const char* why = "?")
+    { return DoLZMACompress(HeavyLevel, &data[0], data.size(), why); }
+
+
+/*
+LZMA compressed file format
+ ---------------------------
+ Offset Size Description
+   0     1   Special LZMA properties for compressed data
+   1     4   Dictionary size (little endian)
+   5     8   Uncompressed size (little endian). -1 means unknown size
+  13         Compressed data
+*/
+#endif
diff --git a/util/cbfstool/lzma/minilzma.cc b/util/cbfstool/lzma/minilzma.cc
deleted file mode 100644
index e621dcc..0000000
--- a/util/cbfstool/lzma/minilzma.cc
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * minimal lzma implementation
- *
- * Copyright (C) 2002 Eric Biederman
- * Copyright (C) 2005 Joel Yliluoma
- * Copyright (C) 2007 coresystems GmbH
- * (Adapted by Stefan Reinauer <stepan at coresystems.de> for coresystems GmbH)
- * Copyright (C) 2007 Patrick Georgi <patrick at georgi-clan.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
- */
-
-#include "C/Common/MyInitGuid.h"
-#include "C/7zip/Compress/LZMA/LZMAEncoder.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <errno.h>
-#include <cstring>
-#include <cstdio>
-#include <cstdlib>
-#include <cctype>
-
-#include <vector>
-#include <algorithm>
-#include <stdint.h>
-
-const std::vector<unsigned char> LZMACompress
-    (const std::vector<unsigned char>& buf);
-
-const std::vector<unsigned char> LZMADeCompress
-    (const std::vector<unsigned char>& buf);
-
-static inline uint16_t R16(const void* p)
-{
-    const unsigned char* data = (const unsigned char*)p;
-    return (data[0] << 0)  | (data[1] << 8);
-}
-static inline uint32_t R32(const void* p)
-{
-    const unsigned char* data = (const unsigned char*)p;
-    return R16(data) | (R16(data+2) << 16);
-}
-
-#define L (uint64_t)
-
-static inline uint64_t R64(const void* p)
-{
-    const unsigned char* data = (const unsigned char*)p;
-    return (L R32(data)) | ((L R32(data+4)) << 32);
-}
-
-#undef L
-
-static UInt32 SelectDictionarySizeFor(unsigned datasize)
-{
-   #if 1
-    return datasize;
-   #else
-#ifdef __GNUC__
-    /* gnu c can optimize this switch statement into a fast binary
-     * search, but it cannot do so for the list of the if statements.
-     */
-    switch(datasize)
-    {
-        case 0 ... 512 : return 512;
-        case 513 ... 1024: return 2048;
-        case 1025 ... 4096: return 8192;
-        case 4097 ... 16384: return 32768;
-        case 16385 ... 65536: return 528288;
-        case 65537 ... 528288: return 1048576*4;
-        case 528289 ... 786432: return 1048576*16;
-        default: return 1048576*32;
-    }
-#else
-    if(datasize <= 512) return 512;
-    if(datasize <= 1024) return 1024;
-    if(datasize <= 4096) return 4096;
-    if(datasize <= 16384) return 32768;
-    if(datasize <= 65536) return 528288;
-    if(datasize <= 528288) return 1048576*4;
-    if(datasize <= 786432) return 1048576*16;
-    return 32*1048576;
-#endif
-   #endif
-}
-
-
-class CInStreamRam: public ISequentialInStream, public CMyUnknownImp
-{
-    const std::vector<unsigned char>& input;
-    size_t Pos;
-public:
-    MY_UNKNOWN_IMP
-
-    CInStreamRam(const std::vector<unsigned char>& buf) : input(buf), Pos(0)
-    {
-    }
-    virtual ~CInStreamRam() {}
-
-    STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
-};
-
-STDMETHODIMP CInStreamRam::Read(void *data, UInt32 size, UInt32 *processedSize)
-{
-    UInt32 remain = input.size() - Pos;
-    if (size > remain) size = remain;
-
-    std::memcpy(data, &input[Pos], size);
-    Pos += size;
-
-    if(processedSize != NULL) *processedSize = size;
-
-    return S_OK;
-}
-
-class COutStreamRam: public ISequentialOutStream, public CMyUnknownImp
-{
-    std::vector<Byte> result;
-    size_t Pos;
-public:
-    MY_UNKNOWN_IMP
-
-    COutStreamRam(): result(), Pos(0) { }
-    virtual ~COutStreamRam() { }
-
-    void Reserve(unsigned n) { result.reserve(n); }
-    const std::vector<Byte>& Get() const { return result; }
-
-    HRESULT WriteByte(Byte b)
-    {
-        if(Pos >= result.size()) result.resize(Pos+1);
-        result[Pos++] = b;
-        return S_OK;
-    }
-
-    STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
-};
-
-STDMETHODIMP COutStreamRam::Write(const void *data, UInt32 size, UInt32 *processedSize)
-{
-    if(Pos+size > result.size()) result.resize(Pos+size);
-
-    std::memcpy(&result[Pos], data, size);
-    if(processedSize != NULL) *processedSize = size;
-    Pos += size;
-    return S_OK;
-}
-
-const std::vector<unsigned char> LZMACompress(const std::vector<unsigned char>& buf)
-{
-    if(buf.empty()) return buf;
-
-    const UInt32 dictionarysize = SelectDictionarySizeFor(buf.size());
-
-    NCompress::NLZMA::CEncoder *encoderSpec = new NCompress::NLZMA::CEncoder;
-    CMyComPtr<ICompressCoder> encoder = encoderSpec;
-    const PROPID propIDs[] =
-    {
-        NCoderPropID::kAlgorithm,
-        NCoderPropID::kDictionarySize,
-        NCoderPropID::kNumFastBytes,
-    };
-    const unsigned kNumProps = sizeof(propIDs) / sizeof(propIDs[0]);
-    PROPVARIANT properties[kNumProps];
-    properties[0].vt = VT_UI4; properties[0].ulVal = (UInt32)2;
-    properties[1].vt = VT_UI4; properties[1].ulVal = (UInt32)dictionarysize;
-    properties[2].vt = VT_UI4; properties[2].ulVal = (UInt32)64;
-
-    if (encoderSpec->SetCoderProperties(propIDs, properties, kNumProps) != S_OK)
-    {
-    Error:
-        return std::vector<unsigned char> ();
-    }
-
-    COutStreamRam *const outStreamSpec = new COutStreamRam;
-    CMyComPtr<ISequentialOutStream> outStream = outStreamSpec;
-    CInStreamRam *const inStreamSpec = new CInStreamRam(buf);
-    CMyComPtr<ISequentialInStream> inStream = inStreamSpec;
-
-    outStreamSpec->Reserve(buf.size());
-
-    if (encoderSpec->WriteCoderProperties(outStream) != S_OK) goto Error;
-
-    for (unsigned i = 0; i < 8; i++)
-    {
-        UInt64 t = (UInt64)buf.size();
-        outStreamSpec->WriteByte((Byte)((t) >> (8 * i)));
-    }
-
-    HRESULT lzmaResult = encoder->Code(inStream, outStream, 0, 0, 0);
-    if (lzmaResult != S_OK) goto Error;
-
-    return outStreamSpec->Get();
-}
-
-#undef RC_NORMALIZE
-
-#include "C/7zip/Decompress/LzmaDecode.h"
-#include "C/7zip/Decompress/LzmaDecode.c"
-
-const std::vector<unsigned char> LZMADeCompress
-    (const std::vector<unsigned char>& buf)
-{
-    if(buf.size() <= 5+8) return std::vector<unsigned char> ();
-
-    uint_least64_t out_sizemax = R64(&buf[5]);
-
-    std::vector<unsigned char> result(out_sizemax);
-
-    CLzmaDecoderState state;
-    LzmaDecodeProperties(&state.Properties, &buf[0], LZMA_PROPERTIES_SIZE);
-    state.Probs = new CProb[LzmaGetNumProbs(&state.Properties)];
-
-    SizeT in_done;
-    SizeT out_done;
-    LzmaDecode(&state, &buf[13], buf.size()-13, &in_done,
-               &result[0], result.size(), &out_done);
-
-    delete[] state.Probs;
-
-    result.resize(out_done);
-    return result;
-}
-
-#ifndef COMPACT
-int main(int argc, char *argv[])
-{
-	char  *s;
-	FILE  *f, *infile, *outfile;
-	int    c;
-
-	if (argc != 4) {
-		std::fprintf(stderr, "'lzma e file1 file2' encodes file1 into file2.\n"
-			"'lzma d file2 file1' decodes file2 into file1.\n");
-
-		return EXIT_FAILURE;
-	}
-	if (argc == 4) {
-		if ((s = argv[1], s[1] || strpbrk(s, "DEde") == NULL)
-			|| (s = argv[2], (infile  = fopen(s, "rb")) == NULL)
-			|| (s = argv[3], (outfile = fopen(s, "wb")) == NULL)) {
-			std::fprintf(stderr, "??? %s\n", s);
-			return EXIT_FAILURE;
-		}
-	}
-
-	struct stat fs;
-	int si;
-	if (fstat(fileno(infile), &fs)) {
-		std::perror(strerror(errno));
-		return EXIT_FAILURE;
-	}
-	si=fs.st_size;
-
-	char *Buf=(char *)malloc(si);
-	fread(Buf,si, 1, infile);
-
-	std::vector<unsigned char> result;
-	if (toupper(*argv[1]) == 'E')
-		result = LZMACompress(std::vector<unsigned char>(Buf,Buf+si));
-	else
-		result = LZMADeCompress(std::vector<unsigned char>(Buf,Buf+si));
-
-	fwrite(&result[0], result.size(), 1, outfile);
-	fclose(infile);
-	fclose(outfile);
-	return EXIT_SUCCESS;
-}
-#else
-extern "C" {
-
-/**
- * Compress a buffer with lzma
- * Don't copy the result back if it is too large.
- * @param in a pointer to the buffer
- * @param in_len the length in bytes
- * @param out a pointer to a buffer of at least size in_len
- * @param out_len a pointer to the compressed length of in
- */
-
-void do_lzma_compress(char *in, int in_len, char *out, int *out_len) {
-	std::vector<unsigned char> result;
-	result = LZMACompress(std::vector<unsigned char>(in, in + in_len));
-	*out_len = result.size();
-	if (*out_len < in_len)
-		std::memcpy(out, &result[0], *out_len);
-}
-
-void do_lzma_uncompress(char *dst, int dst_len, char *src, int src_len) {
-	std::vector<unsigned char> result;
-	result = LZMADeCompress(std::vector<unsigned char>(src, src + src_len));
-	if (result.size() <= (SizeT)dst_len)
-		std::memcpy(dst, &result[0], result.size());
-	else
-	{
-		fprintf(stderr, "Not copying %d bytes to %d-byte buffer!\n",
-			(unsigned int)result.size(), dst_len);
-		exit(1);
-	}
-}
-
-}
-#endif
-




More information about the coreboot mailing list