Showing preview only (308K chars total). Download the full file or copy to clipboard to get everything.
Repository: lentinj/tp-compact-keyboard
Branch: master
Commit: 778912c0f8ca
Files: 23
Total size: 296.1 KB
Directory structure:
gitextract_41kwzyiw/
├── .gitignore
├── LICENSE
├── README.md
├── kernel-patch/
│ ├── 0001-HID-lenovo-Rename-hid-lenovo-tpkbd-to-hid-lenovo.patch
│ ├── 0002-HID-lenovo-Prepare-support-for-adding-other-devices.patch
│ ├── 0003-HID-lenovo-Style-fixes.patch
│ ├── 0004-HID-lenovo-Add-support-for-Compact-BT-USB-keyboard.patch
│ ├── 1001-HID-lenovo-Move-USB-KEY_FILE-to-0x00f9-to-prevent-sc.patch
│ ├── 1002-HID-lenovo-Don-t-set-EV_REP-to-avoid-repeating-mice-.patch
│ ├── 2001-HID-lenovo-Add-sensitivity-control-to-compact-keyboa.patch
│ ├── 2002-HID-lenovo-Use-native-middle-button-mode-for-compact.patch
│ ├── 3001-HID-lenovo-Use-constants-for-axes-names.patch
│ ├── 3002-HID-lenovo-Add-missing-return-value-check.patch
│ └── 3003-HID-lenovo-Hide-middle-button-press-until-release.patch
├── tp-compact-bt-keyboard/
│ ├── README.md
│ └── tp-compact-keyboard
├── tp-compact-usb-keyboard/
│ ├── Makefile
│ ├── README.md
│ └── tp-compact-usb-keyboard.c
├── tp-multi-connect/
│ └── README.md
├── tp-tablet2/
│ └── README.md
└── x1-tablet-keyboard/
├── README.md
└── tp-x1t-gen1-adapter.dxf
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
/module/*.mod.c
/module/*.cmd
/module/*.ko
/module/*.tmp_versions
/module/Module.symvers
/module/modules.order
/linux
/*.pcap
/tp-compact-usb-keyboard/tp-compact-usb-keyboard
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
51 Franklin Street, 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.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, 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 or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
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 give any other recipients of the Program a copy of this License
along with the Program.
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 Program or any portion
of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
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 Program, 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 Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) 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; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, 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 executable. However, as a
special exception, the source code 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.
If distribution of executable or 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 counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program 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.
5. 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 Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program 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 to
this License.
7. 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 Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program 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 Program.
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.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program 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.
9. The Free Software Foundation may publish revised and/or new versions
of the 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 Program
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 Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, 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
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), 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 Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. 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.
{description}
Copyright (C) {year} {fullname}
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 Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
{signature of Ty Coon}, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
================================================
FILE: README.md
================================================
# Lenovo Thinkpad Keyboards
Repository dedicated to using ~standalone Lenovo Thinkpad Keyboards, particularly under Linux
* [ThinkPad Compact Bluetooth Keyboard with TrackPoint](tp-compact-bt-keyboard/)
* [ThinkPad Compact USB Keyboard with TrackPoint / Lenovo Low Profile USB Keyboard](tp-compact-usb-keyboard/)
* [Thinkpad Multi-Connect Keyboard](tp-multi-connect/)
* [Thinkpad Tablet 2 Keyboard](tp-tablet2/)
================================================
FILE: kernel-patch/0001-HID-lenovo-Rename-hid-lenovo-tpkbd-to-hid-lenovo.patch
================================================
diff --git a/Documentation/ABI/testing/sysfs-driver-hid-lenovo-tpkbd b/Documentation/ABI/testing/sysfs-driver-hid-lenovo
similarity index 100%
rename from Documentation/ABI/testing/sysfs-driver-hid-lenovo-tpkbd
rename to Documentation/ABI/testing/sysfs-driver-hid-lenovo
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 800c8b6..9b7acfc 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -331,18 +331,18 @@ config HID_LCPOWER
---help---
Support for LC-Power RC1000MCE RF remote control.
-config HID_LENOVO_TPKBD
- tristate "Lenovo ThinkPad USB Keyboard with TrackPoint"
+config HID_LENOVO
+ tristate "Lenovo / Thinkpad devices"
depends on HID
select NEW_LEDS
select LEDS_CLASS
---help---
- Support for the Lenovo ThinkPad USB Keyboard with TrackPoint.
+ Support for Lenovo devices that are not fully compliant with HID standard.
- Say Y here if you have a Lenovo ThinkPad USB Keyboard with TrackPoint
- and would like to use device-specific features like changing the
- sensitivity of the trackpoint, using the microphone mute button or
- controlling the mute and microphone mute LEDs.
+ Say Y if you want support for the non-compliant features of the Lenovo
+ Thinkpad standalone keyboards, e.g:
+ - ThinkPad USB Keyboard with TrackPoint (supports extra LEDs and trackpoint
+ configuration)
config HID_LOGITECH
tristate "Logitech devices" if EXPERT
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
index a6fa6ba..5e96be3 100644
--- a/drivers/hid/Makefile
+++ b/drivers/hid/Makefile
@@ -59,7 +59,7 @@ obj-$(CONFIG_HID_KENSINGTON) += hid-kensington.o
obj-$(CONFIG_HID_KEYTOUCH) += hid-keytouch.o
obj-$(CONFIG_HID_KYE) += hid-kye.o
obj-$(CONFIG_HID_LCPOWER) += hid-lcpower.o
-obj-$(CONFIG_HID_LENOVO_TPKBD) += hid-lenovo-tpkbd.o
+obj-$(CONFIG_HID_LENOVO) += hid-lenovo.o
obj-$(CONFIG_HID_LOGITECH) += hid-logitech.o
obj-$(CONFIG_HID_LOGITECH_DJ) += hid-logitech-dj.o
obj-$(CONFIG_HID_MAGICMOUSE) += hid-magicmouse.o
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 8ed66fd..55841bd 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -1796,7 +1796,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) },
{ HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) },
{ HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) },
-#if IS_ENABLED(CONFIG_HID_LENOVO_TPKBD)
+#if IS_ENABLED(CONFIG_HID_LENOVO)
{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPKBD) },
#endif
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) },
diff --git a/drivers/hid/hid-lenovo-tpkbd.c b/drivers/hid/hid-lenovo.c
similarity index 64%
rename from drivers/hid/hid-lenovo-tpkbd.c
rename to drivers/hid/hid-lenovo.c
index 2d25b6c..0320b96 100644
--- a/drivers/hid/hid-lenovo-tpkbd.c
+++ b/drivers/hid/hid-lenovo.c
@@ -20,8 +20,7 @@
#include "hid-ids.h"
-/* This is only used for the trackpoint part of the driver, hence _tp */
-struct tpkbd_data_pointer {
+struct lenovo_drvdata_tpkbd {
int led_state;
struct led_classdev led_mute;
struct led_classdev led_micmute;
@@ -35,7 +34,7 @@ struct tpkbd_data_pointer {
#define map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
-static int tpkbd_input_mapping(struct hid_device *hdev,
+static int lenovo_input_mapping_tpkbd(struct hid_device *hdev,
struct hid_input *hi, struct hid_field *field,
struct hid_usage *usage, unsigned long **bit, int *max)
{
@@ -50,10 +49,10 @@ static int tpkbd_input_mapping(struct hid_device *hdev,
#undef map_key_clear
-static int tpkbd_features_set(struct hid_device *hdev)
+static int lenovo_features_set_tpkbd(struct hid_device *hdev)
{
struct hid_report *report;
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
report = hdev->report_enum[HID_FEATURE_REPORT].report_id_hash[4];
@@ -69,23 +68,23 @@ static int tpkbd_features_set(struct hid_device *hdev)
return 0;
}
-static ssize_t pointer_press_to_select_show(struct device *dev,
+static ssize_t attr_press_to_select_show_tpkbd(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->press_to_select);
}
-static ssize_t pointer_press_to_select_store(struct device *dev,
+static ssize_t attr_press_to_select_store_tpkbd(struct device *dev,
struct device_attribute *attr,
const char *buf,
size_t count)
{
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
int value;
if (kstrtoint(buf, 10, &value))
@@ -94,28 +93,28 @@ static ssize_t pointer_press_to_select_store(struct device *dev,
return -EINVAL;
data_pointer->press_to_select = value;
- tpkbd_features_set(hdev);
+ lenovo_features_set_tpkbd(hdev);
return count;
}
-static ssize_t pointer_dragging_show(struct device *dev,
+static ssize_t attr_dragging_show_tpkbd(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->dragging);
}
-static ssize_t pointer_dragging_store(struct device *dev,
+static ssize_t attr_dragging_store_tpkbd(struct device *dev,
struct device_attribute *attr,
const char *buf,
size_t count)
{
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
int value;
if (kstrtoint(buf, 10, &value))
@@ -124,28 +123,28 @@ static ssize_t pointer_dragging_store(struct device *dev,
return -EINVAL;
data_pointer->dragging = value;
- tpkbd_features_set(hdev);
+ lenovo_features_set_tpkbd(hdev);
return count;
}
-static ssize_t pointer_release_to_select_show(struct device *dev,
+static ssize_t attr_release_to_select_show_tpkbd(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->release_to_select);
}
-static ssize_t pointer_release_to_select_store(struct device *dev,
+static ssize_t attr_release_to_select_store_tpkbd(struct device *dev,
struct device_attribute *attr,
const char *buf,
size_t count)
{
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
int value;
if (kstrtoint(buf, 10, &value))
@@ -154,28 +153,28 @@ static ssize_t pointer_release_to_select_store(struct device *dev,
return -EINVAL;
data_pointer->release_to_select = value;
- tpkbd_features_set(hdev);
+ lenovo_features_set_tpkbd(hdev);
return count;
}
-static ssize_t pointer_select_right_show(struct device *dev,
+static ssize_t attr_select_right_show_tpkbd(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->select_right);
}
-static ssize_t pointer_select_right_store(struct device *dev,
+static ssize_t attr_select_right_store_tpkbd(struct device *dev,
struct device_attribute *attr,
const char *buf,
size_t count)
{
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
int value;
if (kstrtoint(buf, 10, &value))
@@ -184,119 +183,119 @@ static ssize_t pointer_select_right_store(struct device *dev,
return -EINVAL;
data_pointer->select_right = value;
- tpkbd_features_set(hdev);
+ lenovo_features_set_tpkbd(hdev);
return count;
}
-static ssize_t pointer_sensitivity_show(struct device *dev,
+static ssize_t attr_sensitivity_show_tpkbd(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
return snprintf(buf, PAGE_SIZE, "%u\n",
data_pointer->sensitivity);
}
-static ssize_t pointer_sensitivity_store(struct device *dev,
+static ssize_t attr_sensitivity_store_tpkbd(struct device *dev,
struct device_attribute *attr,
const char *buf,
size_t count)
{
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
int value;
if (kstrtoint(buf, 10, &value) || value < 1 || value > 255)
return -EINVAL;
data_pointer->sensitivity = value;
- tpkbd_features_set(hdev);
+ lenovo_features_set_tpkbd(hdev);
return count;
}
-static ssize_t pointer_press_speed_show(struct device *dev,
+static ssize_t attr_press_speed_show_tpkbd(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
return snprintf(buf, PAGE_SIZE, "%u\n",
data_pointer->press_speed);
}
-static ssize_t pointer_press_speed_store(struct device *dev,
+static ssize_t attr_press_speed_store_tpkbd(struct device *dev,
struct device_attribute *attr,
const char *buf,
size_t count)
{
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
int value;
if (kstrtoint(buf, 10, &value) || value < 1 || value > 255)
return -EINVAL;
data_pointer->press_speed = value;
- tpkbd_features_set(hdev);
+ lenovo_features_set_tpkbd(hdev);
return count;
}
-static struct device_attribute dev_attr_pointer_press_to_select =
+static struct device_attribute dev_attr_press_to_select_tpkbd =
__ATTR(press_to_select, S_IWUSR | S_IRUGO,
- pointer_press_to_select_show,
- pointer_press_to_select_store);
+ attr_press_to_select_show_tpkbd,
+ attr_press_to_select_store_tpkbd);
-static struct device_attribute dev_attr_pointer_dragging =
+static struct device_attribute dev_attr_dragging_tpkbd =
__ATTR(dragging, S_IWUSR | S_IRUGO,
- pointer_dragging_show,
- pointer_dragging_store);
+ attr_dragging_show_tpkbd,
+ attr_dragging_store_tpkbd);
-static struct device_attribute dev_attr_pointer_release_to_select =
+static struct device_attribute dev_attr_release_to_select_tpkbd =
__ATTR(release_to_select, S_IWUSR | S_IRUGO,
- pointer_release_to_select_show,
- pointer_release_to_select_store);
+ attr_release_to_select_show_tpkbd,
+ attr_release_to_select_store_tpkbd);
-static struct device_attribute dev_attr_pointer_select_right =
+static struct device_attribute dev_attr_select_right_tpkbd =
__ATTR(select_right, S_IWUSR | S_IRUGO,
- pointer_select_right_show,
- pointer_select_right_store);
+ attr_select_right_show_tpkbd,
+ attr_select_right_store_tpkbd);
-static struct device_attribute dev_attr_pointer_sensitivity =
+static struct device_attribute dev_attr_sensitivity_tpkbd =
__ATTR(sensitivity, S_IWUSR | S_IRUGO,
- pointer_sensitivity_show,
- pointer_sensitivity_store);
+ attr_sensitivity_show_tpkbd,
+ attr_sensitivity_store_tpkbd);
-static struct device_attribute dev_attr_pointer_press_speed =
+static struct device_attribute dev_attr_press_speed_tpkbd =
__ATTR(press_speed, S_IWUSR | S_IRUGO,
- pointer_press_speed_show,
- pointer_press_speed_store);
-
-static struct attribute *tpkbd_attributes_pointer[] = {
- &dev_attr_pointer_press_to_select.attr,
- &dev_attr_pointer_dragging.attr,
- &dev_attr_pointer_release_to_select.attr,
- &dev_attr_pointer_select_right.attr,
- &dev_attr_pointer_sensitivity.attr,
- &dev_attr_pointer_press_speed.attr,
+ attr_press_speed_show_tpkbd,
+ attr_press_speed_store_tpkbd);
+
+static struct attribute *lenovo_attributes_tpkbd[] = {
+ &dev_attr_press_to_select_tpkbd.attr,
+ &dev_attr_dragging_tpkbd.attr,
+ &dev_attr_release_to_select_tpkbd.attr,
+ &dev_attr_select_right_tpkbd.attr,
+ &dev_attr_sensitivity_tpkbd.attr,
+ &dev_attr_press_speed_tpkbd.attr,
NULL
};
-static const struct attribute_group tpkbd_attr_group_pointer = {
- .attrs = tpkbd_attributes_pointer,
+static const struct attribute_group lenovo_attr_group_tpkbd = {
+ .attrs = lenovo_attributes_tpkbd,
};
-static enum led_brightness tpkbd_led_brightness_get(
+static enum led_brightness lenovo_led_brightness_get_tpkbd(
struct led_classdev *led_cdev)
{
struct device *dev = led_cdev->dev->parent;
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
int led_nr = 0;
if (led_cdev == &data_pointer->led_micmute)
@@ -307,12 +306,12 @@ static enum led_brightness tpkbd_led_brightness_get(
: LED_OFF;
}
-static void tpkbd_led_brightness_set(struct led_classdev *led_cdev,
+static void lenovo_led_brightness_set_tpkbd(struct led_classdev *led_cdev,
enum led_brightness value)
{
struct device *dev = led_cdev->dev->parent;
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
struct hid_report *report;
int led_nr = 0;
@@ -330,10 +329,10 @@ static void tpkbd_led_brightness_set(struct led_classdev *led_cdev,
hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
}
-static int tpkbd_probe_tp(struct hid_device *hdev)
+static int lenovo_probe_tpkbd(struct hid_device *hdev)
{
struct device *dev = &hdev->dev;
- struct tpkbd_data_pointer *data_pointer;
+ struct lenovo_drvdata_tpkbd *data_pointer;
size_t name_sz = strlen(dev_name(dev)) + 16;
char *name_mute, *name_micmute;
int i;
@@ -347,12 +346,12 @@ static int tpkbd_probe_tp(struct hid_device *hdev)
return -ENODEV;
if (sysfs_create_group(&hdev->dev.kobj,
- &tpkbd_attr_group_pointer)) {
+ &lenovo_attr_group_tpkbd)) {
hid_warn(hdev, "Could not create sysfs group\n");
}
data_pointer = devm_kzalloc(&hdev->dev,
- sizeof(struct tpkbd_data_pointer),
+ sizeof(struct lenovo_drvdata_tpkbd),
GFP_KERNEL);
if (data_pointer == NULL) {
hid_err(hdev, "Could not allocate memory for driver data\n");
@@ -375,23 +374,25 @@ static int tpkbd_probe_tp(struct hid_device *hdev)
hid_set_drvdata(hdev, data_pointer);
data_pointer->led_mute.name = name_mute;
- data_pointer->led_mute.brightness_get = tpkbd_led_brightness_get;
- data_pointer->led_mute.brightness_set = tpkbd_led_brightness_set;
+ data_pointer->led_mute.brightness_get = lenovo_led_brightness_get_tpkbd;
+ data_pointer->led_mute.brightness_set = lenovo_led_brightness_set_tpkbd;
data_pointer->led_mute.dev = dev;
led_classdev_register(dev, &data_pointer->led_mute);
data_pointer->led_micmute.name = name_micmute;
- data_pointer->led_micmute.brightness_get = tpkbd_led_brightness_get;
- data_pointer->led_micmute.brightness_set = tpkbd_led_brightness_set;
+ data_pointer->led_micmute.brightness_get =
+ lenovo_led_brightness_get_tpkbd;
+ data_pointer->led_micmute.brightness_set =
+ lenovo_led_brightness_set_tpkbd;
data_pointer->led_micmute.dev = dev;
led_classdev_register(dev, &data_pointer->led_micmute);
- tpkbd_features_set(hdev);
+ lenovo_features_set_tpkbd(hdev);
return 0;
}
-static int tpkbd_probe(struct hid_device *hdev,
+static int lenovo_probe(struct hid_device *hdev,
const struct hid_device_id *id)
{
int ret;
@@ -410,7 +411,7 @@ static int tpkbd_probe(struct hid_device *hdev,
if (hid_get_drvdata(hdev)) {
hid_set_drvdata(hdev, NULL);
- ret = tpkbd_probe_tp(hdev);
+ ret = lenovo_probe_tpkbd(hdev);
if (ret)
goto err_hid;
}
@@ -422,12 +423,12 @@ err:
return ret;
}
-static void tpkbd_remove_tp(struct hid_device *hdev)
+static void lenovo_remove_tpkbd(struct hid_device *hdev)
{
- struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
+ struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
sysfs_remove_group(&hdev->dev.kobj,
- &tpkbd_attr_group_pointer);
+ &lenovo_attr_group_tpkbd);
led_classdev_unregister(&data_pointer->led_micmute);
led_classdev_unregister(&data_pointer->led_mute);
@@ -435,28 +436,28 @@ static void tpkbd_remove_tp(struct hid_device *hdev)
hid_set_drvdata(hdev, NULL);
}
-static void tpkbd_remove(struct hid_device *hdev)
+static void lenovo_remove(struct hid_device *hdev)
{
if (hid_get_drvdata(hdev))
- tpkbd_remove_tp(hdev);
+ lenovo_remove_tpkbd(hdev);
hid_hw_stop(hdev);
}
-static const struct hid_device_id tpkbd_devices[] = {
+static const struct hid_device_id lenovo_devices[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPKBD) },
{ }
};
-MODULE_DEVICE_TABLE(hid, tpkbd_devices);
+MODULE_DEVICE_TABLE(hid, lenovo_devices);
-static struct hid_driver tpkbd_driver = {
- .name = "lenovo_tpkbd",
- .id_table = tpkbd_devices,
- .input_mapping = tpkbd_input_mapping,
- .probe = tpkbd_probe,
- .remove = tpkbd_remove,
+static struct hid_driver lenovo_driver = {
+ .name = "lenovo",
+ .id_table = lenovo_devices,
+ .input_mapping = lenovo_input_mapping_tpkbd,
+ .probe = lenovo_probe,
+ .remove = lenovo_remove,
};
-module_hid_driver(tpkbd_driver);
+module_hid_driver(lenovo_driver);
MODULE_LICENSE("GPL");
================================================
FILE: kernel-patch/0002-HID-lenovo-Prepare-support-for-adding-other-devices.patch
================================================
diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
index 0320b96..a56b9e7 100644
--- a/drivers/hid/hid-lenovo.c
+++ b/drivers/hid/hid-lenovo.c
@@ -1,5 +1,6 @@
/*
- * HID driver for Lenovo ThinkPad USB Keyboard with TrackPoint
+ * HID driver for Lenovo:
+ * - ThinkPad USB Keyboard with TrackPoint (tpkbd)
*
* Copyright (c) 2012 Bernhard Seibold
*/
@@ -39,7 +40,7 @@ static int lenovo_input_mapping_tpkbd(struct hid_device *hdev,
struct hid_usage *usage, unsigned long **bit, int *max)
{
if (usage->hid == (HID_UP_BUTTON | 0x0010)) {
- /* mark the device as pointer */
+ /* This sub-device contains trackpoint, mark it */
hid_set_drvdata(hdev, (void *)1);
map_key_clear(KEY_MICMUTE);
return 1;
@@ -47,6 +48,19 @@ static int lenovo_input_mapping_tpkbd(struct hid_device *hdev,
return 0;
}
+static int lenovo_input_mapping(struct hid_device *hdev,
+ struct hid_input *hi, struct hid_field *field,
+ struct hid_usage *usage, unsigned long **bit, int *max)
+{
+ switch (hdev->product) {
+ case USB_DEVICE_ID_LENOVO_TPKBD:
+ return lenovo_input_mapping_tpkbd(hdev, hi, field,
+ usage, bit, max);
+ default:
+ return 0;
+ }
+}
+
#undef map_key_clear
static int lenovo_features_set_tpkbd(struct hid_device *hdev)
@@ -337,6 +351,15 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev)
char *name_mute, *name_micmute;
int i;
+ /*
+ * Only register extra settings against subdevice where input_mapping
+ * set drvdata to 1, i.e. the trackpoint.
+ */
+ if (!hid_get_drvdata(hdev))
+ return 0;
+
+ hid_set_drvdata(hdev, NULL);
+
/* Validate required reports. */
for (i = 0; i < 4; i++) {
if (!hid_validate_values(hdev, HID_FEATURE_REPORT, 4, i, 1))
@@ -409,12 +432,16 @@ static int lenovo_probe(struct hid_device *hdev,
goto err;
}
- if (hid_get_drvdata(hdev)) {
- hid_set_drvdata(hdev, NULL);
+ switch (hdev->product) {
+ case USB_DEVICE_ID_LENOVO_TPKBD:
ret = lenovo_probe_tpkbd(hdev);
- if (ret)
- goto err_hid;
+ break;
+ default:
+ ret = 0;
+ break;
}
+ if (ret)
+ goto err_hid;
return 0;
err_hid:
@@ -427,6 +454,13 @@ static void lenovo_remove_tpkbd(struct hid_device *hdev)
{
struct lenovo_drvdata_tpkbd *data_pointer = hid_get_drvdata(hdev);
+ /*
+ * Only the trackpoint half of the keyboard has drvdata and stuff that
+ * needs unregistering.
+ */
+ if (data_pointer == NULL)
+ return;
+
sysfs_remove_group(&hdev->dev.kobj,
&lenovo_attr_group_tpkbd);
@@ -438,8 +472,11 @@ static void lenovo_remove_tpkbd(struct hid_device *hdev)
static void lenovo_remove(struct hid_device *hdev)
{
- if (hid_get_drvdata(hdev))
+ switch (hdev->product) {
+ case USB_DEVICE_ID_LENOVO_TPKBD:
lenovo_remove_tpkbd(hdev);
+ break;
+ }
hid_hw_stop(hdev);
}
@@ -454,7 +491,7 @@ MODULE_DEVICE_TABLE(hid, lenovo_devices);
static struct hid_driver lenovo_driver = {
.name = "lenovo",
.id_table = lenovo_devices,
- .input_mapping = lenovo_input_mapping_tpkbd,
+ .input_mapping = lenovo_input_mapping,
.probe = lenovo_probe,
.remove = lenovo_remove,
};
================================================
FILE: kernel-patch/0003-HID-lenovo-Style-fixes.patch
================================================
diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
index a56b9e7..f96bf09 100644
--- a/drivers/hid/hid-lenovo.c
+++ b/drivers/hid/hid-lenovo.c
@@ -350,6 +350,7 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev)
size_t name_sz = strlen(dev_name(dev)) + 16;
char *name_mute, *name_micmute;
int i;
+ int ret;
/*
* Only register extra settings against subdevice where input_mapping
@@ -368,10 +369,9 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev)
if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, 3, 0, 2))
return -ENODEV;
- if (sysfs_create_group(&hdev->dev.kobj,
- &lenovo_attr_group_tpkbd)) {
- hid_warn(hdev, "Could not create sysfs group\n");
- }
+ ret = sysfs_create_group(&hdev->dev.kobj, &lenovo_attr_group_tpkbd);
+ if (ret)
+ hid_warn(hdev, "Could not create sysfs group: %d\n", ret);
data_pointer = devm_kzalloc(&hdev->dev,
sizeof(struct lenovo_drvdata_tpkbd),
================================================
FILE: kernel-patch/0004-HID-lenovo-Add-support-for-Compact-BT-USB-keyboard.patch
================================================
diff --git a/Documentation/ABI/testing/sysfs-driver-hid-lenovo b/Documentation/ABI/testing/sysfs-driver-hid-lenovo
index 57b92cb..53a0725 100644
--- a/Documentation/ABI/testing/sysfs-driver-hid-lenovo
+++ b/Documentation/ABI/testing/sysfs-driver-hid-lenovo
@@ -4,18 +4,21 @@ Contact: linux-input@vger.kernel.org
Description: This controls if mouse clicks should be generated if the trackpoint is quickly pressed. How fast this press has to be
is being controlled by press_speed.
Values are 0 or 1.
+ Applies to Thinkpad USB Keyboard with TrackPoint.
What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/dragging
Date: July 2011
Contact: linux-input@vger.kernel.org
Description: If this setting is enabled, it is possible to do dragging by pressing the trackpoint. This requires press_to_select to be enabled.
Values are 0 or 1.
+ Applies to Thinkpad USB Keyboard with TrackPoint.
What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/release_to_select
Date: July 2011
Contact: linux-input@vger.kernel.org
Description: For details regarding this setting please refer to http://www.pc.ibm.com/ww/healthycomputing/trkpntb.html
Values are 0 or 1.
+ Applies to Thinkpad USB Keyboard with TrackPoint.
What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/select_right
Date: July 2011
@@ -23,16 +26,25 @@ Contact: linux-input@vger.kernel.org
Description: This setting controls if the mouse click events generated by pressing the trackpoint (if press_to_select is enabled) generate
a left or right mouse button click.
Values are 0 or 1.
+ Applies to Thinkpad USB Keyboard with TrackPoint.
What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/sensitivity
Date: July 2011
Contact: linux-input@vger.kernel.org
Description: This file contains the trackpoint sensitivity.
Values are decimal integers from 1 (lowest sensitivity) to 255 (highest sensitivity).
+ Applies to Thinkpad USB Keyboard with TrackPoint.
What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/press_speed
Date: July 2011
Contact: linux-input@vger.kernel.org
Description: This setting controls how fast the trackpoint needs to be pressed to generate a mouse click if press_to_select is enabled.
Values are decimal integers from 1 (slowest) to 255 (fastest).
+ Applies to Thinkpad USB Keyboard with TrackPoint.
+What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-bus>:<vendor-id>:<product-id>.<num>/fn_lock
+Date: July 2014
+Contact: linux-input@vger.kernel.org
+Description: This setting controls whether Fn Lock is enabled on the keyboard (i.e. if F1 is Mute or F1)
+ Values are 0 or 1
+ Applies to ThinkPad Compact (USB|Bluetooth) Keyboard with TrackPoint.
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index 9b7acfc..1e19292 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -343,6 +343,8 @@ config HID_LENOVO
Thinkpad standalone keyboards, e.g:
- ThinkPad USB Keyboard with TrackPoint (supports extra LEDs and trackpoint
configuration)
+ - ThinkPad Compact Bluetooth Keyboard with TrackPoint (supports Fn keys)
+ - ThinkPad Compact USB Keyboard with TrackPoint (supports Fn keys)
config HID_LOGITECH
tristate "Logitech devices" if EXPERT
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 55841bd..81b3bb6 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -1798,6 +1798,8 @@ static const struct hid_device_id hid_have_special_driver[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) },
#if IS_ENABLED(CONFIG_HID_LENOVO)
{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPKBD) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_CUSBKBD) },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_CBTKBD) },
#endif
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) },
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) },
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 6d00bb9..d2e2a96 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -560,6 +560,8 @@
#define USB_VENDOR_ID_LENOVO 0x17ef
#define USB_DEVICE_ID_LENOVO_TPKBD 0x6009
+#define USB_DEVICE_ID_LENOVO_CUSBKBD 0x6047
+#define USB_DEVICE_ID_LENOVO_CBTKBD 0x6048
#define USB_VENDOR_ID_LG 0x1fd2
#define USB_DEVICE_ID_LG_MULTITOUCH 0x0064
diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
index 6d55939..eb5493e 100644
--- a/drivers/hid/hid-lenovo.c
+++ b/drivers/hid/hid-lenovo.c
@@ -1,8 +1,11 @@
/*
* HID driver for Lenovo:
* - ThinkPad USB Keyboard with TrackPoint (tpkbd)
+ * - ThinkPad Compact Bluetooth Keyboard with TrackPoint (cptkbd)
+ * - ThinkPad Compact USB Keyboard with TrackPoint (cptkbd)
*
* Copyright (c) 2012 Bernhard Seibold
+ * Copyright (c) 2014 Jamie Lentin <jm@lentin.co.uk>
*/
/*
@@ -33,6 +36,10 @@ struct lenovo_drvdata_tpkbd {
int press_speed;
};
+struct lenovo_drvdata_cptkbd {
+ bool fn_lock;
+};
+
#define map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
static int lenovo_input_mapping_tpkbd(struct hid_device *hdev,
@@ -48,6 +55,49 @@ static int lenovo_input_mapping_tpkbd(struct hid_device *hdev,
return 0;
}
+static int lenovo_input_mapping_cptkbd(struct hid_device *hdev,
+ struct hid_input *hi, struct hid_field *field,
+ struct hid_usage *usage, unsigned long **bit, int *max)
+{
+ /* HID_UP_LNVENDOR = USB, HID_UP_MSVENDOR = BT */
+ if ((usage->hid & HID_USAGE_PAGE) == HID_UP_MSVENDOR ||
+ (usage->hid & HID_USAGE_PAGE) == HID_UP_LNVENDOR) {
+ set_bit(EV_REP, hi->input->evbit);
+ switch (usage->hid & HID_USAGE) {
+ case 0x00f1: /* Fn-F4: Mic mute */
+ map_key_clear(KEY_MICMUTE);
+ return 1;
+ case 0x00f2: /* Fn-F5: Brightness down */
+ map_key_clear(KEY_BRIGHTNESSDOWN);
+ return 1;
+ case 0x00f3: /* Fn-F6: Brightness up */
+ map_key_clear(KEY_BRIGHTNESSUP);
+ return 1;
+ case 0x00f4: /* Fn-F7: External display (projector) */
+ map_key_clear(KEY_SWITCHVIDEOMODE);
+ return 1;
+ case 0x00f5: /* Fn-F8: Wireless */
+ map_key_clear(KEY_WLAN);
+ return 1;
+ case 0x00f6: /* Fn-F9: Control panel */
+ map_key_clear(KEY_CONFIG);
+ return 1;
+ case 0x00f8: /* Fn-F11: View open applications (3 boxes) */
+ map_key_clear(KEY_SCALE);
+ return 1;
+ case 0x00fa: /* Fn-Esc: Fn-lock toggle */
+ map_key_clear(KEY_FN_ESC);
+ return 1;
+ case 0x00fb: /* Fn-F12: Open My computer (6 boxes) USB-only */
+ /* NB: This mapping is invented in raw_event below */
+ map_key_clear(KEY_FILE);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
static int lenovo_input_mapping(struct hid_device *hdev,
struct hid_input *hi, struct hid_field *field,
struct hid_usage *usage, unsigned long **bit, int *max)
@@ -56,6 +106,10 @@ static int lenovo_input_mapping(struct hid_device *hdev,
case USB_DEVICE_ID_LENOVO_TPKBD:
return lenovo_input_mapping_tpkbd(hdev, hi, field,
usage, bit, max);
+ case USB_DEVICE_ID_LENOVO_CUSBKBD:
+ case USB_DEVICE_ID_LENOVO_CBTKBD:
+ return lenovo_input_mapping_cptkbd(hdev, hi, field,
+ usage, bit, max);
default:
return 0;
}
@@ -63,6 +117,103 @@ static int lenovo_input_mapping(struct hid_device *hdev,
#undef map_key_clear
+/* Send a config command to the keyboard */
+static int lenovo_send_cmd_cptkbd(struct hid_device *hdev,
+ unsigned char byte2, unsigned char byte3)
+{
+ int ret;
+ unsigned char buf[] = {0x18, byte2, byte3};
+
+ switch (hdev->product) {
+ case USB_DEVICE_ID_LENOVO_CUSBKBD:
+ ret = hid_hw_raw_request(hdev, 0x13, buf, sizeof(buf),
+ HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
+ break;
+ case USB_DEVICE_ID_LENOVO_CBTKBD:
+ ret = hid_hw_output_report(hdev, buf, sizeof(buf));
+ break;
+ default:
+ ret = -EINVAL;
+ break;
+ }
+
+ return ret < 0 ? ret : 0; /* BT returns 0, USB returns sizeof(buf) */
+}
+
+static void lenovo_features_set_cptkbd(struct hid_device *hdev)
+{
+ int ret;
+ struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
+
+ ret = lenovo_send_cmd_cptkbd(hdev, 0x05, cptkbd_data->fn_lock);
+ if (ret)
+ hid_err(hdev, "Fn-lock setting failed: %d\n", ret);
+}
+
+static ssize_t attr_fn_lock_show_cptkbd(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct hid_device *hdev = container_of(dev, struct hid_device, dev);
+ struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n", cptkbd_data->fn_lock);
+}
+
+static ssize_t attr_fn_lock_store_cptkbd(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf,
+ size_t count)
+{
+ struct hid_device *hdev = container_of(dev, struct hid_device, dev);
+ struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
+ int value;
+
+ if (kstrtoint(buf, 10, &value))
+ return -EINVAL;
+ if (value < 0 || value > 1)
+ return -EINVAL;
+
+ cptkbd_data->fn_lock = !!value;
+ lenovo_features_set_cptkbd(hdev);
+
+ return count;
+}
+
+static struct device_attribute dev_attr_fn_lock_cptkbd =
+ __ATTR(fn_lock, S_IWUSR | S_IRUGO,
+ attr_fn_lock_show_cptkbd,
+ attr_fn_lock_store_cptkbd);
+
+static struct attribute *lenovo_attributes_cptkbd[] = {
+ &dev_attr_fn_lock_cptkbd.attr,
+ NULL
+};
+
+static const struct attribute_group lenovo_attr_group_cptkbd = {
+ .attrs = lenovo_attributes_cptkbd,
+};
+
+static int lenovo_raw_event(struct hid_device *hdev,
+ struct hid_report *report, u8 *data, int size)
+{
+ /*
+ * Compact USB keyboard's Fn-F12 report holds down many other keys, and
+ * its own key is outside the usage page range. Remove extra
+ * keypresses and remap to inside usage page.
+ */
+ if (unlikely(hdev->product == USB_DEVICE_ID_LENOVO_CUSBKBD
+ && size == 3
+ && data[0] == 0x15
+ && data[1] == 0x94
+ && data[2] == 0x01)) {
+ data[1] = 0x0;
+ data[2] = 0x4;
+ }
+
+ return 0;
+}
+
static int lenovo_features_set_tpkbd(struct hid_device *hdev)
{
struct hid_report *report;
@@ -415,6 +566,46 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev)
return 0;
}
+static int lenovo_probe_cptkbd(struct hid_device *hdev)
+{
+ int ret;
+ struct lenovo_drvdata_cptkbd *cptkbd_data;
+
+ /* All the custom action happens on the USBMOUSE device for USB */
+ if (hdev->product == USB_DEVICE_ID_LENOVO_CUSBKBD
+ && hdev->type != HID_TYPE_USBMOUSE) {
+ hid_dbg(hdev, "Ignoring keyboard half of device\n");
+ return 0;
+ }
+
+ cptkbd_data = devm_kzalloc(&hdev->dev,
+ sizeof(*cptkbd_data),
+ GFP_KERNEL);
+ if (cptkbd_data == NULL) {
+ hid_err(hdev, "can't alloc keyboard descriptor\n");
+ return -ENOMEM;
+ }
+ hid_set_drvdata(hdev, cptkbd_data);
+
+ /*
+ * Tell the keyboard a driver understands it, and turn F7, F9, F11 into
+ * regular keys
+ */
+ ret = lenovo_send_cmd_cptkbd(hdev, 0x01, 0x03);
+ if (ret)
+ hid_warn(hdev, "Failed to switch F7/9/11 mode: %d\n", ret);
+
+ /* Turn Fn-Lock on by default */
+ cptkbd_data->fn_lock = true;
+ lenovo_features_set_cptkbd(hdev);
+
+ ret = sysfs_create_group(&hdev->dev.kobj, &lenovo_attr_group_cptkbd);
+ if (ret)
+ hid_warn(hdev, "Could not create sysfs group: %d\n", ret);
+
+ return 0;
+}
+
static int lenovo_probe(struct hid_device *hdev,
const struct hid_device_id *id)
{
@@ -436,6 +627,10 @@ static int lenovo_probe(struct hid_device *hdev,
case USB_DEVICE_ID_LENOVO_TPKBD:
ret = lenovo_probe_tpkbd(hdev);
break;
+ case USB_DEVICE_ID_LENOVO_CUSBKBD:
+ case USB_DEVICE_ID_LENOVO_CBTKBD:
+ ret = lenovo_probe_cptkbd(hdev);
+ break;
default:
ret = 0;
break;
@@ -470,12 +665,22 @@ static void lenovo_remove_tpkbd(struct hid_device *hdev)
hid_set_drvdata(hdev, NULL);
}
+static void lenovo_remove_cptkbd(struct hid_device *hdev)
+{
+ sysfs_remove_group(&hdev->dev.kobj,
+ &lenovo_attr_group_cptkbd);
+}
+
static void lenovo_remove(struct hid_device *hdev)
{
switch (hdev->product) {
case USB_DEVICE_ID_LENOVO_TPKBD:
lenovo_remove_tpkbd(hdev);
break;
+ case USB_DEVICE_ID_LENOVO_CUSBKBD:
+ case USB_DEVICE_ID_LENOVO_CBTKBD:
+ lenovo_remove_cptkbd(hdev);
+ break;
}
hid_hw_stop(hdev);
@@ -483,6 +688,8 @@ static void lenovo_remove(struct hid_device *hdev)
static const struct hid_device_id lenovo_devices[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPKBD) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_CUSBKBD) },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_CBTKBD) },
{ }
};
@@ -494,6 +701,7 @@ static struct hid_driver lenovo_driver = {
.input_mapping = lenovo_input_mapping,
.probe = lenovo_probe,
.remove = lenovo_remove,
+ .raw_event = lenovo_raw_event,
};
module_hid_driver(lenovo_driver);
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 77632cf..fca74f1 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -167,6 +167,7 @@ struct hid_item {
#define HID_UP_MSVENDOR 0xff000000
#define HID_UP_CUSTOM 0x00ff0000
#define HID_UP_LOGIVENDOR 0xffbc0000
+#define HID_UP_LNVENDOR 0xffa00000
#define HID_UP_SENSOR 0x00200000
#define HID_USAGE 0x0000ffff
================================================
FILE: kernel-patch/1001-HID-lenovo-Move-USB-KEY_FILE-to-0x00f9-to-prevent-sc.patch
================================================
From 40d0b99beb52e25a444b914e4986f6c33a43fee8 Mon Sep 17 00:00:00 2001
From: Jamie Lentin <jm@lentin.co.uk>
Date: Mon, 3 Nov 2014 22:14:38 +0000
Subject: [PATCH 1/2] HID: lenovo: Move USB KEY_FILE to 0x00f9 to prevent
scancode clash
The bluetooth keyboard also generates 0x00fa when the middle button is
pressed. Move the made-up report out of the way so we don't trigger
KEY_FILE when middle button is pressed
Signed-off-by: Jamie Lentin <jm@lentin.co.uk>
---
drivers/hid/hid-lenovo.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
index bf227f7..4716f1e 100644
--- a/drivers/hid/hid-lenovo.c
+++ b/drivers/hid/hid-lenovo.c
@@ -85,13 +85,13 @@ static int lenovo_input_mapping_cptkbd(struct hid_device *hdev,
case 0x00f8: /* Fn-F11: View open applications (3 boxes) */
map_key_clear(KEY_SCALE);
return 1;
- case 0x00fa: /* Fn-Esc: Fn-lock toggle */
- map_key_clear(KEY_FN_ESC);
- return 1;
- case 0x00fb: /* Fn-F12: Open My computer (6 boxes) USB-only */
+ case 0x00f9: /* Fn-F12: Open My computer (6 boxes) USB-only */
/* NB: This mapping is invented in raw_event below */
map_key_clear(KEY_FILE);
return 1;
+ case 0x00fa: /* Fn-Esc: Fn-lock toggle */
+ map_key_clear(KEY_FN_ESC);
+ return 1;
}
}
@@ -207,8 +207,8 @@ static int lenovo_raw_event(struct hid_device *hdev,
&& data[0] == 0x15
&& data[1] == 0x94
&& data[2] == 0x01)) {
- data[1] = 0x0;
- data[2] = 0x4;
+ data[1] = 0x00;
+ data[2] = 0x01;
}
return 0;
--
2.1.0
================================================
FILE: kernel-patch/1002-HID-lenovo-Don-t-set-EV_REP-to-avoid-repeating-mice-.patch
================================================
From 941f424a0e0a370727f8aaaafc2e289aa6187c9d Mon Sep 17 00:00:00 2001
From: Jamie Lentin <jm@lentin.co.uk>
Date: Mon, 3 Nov 2014 22:18:59 +0000
Subject: [PATCH 2/2] HID: lenovo: Don't set EV_REP to avoid repeating mice
buttons
On the USB keyboard, the VENDOR hotkeys share the same device as the
mouse. Setting EV_REP also affects mouse buttons, so leave it off.
The bluetooth keyboard still has autorepeating mouse buttons, as it
only has one device and is set by the KEYBOARD pages.
Signed-off-by: Jamie Lentin <jm@lentin.co.uk>
---
drivers/hid/hid-lenovo.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
index 4716f1e..4c55f4d 100644
--- a/drivers/hid/hid-lenovo.c
+++ b/drivers/hid/hid-lenovo.c
@@ -62,7 +62,6 @@ static int lenovo_input_mapping_cptkbd(struct hid_device *hdev,
/* HID_UP_LNVENDOR = USB, HID_UP_MSVENDOR = BT */
if ((usage->hid & HID_USAGE_PAGE) == HID_UP_MSVENDOR ||
(usage->hid & HID_USAGE_PAGE) == HID_UP_LNVENDOR) {
- set_bit(EV_REP, hi->input->evbit);
switch (usage->hid & HID_USAGE) {
case 0x00f1: /* Fn-F4: Mic mute */
map_key_clear(KEY_MICMUTE);
--
2.1.0
================================================
FILE: kernel-patch/2001-HID-lenovo-Add-sensitivity-control-to-compact-keyboa.patch
================================================
From 5120cff1d8ebb1e8cc7d5dd1c2396f405ff23717 Mon Sep 17 00:00:00 2001
From: Jamie Lentin <jm@lentin.co.uk>
Date: Tue, 11 Nov 2014 22:18:31 +0000
Subject: [PATCH 1/2] HID: lenovo: Add sensitivity control to compact keyboards
The trackpoint sensitivity can also be controlled, expose this via
sysfs.
Signed-off-by: Jamie Lentin <jm@lentin.co.uk>
---
drivers/hid/hid-lenovo.c | 42 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 41 insertions(+), 1 deletion(-)
diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
index 4c55f4d..0f35a76 100644
--- a/drivers/hid/hid-lenovo.c
+++ b/drivers/hid/hid-lenovo.c
@@ -38,6 +38,7 @@ struct lenovo_drvdata_tpkbd {
struct lenovo_drvdata_cptkbd {
bool fn_lock;
+ int sensitivity;
};
#define map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
@@ -145,6 +146,7 @@ static void lenovo_features_set_cptkbd(struct hid_device *hdev)
struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
ret = lenovo_send_cmd_cptkbd(hdev, 0x05, cptkbd_data->fn_lock);
+ ret = lenovo_send_cmd_cptkbd(hdev, 0x02, cptkbd_data->sensitivity);
if (ret)
hid_err(hdev, "Fn-lock setting failed: %d\n", ret);
}
@@ -179,13 +181,50 @@ static ssize_t attr_fn_lock_store_cptkbd(struct device *dev,
return count;
}
+static ssize_t attr_sensitivity_show_cptkbd(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct hid_device *hdev = container_of(dev, struct hid_device, dev);
+ struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n",
+ cptkbd_data->sensitivity);
+}
+
+static ssize_t attr_sensitivity_store_cptkbd(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf,
+ size_t count)
+{
+ struct hid_device *hdev = container_of(dev, struct hid_device, dev);
+ struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
+ int value;
+
+ if (kstrtoint(buf, 10, &value) || value < 1 || value > 255)
+ return -EINVAL;
+
+ cptkbd_data->sensitivity = value;
+ lenovo_features_set_cptkbd(hdev);
+
+ return count;
+}
+
+
static struct device_attribute dev_attr_fn_lock_cptkbd =
__ATTR(fn_lock, S_IWUSR | S_IRUGO,
attr_fn_lock_show_cptkbd,
attr_fn_lock_store_cptkbd);
+static struct device_attribute dev_attr_sensitivity_cptkbd =
+ __ATTR(sensitivity, S_IWUSR | S_IRUGO,
+ attr_sensitivity_show_cptkbd,
+ attr_sensitivity_store_cptkbd);
+
+
static struct attribute *lenovo_attributes_cptkbd[] = {
&dev_attr_fn_lock_cptkbd.attr,
+ &dev_attr_sensitivity_cptkbd.attr,
NULL
};
@@ -594,8 +633,9 @@ static int lenovo_probe_cptkbd(struct hid_device *hdev)
if (ret)
hid_warn(hdev, "Failed to switch F7/9/11 mode: %d\n", ret);
- /* Turn Fn-Lock on by default */
+ /* Set keyboard settings to known state */
cptkbd_data->fn_lock = true;
+ cptkbd_data->sensitivity = 0x05;
lenovo_features_set_cptkbd(hdev);
ret = sysfs_create_group(&hdev->dev.kobj, &lenovo_attr_group_cptkbd);
--
2.1.3
================================================
FILE: kernel-patch/2002-HID-lenovo-Use-native-middle-button-mode-for-compact.patch
================================================
From 6550fd74d659e44b8711534eea67fd8868d81a3b Mon Sep 17 00:00:00 2001
From: Jamie Lentin <jm@lentin.co.uk>
Date: Sun, 14 Dec 2014 12:53:00 +0000
Subject: [PATCH 2/2] HID: lenovo: Use native middle-button mode for compact
keyboards
By default the middle button is in a compatibility mode, and generates
standard wheel events when dragging with the middle trackpoint button.
Unfortunately this is buggy:
* The middle button comes up before starting wheel events, causing a middle
click on whatever the mouse cursor was sitting on
* The USB keyboard always generates the "native" horizontal wheel event,
regardless of mode.
Instead, enable the "native" mode the Windows driver uses, and add support
for the custom events this generates. This fixes the USB keyboard wheel
events, and the middle-click up event comes after the wheel events.
Signed-off-by: Jamie Lentin <jm@lentin.co.uk>
---
drivers/hid/hid-lenovo.c | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
index 0f35a76..c4c3f09 100644
--- a/drivers/hid/hid-lenovo.c
+++ b/drivers/hid/hid-lenovo.c
@@ -92,6 +92,38 @@ static int lenovo_input_mapping_cptkbd(struct hid_device *hdev,
case 0x00fa: /* Fn-Esc: Fn-lock toggle */
map_key_clear(KEY_FN_ESC);
return 1;
+ case 0x00fb: /* Middle mouse button (in native mode) */
+ map_key_clear(BTN_MIDDLE);
+ return 1;
+ }
+ }
+
+ /* Compatibility middle/wheel mappings should be ignored */
+ if (usage->hid == HID_GD_WHEEL)
+ return -1;
+ if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON &&
+ (usage->hid & HID_USAGE) == 0x003)
+ return -1;
+ if ((usage->hid & HID_USAGE_PAGE) == HID_UP_CONSUMER &&
+ (usage->hid & HID_USAGE) == 0x238)
+ return -1;
+
+ /* Map wheel emulation reports: 0xffa1 = USB, 0xff10 = BT */
+ if ((usage->hid & HID_USAGE_PAGE) == 0xff100000 ||
+ (usage->hid & HID_USAGE_PAGE) == 0xffa10000) {
+ field->flags |= HID_MAIN_ITEM_RELATIVE | HID_MAIN_ITEM_VARIABLE;
+ field->logical_minimum = -127;
+ field->logical_maximum = 127;
+
+ switch (usage->hid & HID_USAGE) {
+ case 0x0000:
+ hid_map_usage(hi, usage, bit, max, EV_REL, 0x06);
+ return 1;
+ case 0x0001:
+ hid_map_usage(hi, usage, bit, max, EV_REL, 0x08);
+ return 1;
+ default:
+ return -1;
}
}
@@ -633,6 +665,11 @@ static int lenovo_probe_cptkbd(struct hid_device *hdev)
if (ret)
hid_warn(hdev, "Failed to switch F7/9/11 mode: %d\n", ret);
+ /* Switch middle button to native mode */
+ ret = lenovo_send_cmd_cptkbd(hdev, 0x09, 0x01);
+ if (ret)
+ hid_warn(hdev, "Failed to switch middle button: %d\n", ret);
+
/* Set keyboard settings to known state */
cptkbd_data->fn_lock = true;
cptkbd_data->sensitivity = 0x05;
--
2.1.3
================================================
FILE: kernel-patch/3001-HID-lenovo-Use-constants-for-axes-names.patch
================================================
From 2decbccdcfcfe19b35ed7424881d57213bfc5a17 Mon Sep 17 00:00:00 2001
From: Jamie Lentin <jm@lentin.co.uk>
Date: Sun, 2 Aug 2015 10:45:39 +0100
Subject: [PATCH 1/3] HID: lenovo: Use constants for axes names
Signed-off-by: Jamie Lentin <jm@lentin.co.uk>
---
drivers/hid/hid-lenovo.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
index c4c3f09..65df414 100644
--- a/drivers/hid/hid-lenovo.c
+++ b/drivers/hid/hid-lenovo.c
@@ -117,10 +117,10 @@ static int lenovo_input_mapping_cptkbd(struct hid_device *hdev,
switch (usage->hid & HID_USAGE) {
case 0x0000:
- hid_map_usage(hi, usage, bit, max, EV_REL, 0x06);
+ hid_map_usage(hi, usage, bit, max, EV_REL, REL_HWHEEL);
return 1;
case 0x0001:
- hid_map_usage(hi, usage, bit, max, EV_REL, 0x08);
+ hid_map_usage(hi, usage, bit, max, EV_REL, REL_WHEEL);
return 1;
default:
return -1;
--
2.1.4
================================================
FILE: kernel-patch/3002-HID-lenovo-Add-missing-return-value-check.patch
================================================
From 543e190688a51d947a024c011a09dbc6ed23a62b Mon Sep 17 00:00:00 2001
From: Jamie Lentin <jm@lentin.co.uk>
Date: Sun, 2 Aug 2015 10:46:10 +0100
Subject: [PATCH 2/3] HID: lenovo: Add missing return-value check
Signed-off-by: Jamie Lentin <jm@lentin.co.uk>
---
drivers/hid/hid-lenovo.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
index 65df414..265bfe2 100644
--- a/drivers/hid/hid-lenovo.c
+++ b/drivers/hid/hid-lenovo.c
@@ -178,9 +178,12 @@ static void lenovo_features_set_cptkbd(struct hid_device *hdev)
struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
ret = lenovo_send_cmd_cptkbd(hdev, 0x05, cptkbd_data->fn_lock);
- ret = lenovo_send_cmd_cptkbd(hdev, 0x02, cptkbd_data->sensitivity);
if (ret)
hid_err(hdev, "Fn-lock setting failed: %d\n", ret);
+
+ ret = lenovo_send_cmd_cptkbd(hdev, 0x02, cptkbd_data->sensitivity);
+ if (ret)
+ hid_err(hdev, "Sensitivity setting failed: %d\n", ret);
}
static ssize_t attr_fn_lock_show_cptkbd(struct device *dev,
--
2.1.4
================================================
FILE: kernel-patch/3003-HID-lenovo-Hide-middle-button-press-until-release.patch
================================================
From 9a8c4f2d805fbc4589ab238e7f04cd1a34f5b922 Mon Sep 17 00:00:00 2001
From: Jamie Lentin <jm@lentin.co.uk>
Date: Sun, 2 Aug 2015 10:49:30 +0100
Subject: [PATCH 3/3] HID: lenovo: Hide middle-button press until release
Don't relay a middle button press to userspace until release, and then
only if there was no scroll events inbetween. This is closer to what
Xorg's wheel emulation does, and avoids spurious middle-click pastes.
Signed-off-by: Jamie Lentin <jm@lentin.co.uk>
---
drivers/hid/hid-lenovo.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
index 265bfe2..629d988 100644
--- a/drivers/hid/hid-lenovo.c
+++ b/drivers/hid/hid-lenovo.c
@@ -37,6 +37,7 @@ struct lenovo_drvdata_tpkbd {
};
struct lenovo_drvdata_cptkbd {
+ u8 middlebutton_state; /* 0:Up, 1:Down (undecided), 2:Scrolling */
bool fn_lock;
int sensitivity;
};
@@ -287,6 +288,53 @@ static int lenovo_raw_event(struct hid_device *hdev,
return 0;
}
+static int lenovo_event_cptkbd(struct hid_device *hdev,
+ struct hid_field *field, struct hid_usage *usage, __s32 value)
+{
+ struct lenovo_drvdata_cptkbd *cptkbd_data = hid_get_drvdata(hdev);
+
+ /* "wheel" scroll events */
+ if (usage->type == EV_REL && (usage->code == REL_WHEEL ||
+ usage->code == REL_HWHEEL)) {
+ /* Scroll events disable middle-click event */
+ cptkbd_data->middlebutton_state = 2;
+ return 0;
+ }
+
+ /* Middle click events */
+ if (usage->type == EV_KEY && usage->code == BTN_MIDDLE) {
+ if (value == 1) {
+ cptkbd_data->middlebutton_state = 1;
+ } else if (value == 0) {
+ if (cptkbd_data->middlebutton_state == 1) {
+ /* No scrolling inbetween, send middle-click */
+ input_event(field->hidinput->input,
+ EV_KEY, BTN_MIDDLE, 1);
+ input_sync(field->hidinput->input);
+ input_event(field->hidinput->input,
+ EV_KEY, BTN_MIDDLE, 0);
+ input_sync(field->hidinput->input);
+ }
+ cptkbd_data->middlebutton_state = 0;
+ }
+ return 1;
+ }
+
+ return 0;
+}
+
+static int lenovo_event(struct hid_device *hdev, struct hid_field *field,
+ struct hid_usage *usage, __s32 value)
+{
+ switch (hdev->product) {
+ case USB_DEVICE_ID_LENOVO_CUSBKBD:
+ case USB_DEVICE_ID_LENOVO_CBTKBD:
+ return lenovo_event_cptkbd(hdev, field, usage, value);
+ default:
+ return 0;
+ }
+}
+
static int lenovo_features_set_tpkbd(struct hid_device *hdev)
{
struct hid_report *report;
@@ -674,6 +722,7 @@ static int lenovo_probe_cptkbd(struct hid_device *hdev)
hid_warn(hdev, "Failed to switch middle button: %d\n", ret);
/* Set keyboard settings to known state */
+ cptkbd_data->middlebutton_state = 0;
cptkbd_data->fn_lock = true;
cptkbd_data->sensitivity = 0x05;
lenovo_features_set_cptkbd(hdev);
@@ -781,6 +830,7 @@ static struct hid_driver lenovo_driver = {
.probe = lenovo_probe,
.remove = lenovo_remove,
.raw_event = lenovo_raw_event,
+ .event = lenovo_event,
};
module_hid_driver(lenovo_driver);
--
2.1.4
================================================
FILE: tp-compact-bt-keyboard/README.md
================================================
# ThinkPad Compact Bluetooth Keyboard with TrackPoint
[Images of BT keyboard internals](http://bdm.cc/2016/06/lenovo-bluetooth-keyboard-repairs/)
* **HID Name:** ThinkPad Compact Bluetooth Keyboard with TrackPoint
* **Model:** KT-1255
* **Fru P/N:** 03X8713
* **Vendor ID:** 0x17ef
* **Product ID:** 0x6048
The Lenovo Thinkpad Compact Keyboard with TrackPoint is a repackaging
of a Thinkpad laptop keyboard into a stand-alone case with a Bluetooth
connection to the computer. Following the current fashion, Lenovo has made the
top row of keys serve two purposes, using them for both the traditional Fn keys
and for "hotkeys" intended to control various functions such as volume and
screen brightness.
Pressing FnLk (Fn+Esc) switches these keys between generating Fn
keypresses and hotkey keypresses, but unlike laptop keyboards this mode change
is handled not by the keyboard itself but by Lenovo's keyboard driver for
Windows.
## Pairing the Keyboard
The Bluetooth keyboard uses [BT 2.1 Simple Secure Pairing](https://en.wikipedia.org/wiki/Bluetooth#Pairing_mechanisms) (SSP),
which should be supported by modern Linux distributions. Several different utilities can be used to pair the keyboard.
If your distribution does not support SSP, or if you have problems pairing with SSP, you can try disabling it with ``hciconfig hci0 sspmode 0``. [See this note on a Logitech keyboard](https://wiki.archlinux.org/index.php/Bluetooth#Logitech_keyboard_does_not_pair).
### bluetoothctl
Pairing can be done with the ``pair`` command. You should be prompted for the PIN code to type
as part of the process.
See: https://wiki.archlinux.org/index.php/Bluetooth_keyboard#Pairing_process
### bluetooth-wizard
Select the device (keyboard) and click "Continue". Watch for the PIN code in
the hcidump window and enter that.
See: https://bugzilla.redhat.com/show_bug.cgi?id=1019287#c3
### bluez-test-*
Versions of Bluez that ship with these scripts don't support SSP and thus don't report
the PIN code the keyboard requires you to use.
To get around this, run the following in a separate console before you start
pairing:
sudo hcidump -at | grep -i passkey -A1
During the pairing process, you are looking out for lines like:
> HCI Event: User Passkey Notification (0x3b) plen 10
bdaddr 90:7F:61:01:02:03 passkey 123456
In this case, ``123456`` is the PIN you need to enter.
Put the keyboard into discoverable mode by holding down the power button until
the light starts flashing. Then use ``hcitool scan`` to find out what the
address of your keyboard is. It should resemble ``90:7F:61:01:02:03``.
Firstly, create the device:
bluez-test-device create 90:7F:61:01:02:03
Then start trying to pair:
bluez-simple-agent hci0 90:7F:61:01:02:03
You should see the passkey appear in the hcidump window. Type that passkey at
the prompt (using a keyboard already connected to your computer) and press
enter. You should now be paired. Finally:
bluez-test-device trusted 90:7F:61:01:02:03 1
bluez-test-input connect 90:7F:61:01:02:03
## Toggling FnLk
### Linux
Linux kernels 3.17 and above have support for toggling Fn-Lock in the
[hid-lenovo](https://elixir.bootlin.com/linux/latest/source/drivers/hid/hid-lenovo.c)
module. This means all keys should work out the box, and you can control
whether fn_lock is enabled by:
echo 0 > /sys/bus/hid/devices/*17EF\:604*/fn_lock
The kernel can't currently switch fn_lock automatically for you, however you
can use [esekeyd](https://github.com/burghardt/esekeyd) to map
KEY_FN_ESC to a script such as:
{ grep -q 1 /sys/bus/hid/devices/*17EF\:604*/fn_lock && echo 0 || echo 1; } \
> /sys/bus/hid/devices/*17EF\:604*/fn_lock
...to toggle it.
### Disable FnLk by default
Linux assumes you want Fn keys to act as Fn keys and Enables Fn-Lock, however
you may want the opposite.
Thinkpad TrackPoint Keyboard II is in Linux kernel 5.19 and greater.
If so create a udev rule with the following command:
#Creates udev rules file
cat <<'EOF' > /etc/udev/rules.d/99-thinkpad-trackpoint-disable-fn-lock.rules
#ThinkPad TrackPoint Keyboard I & II USB
SUBSYSTEM=="hid", \
DRIVER=="lenovo", \
ATTRS{idVendor}=="17ef", ATTRS{idProduct}=="6047|60ee", \
ATTR{fn_lock}="0"
#ThinkPad TrackPoint Keyboard I & II Bluetooth
SUBSYSTEM=="input", \
ATTRS{id/vendor}=="17ef", ATTRS{id/product}=="6048|60e1", \
RUN+="/bin/sh -c 'sleep 0.1; FILE=\"/sys/$devpath/device/fn_lock\"; [ -e \"$FILE\" ] && echo 0 > \"$FILE\"'"
EOF
#Run commands to reload udev
udevadm control --reload-rules && udevadm trigger
### Apple OS X (MacOS)
[tpkb](https://github.com/unknownzerx/tpkb) is a Mac userland tool
similar to ``tp-compact-keyboard``. It uses the cross-platform hidapi
library.
## Replacement trackpoint caps
The keyboards use the "ThinkPad Low Profile TrackPoint Caps" (FRU 0A33908 for a 10-pack) by default. The original-size will fit also, but stick out more. This is fine for the cat-tongue, but with the others your finger can catch the edge.
## Disassembling the Keyboard
The upper part of the keyboard case is just clipped on; run something
around the seam on the underside of the keyboard to release it. The
keyboard itself is fastened to the lower part of the case with
double-sided tape. Very gentle persuasion (probably some heat too)
removes it.
The keyboard itself looks like it comes out of a Thinkpad, with metal plates stuck
to it to add heft. The keyboard connects to a controller board in the top right.
## Repairing the Trackpoint
Some users of the Bluetooth keyboard have found that the TrackPoint stops
working whilst the rest of the keyboard is fine. This isn't a software issue;
apparently the chip that controls the TrackPoint isn't correctly soldered down.
See: http://bdm.cc/2016/06/lenovo-bluetooth-keyboard-repairs/
## Old userland utility
The linux kernel can now control this directly, the below is of historical interest only.
``tp-compact-keyboard`` is a small utility
to control some features of the keyboard, most
importantly to enable FnLk. It works only with the Bluetooth keyboard,
whilst the USB keyboard accepts the same commands but not in the same way,
one has to tweak the hidraw ioctls which (AFAIK) can't be done in a Bash script.
#### Requirements
This was developed under a Debian unstable kernel, 3.12-1-amd64, and has been
reported to work on kernels as early as 3.10 (CentOS 7). However older kernels (3.6, for example)
don't send the report; I'm not currently sure why.
#### Using
To enable or disable FnLk on all connected ThinkPad Bluetooth
keyboards, run ``./tp-compact-keyboard --fn-lock-enable`` or
``./tp-compact-keyboard --fn-lock-disable``. The program has a few
other functions as well, but they're not very useful on their own.
Have a look at the source.
#### Other options
There are a few other options, however they are mostly useless without a custom kernel
module handling the keyboard:
--sensitivity xx
Set sensitivity of TrackPoint. xx is hex value 01--09 (although values
up to FF work).
--native-fn-enable
By default, F7/F9/F11 generate a string of keypresses that might be
useful under Windows. This stops this, and instead only generates
custom events.
--native-mouse-enable
The middle button generates 2 events by default, but Linux only
understands one of them. This disables the event that Linux does
understand, leaving you with no middle button.
--native-mouse-disable
Restore middle button to a working state.
Pair/unpair isn't enough to reset the keyboard, you need to power down the
keyboard to get it back to it's original state.
#### How the commands were found
I worked out the custom commands by sniffing what the Windows driver did.
First I set up a Windows XP virtual machine in KVM/QEMU and installed the drivers. Then I
disconnected the keyboard from my computer and ensured that the user running
QEMU could write to the ``/dev/bus/usb`` node associated with my Bluetooth
dongle.
Wireshark was readied for capture:
# modprobe usbmon
# wireshark
Then, I let Windows use the Bluetooth dongle:
(qemu) usb_add host:0a5c:217f
If you capture the whole association process then you should be able to view
HID packets to/from the keyboard (filter for ``bthid``). The particuarly
interesting ones here are the ones going to the keyboard.
================================================
FILE: tp-compact-bt-keyboard/tp-compact-keyboard
================================================
#!/bin/sh
if [ "$1" = "--help" ]; then
cat <<EOF
Usage: tp-compact-keyboard [OPTION...]
--help
Print this help output.
--fn-lock-disable
Disable "fn key lock". The the function keys will send media function
keycodes (such as mute audio).
--fn-lock-enable
Enable "fn key lock". The function keys will send the F keycodes (IE F1,
F2, etc).
--native-fn-enable
By default, F7/F9/F11 generate a string of keypresses that might be
useful under windows. This stops this, and instead only generates
custom events.
--native-mouse-enable
The middle button generates 2 events by default, but Linux only
understands one of them. This disables the event that Linux does
understand, leaving you with no middle button.
--native-mouse-disable
Restore middle button to a working state.
--sensitivity xx
Set sensitivity of trackpoint. xx is hex value 01--09 (although values
up to FF work).
EOF
exit 0
fi
# Find the bluetooth keyboard
HID_NAME="ThinkPad Compact Bluetooth Keyboard with TrackPoint"
HIDRAWS=$(grep -l "HID_NAME=$HID_NAME" /sys/class/hidraw/hidraw*/device/uevent | grep -oE 'hidraw[0-9]+')
if [ -z "$HIDRAWS" ]; then
echo "No keyboard found!"
exit 1
fi
# Do command for all keyboards attached
for HIDRAW in $HIDRAWS; do
if [ ! -w "/dev/$HIDRAW" ]; then
echo "Permission denied: cannot write to /dev/$HIDRAW (are you root?)"
exit 1
fi
if [ "$1" = "--fn-lock-disable" ]; then
echo Disabling Fn lock for /dev/$HIDRAW...
/bin/echo -ne "\x18\x05\x00" | dd of=/dev/$HIDRAW 2>/dev/null
elif [ "$1" = "--fn-lock-enable" ]; then
echo Enabling Fn lock for /dev/$HIDRAW...
/bin/echo -ne "\x18\x05\x01" | dd of=/dev/$HIDRAW 2>/dev/null
elif [ "$1" = "--native-fn-enable" ]; then
echo Enabling native mode for F7/F9/F11 for /dev/$HIDRAW...
/bin/echo -ne "\x18\x01\x03" | dd of=/dev/$HIDRAW 2>/dev/null
elif [ "$1" = "--native-mouse-disable" ]; then
echo Disabling native mode for middle button for /dev/$HIDRAW...
/bin/echo -ne "\x18\x09\x00" | dd of=/dev/$HIDRAW 2>/dev/null
elif [ "$1" = "--native-mouse-enable" ]; then
echo Enabling native mode for middle button for /dev/$HIDRAW...
/bin/echo -ne "\x18\x09\x01" | dd of=/dev/$HIDRAW 2>/dev/null
elif [ "$1" = "--sensitivity" ]; then
echo Setting sensitivity for /dev/$HIDRAW to $2...
/bin/echo -ne "\x18\x02\x$2" | dd of=/dev/$HIDRAW 2>/dev/null
else
echo "No actions specified. Run --help to see possible actions."
fi
done
# All HID DATA packets sent to keyboard on startup
# 18 01 03 - Make F7/F9/F11 return custom single events, as opposed to strings of keys
# 18 05 01 - Enable fn-lock
# 18 02 05 - Sensitivity, 01--09 in windows, 00--FF works
# 18 09 01 - Disable middle mouse button's standard response (leave custom one working)
================================================
FILE: tp-compact-usb-keyboard/Makefile
================================================
# kbuild trick to avoid linker error. Can be omitted if a module is built.
obj- := dummy.o
all: tp-compact-usb-keyboard
# List of programs to build
hostprogs-y := tp-compact-usb-keyboard
# Tell kbuild to always build the programs
always := $(hostprogs-y)
HOSTCFLAGS_hid-example.o += -I$(objtree)/usr/include
================================================
FILE: tp-compact-usb-keyboard/README.md
================================================
# ThinkPad Compact USB Keyboard with TrackPoint
[Images of USB keyboard internals](tp-compact-usb-keyboard/)
* **HID Name:** Lenovo ThinkPad Compact Keyboard with TrackPoint
* **Model:** KU-1255
* **Fru P/N:** 03X8746
* **Vendor ID:** 0x17ef
* **Product ID:** 0x6047
The Lenovo Thinkpad Compact Keyboard with TrackPoint is a repackaging of a
Thinkpad laptop keyboard into a stand-alone case with a cabled USB connection
to the computer. Following the current fashion, Lenovo has made the top row of
keys serve two purposes, using them for both the traditional Fn keys and for
"hotkeys" intended to control various functions such as volume and screen
brightness.
Pressing FnLk (Fn+Esc) switches these keys between generating Fn
keypresses and hotkey keypresses, but unlike laptop keyboards this mode change
is handled not by the keyboard itself but by Lenovo's keyboard driver for
Windows.
## Toggling FnLk
Same as [the bluetooth keyboard](../tp-compact-bt-keyboard/#toggling-fnlk)
## Replacement trackpoint caps
Same as [the bluetooth keyboard](../tp-compact-bt-keyboard/#replacement-trackpoint-caps)
## Disassembling the Keyboard
Same as [the bluetooth keyboard](../tp-compact-bt-keyboard/#disassembling-the-keyboard)
## Repairing the Trackpoint
Same as [the bluetooth keyboard](../tp-compact-bt-keyboard/#repairing-the-trackpoint)
## Old userland utility
The linux kernel can now control this directly, the below is of historical interest only.
The C utility in this directory demonstrates the commands understood by the
keyboard. It supports:
* [Thinkpad Compact USB keyboard with Trackpoint](https://www.google.com/search?tbm=isch&q=KU-1255) (KU-1255)
* [Lenovo Low Profile USB Keyboard](https://www.google.com/search?tbm=isch&q=LXH-JME2209U) (LXH-JME2209U)
Anything this tool can do is already handled by linux now, but the could be
used to add support to another operating system, for example.
To build, run ``make``.
### udev rule
To run ``tp-compact-usb-keyboard`` whenever a keyboard is inserted, you can use
udev rule similar to the following:
```
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="17ef", ATTRS{idProduct}=="6018", RUN+="/path/to/tp-compact-usb-keyboard %E{DEVNAME}"
```
================================================
FILE: tp-compact-usb-keyboard/tp-compact-usb-keyboard.c
================================================
/*
* Utility to play with Thinkpad compact USB keyboard
*
* Based on Hidraw Userspace Example
*
* Copyright (c) 2010 Alan Ott <alan@signal11.us>
* Copyright (c) 2010 Signal 11 Software
*
* The code may be used by anyone for any purpose,
* and can serve as a starting point for developing
* applications using hidraw.
*/
/* Linux */
#include <linux/types.h>
#include <linux/input.h>
#include <linux/hidraw.h>
/*
* Ugly hack to work around failing compilation on systems that don't
* yet populate new version of hidraw.h to userspace.
*/
#ifndef HIDIOCSFEATURE
#warning Please have your distro update the userspace kernel headers
#define HIDIOCSFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len)
#define HIDIOCGFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x07, len)
#endif
/* Unix */
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
/* C */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
void send_cmd(int fd, int arg1, int arg2)
{
int res;
char buf[3];
memset(buf, 0x0, sizeof(buf));
buf[0] = 0x13;
buf[1] = arg1;
buf[2] = arg2;
res = ioctl(fd, HIDIOCSFEATURE(3), buf);
if (res < 0)
perror("HIDIOCSFEATURE");
else if (res == 3)
printf("Sent command %02x %02x\n", arg1, arg2);
else
printf("ioctl HIDIOCSFEATURE returned: %d\n", res);
}
int main(int argc, char **argv)
{
int fd;
if (argc < 2) {
printf("Usage: tp-compact-usb-keyboard (hidraw device, e.g. /dev/hidraw1)\n");
return 1;
}
/* Open the Device with non-blocking reads. In real life,
don't use a hard coded path; use libudev instead. */
fd = open(argv[1], O_RDWR|O_NONBLOCK);
if (fd < 0) {
perror("Unable to open device");
return 1;
}
/* Same commands as bluetooth, except they start with 13
*
* 13 01 03 - Make F7/F9/F11 return custom single events, as opposed to strings of keys
* 13 02 05 - Sensitivity 01--09
* 13 05 01 - Enable fn-lock
* 13 05 00 - Disable fn-lock
* 13 09 01 - Disable middle mouse button's standard response (leave custom one working)
* 13 09 00 - Enable middle mouse button's standard response (leave custom one working)
* 13 02 01 -- 09 - Sensitivity control
*/
/* Enable Fn keys */
send_cmd(fd, 0x01, 0x03);
/* Enable native middle mouse mode */
send_cmd(fd, 0x09, 0x01);
/* Fn-lock enable */
send_cmd(fd, 0x05, 0x01);
}
================================================
FILE: tp-multi-connect/README.md
================================================
Thinkpad Multi-Connect Keyboard
===============================
There is also another physically-identical keyboard, the Thinkpad
*Multi-Connect* Keyboard, which allows you to toggle between 3 paired devices.
* **HID Name:** ThinkPad Multi Connect Bluetooth Keyboard with Trackpoint
* **Model:** KT-1525
* **P/N:** 4X30K12182
* **Fru P/N:** 03X7111
* **Vendor ID:** 0x17ef
* **Product ID:** 0x6083
* **MFG:** CEM 2019-04-02
It appears to be China-only, and only available through sites like AliExpress.
There are no drivers for any OS (iOS/Android or Windows), just a single-sheet
manual is available here:
http://webdoc.lenovo.com.cn/lenovowsi/new_cskb/att/147372/%E5%BF%AB%E9%80%9F%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.pdf
Unlike the Compact keyboards, the keyboard does not have (known) built-in
Fn-Lock functions, Fn, Fn-F1 and F1 are all separate scancodes, so they can be
remapped using a ``hwdb`` database.
Keyboard-supported key combinations:
* **Fn+Up/Down:** Trackpoint sensitivity
* **Fn+Delete:** Change paired device type (Windows/Android/iOS). Changes behaviour of some keys, e.g. Super.
There is no known way of performing Fn-Lock (even under windows), or changing middle-button behaviour. See: https://github.com/lentinj/tp-compact-keyboard/issues/48
================================================
FILE: tp-tablet2/README.md
================================================
Thinkpad Tablet 2 Keyboard
==========================
* [User guide](https://download.lenovo.com/ibmdl/pub/pc/pccbbs/mobiles_pdf/tablet2_bluetooth_keyboard_ug_en_0b40450.pdf)
* **HID Name:** ThinkPad Keyboard / ThinkPad Keyboard Mouse / ThinkPad Keyboard (3 HID endpoints)
* **Model:** EBK-209A
* **Fru P/N:** O4Y1511
* **Vendor ID:** 0x17ef
* **Product ID:** 0x603f
Older than the compact keyboards the above, it was sold with the Tablet 2 and has a fold-out stand
for said tablet.
It doesn't have a trackpoint, rather a Blackberry-esque tiny trackpad which you
use like a trackball.
Pairing
-------
Pairing is a bit temperamental, it helps to reset the keyboard.
* Enter pair mode: ``Fn``+``Delete``
* Full reset: Turn off keyboard, pull power switch pressing ``Esc``+``Delete`` until status LED blinks Amber.
* There is also a paperclip hole next to the charging LED that also factory resets
Dissassembly
------------
* Unclip the frame around the keyboard, the power slider just pokes the real button underneath.
* Undo the 4 screws holding the keyboard down (including the tri-wing screw with ground connection)
* Gently pry the keyboard from the metal backing plate it's glued to
* The keyboard ribbon cable loops around underneath the trackpoint buttons, don't pry there
* The trackpoint ribbon is underneath the trackpoint
* Do **not** pry the backing plate away from the bottom plastic, whilst some screws are visible and it looks like it will come off that way, there are more screws underneath the keyboard.
* Undo all the metal backing plate screws.
Drivers
-------
Drivers are listed [as part of the Thinkpad Tablet 2 page](https://pcsupport.lenovo.com/gb/en/products/tablets/thinkpad-tablet-series/thinkpad-tablet-2/downloads/driver-list), "ThinkPad Optical TrackPoint Driver for Windows 8.1 (32-bit), 8 (32-bit) - ThinkPad Tablet 2" & "Hotkey Features Integration for Windows 8.1 (32-bit, 64-bit) - ThinkPad". However, neither seem to do anything in a Windows 8 VM.
================================================
FILE: x1-tablet-keyboard/README.md
================================================
# X1 Tablet Thin Keyboard (gen1 / gen2)
A USB keyboard with a connector built-in to the hinge.

* **HID Name:** Lenovo ThinkPad X1 Tablet Thin Keyboard / Lenovo ThinkPad X1 Tablet Thin Keyboard Gen 2
* **Fru P/N:** 01AW626 (gen1) / 01AY129 (gen2)
* **Vendor ID:** 0x17ef
* **Product ID:** 0x6085 (gen1) / 0x60a3 (gen2)
## Adaptor for use as a normal USB keyboard
The PCB can attach over the tablet's mounting posts, connecting with the pogo pins, breaking these out ready for a USB cable to be attached.
The gerbers can be found in [Gerber_tp-x1t-gen1-adapter.zip](https://github.com/lentinj/tp-compact-keyboard/raw/master/x1-tablet-keyboard/Gerber_tp-x1t-gen1-adapter.zip), which can be uploaded to JLPCB to manufacture more.
Magnets can be superglued to the PCB to hold it on, I used 8mm diameter magnets off Amazon. Hold the PCB in place on the keyboard, and they will naturally find the corresponding magnet in the connector.
Then, solder a USB cable to the pins. The colour scheme *should* (but may not) be:
* GND: Black
* DN: White
* DP: Green
* 5v: Red
This is my first attempt at designing a PCB, and it probably shows.
* The holes are fractionally too tight, and need a slight amount of filing to fit
* The hole closest to 5v should be ~1mm closer to the 5v pin, again, filing solves this
You could extend this further by designing a USB socket onto the PCB, but what I've got is fine for me at this stage.
### Other adaptors
This isn't the first attempt at attaching a regular USB cable to a X1 tablet, however IMO this is the quickest to replicate.
* https://www.reddit.com/r/thinkpad/comments/10klmxv/pinout_of_thinkpad_x1_tablet_gen1_keyboard/?rdt=51762
* https://www.reddit.com/r/thinkpad/comments/10gneh1/diy_a_usb_thinkpad_keyboard_with_backlit_and/
* https://spawn.link/posts/2019-02-18_-_lenovo_x1_tablet_keyboard/
## Slow trackpoint on gen2 keyboards
The trackpoint sensitivity for gen2 keyboards is currently far lower than libinput sensivity can adjust. The reason behind this libinput doesn't know it's a trackpoint. This can be worked around with the following in ``/etc/udev/hwdb.d/90-thinkpad-x1-tablet-keyboard.hwdb``:
```
# Lenovo "PRIMAX ThinkPad X1 Tablet Thin Keyboard Gen 2"
id-input:modalias:input:b0003v17EFp60A3e0111-e0,1,2,4,*
ID_INPUT_POINTINGSTICK=1
```
This isn't a problem for gen1, since the hid-rmi driver it uses exposes a full PS/2 port which the trackpoint driver attaches to. In gen2, hid-multitouch receives a combined HID report, with both trackpad & touchpoint events.
The real solution is probably to register all mice applications as trackpoints [in hid-multitouch](https://github.com/torvalds/linux/blob/de2f378f2b771b39594c04695feee86476743a69/drivers/hid/hid-multitouch.c#L1653) (aside: This says hid core will add a prefix, but it won't because [that needs HID_QUIRK_INPUT_PER_APP](https://github.com/torvalds/linux/blob/de2f378f2b771b39594c04695feee86476743a69/drivers/hid/hid-input.c#L2006), which MT_CLS_WIN_8_FORCE_MULTI_INPUT turns off). Generally, [this quirk is used to register trackpoint devices](https://github.com/torvalds/linux/commit/4a6a4c966ccf38b2d74c05bb7c7dd3b94dbb3c30)
================================================
FILE: x1-tablet-keyboard/tp-x1t-gen1-adapter.dxf
================================================
0
SECTION
2
HEADER
9
$ACADVER
1
AC1021
9
$ACADMAINTVER
70
50
9
$DWGCODEPAGE
3
ANSI_936
9
$LASTSAVEDBY
1
win10
9
$INSBASE
10
0.0
20
0.0
30
0.0
9
$EXTMIN
10
-3.083330976318947
20
-68.55251785135624
30
0.0
9
$EXTMAX
10
243.0101934157901
20
119.8244141966261
30
0.0
9
$LIMMIN
10
0.0
20
0.0
9
$LIMMAX
10
420.0
20
297.0
9
$ORTHOMODE
70
0
9
$REGENMODE
70
1
9
$FILLMODE
70
1
9
$QTEXTMODE
70
0
9
$MIRRTEXT
70
0
9
$LTSCALE
40
1.0
9
$ATTMODE
70
1
9
$TEXTSIZE
40
2.5
9
$TRACEWID
40
1.0
9
$TEXTSTYLE
7
Standard
9
$CLAYER
8
0
9
$CELTYPE
6
ByLayer
9
$CECOLOR
62
256
9
$CELTSCALE
40
1.0
9
$DISPSILH
70
0
9
$DIMSCALE
40
1.0
9
$DIMASZ
40
2.5
9
$DIMEXO
40
0.625
9
$DIMDLI
40
3.75
9
$DIMRND
40
0.0
9
$DIMDLE
40
0.0
9
$DIMEXE
40
1.25
9
$DIMTP
40
0.0
9
$DIMTM
40
0.0
9
$DIMTXT
40
2.5
9
$DIMCEN
40
2.5
9
$DIMTSZ
40
0.0
9
$DIMTOL
70
0
9
$DIMLIM
70
0
9
$DIMTIH
70
0
9
$DIMTOH
70
0
9
$DIMSE1
70
0
9
$DIMSE2
70
0
9
$DIMTAD
70
1
9
$DIMZIN
70
8
9
$DIMBLK
1
9
$DIMASO
70
1
9
$DIMSHO
70
1
9
$DIMPOST
1
9
$DIMAPOST
1
9
$DIMALT
70
0
9
$DIMALTD
70
3
9
$DIMALTF
40
0.03937007874016
9
$DIMLFAC
40
1.0
9
$DIMTOFL
70
1
9
$DIMTVP
40
0.0
9
$DIMTIX
70
0
9
$DIMSOXD
70
0
9
$DIMSAH
70
0
9
$DIMBLK1
1
9
$DIMBLK2
1
9
$DIMSTYLE
2
ISO-25
9
$DIMCLRD
70
0
9
$DIMCLRE
70
0
9
$DIMCLRT
70
0
9
$DIMTFAC
40
1.0
9
$DIMGAP
40
0.625
9
$DIMJUST
70
0
9
$DIMSD1
70
0
9
$DIMSD2
70
0
9
$DIMTOLJ
70
0
9
$DIMTZIN
70
8
9
$DIMALTZ
70
0
9
$DIMALTTZ
70
0
9
$DIMUPT
70
0
9
$DIMDEC
70
2
9
$DIMTDEC
70
2
9
$DIMALTU
70
2
9
$DIMALTTD
70
3
9
$DIMTXSTY
7
Standard
9
$DIMAUNIT
70
0
9
$DIMADEC
70
0
9
$DIMALTRND
40
0.0
9
$DIMAZIN
70
0
9
$DIMDSEP
70
44
9
$DIMATFIT
70
3
9
$DIMFRAC
70
0
9
$DIMLDRBLK
1
9
$DIMLUNIT
70
2
9
$DIMLWD
70
-2
9
$DIMLWE
70
-2
9
$DIMTMOVE
70
0
9
$DIMFXL
40
1.0
9
$DIMFXLON
70
0
9
$DIMJOGANG
40
0.7853981633974483
9
$DIMTFILL
70
0
9
$DIMTFILLCLR
70
0
9
$DIMARCSYM
70
0
9
$DIMLTYPE
6
9
$DIMLTEX1
6
9
$DIMLTEX2
6
9
$LUNITS
70
2
9
$LUPREC
70
4
9
$SKETCHINC
40
1.0
9
$FILLETRAD
40
0.0
9
$AUNITS
70
0
9
$AUPREC
70
0
9
$MENU
1
.
9
$ELEVATION
40
0.0
9
$PELEVATION
40
0.0
9
$THICKNESS
40
0.0
9
$LIMCHECK
70
0
9
$CHAMFERA
40
0.0
9
$CHAMFERB
40
0.0
9
$CHAMFERC
40
0.0
9
$CHAMFERD
40
0.0
9
$SKPOLY
70
0
9
$TDCREATE
40
2458590.383113426
9
$TDUCREATE
40
2458590.049780092
9
$TDUPDATE
40
2458590.384224537
9
$TDUUPDATE
40
2458590.050891204
9
$TDINDWG
40
0.0011111111
9
$TDUSRTIMER
40
0.0011111111
9
$USRTIMER
70
1
9
$ANGBASE
50
0.0
9
$ANGDIR
70
0
9
$PDMODE
70
0
9
$PDSIZE
40
0.0
9
$PLINEWID
40
0.0
9
$SPLFRAME
70
0
9
$SPLINETYPE
70
6
9
$SPLINESEGS
70
8
9
$HANDSEED
5
2B8
9
$SURFTAB1
70
6
9
$SURFTAB2
70
6
9
$SURFTYPE
70
6
9
$SURFU
70
6
9
$SURFV
70
6
9
$UCSBASE
2
9
$UCSNAME
2
9
$UCSORG
10
0.0
20
0.0
30
0.0
9
$UCSXDIR
10
1.0
20
0.0
30
0.0
9
$UCSYDIR
10
0.0
20
1.0
30
0.0
9
$UCSORTHOREF
2
9
$UCSORTHOVIEW
70
0
9
$UCSORGTOP
10
0.0
20
0.0
30
0.0
9
$UCSORGBOTTOM
10
0.0
20
0.0
30
0.0
9
$UCSORGLEFT
10
0.0
20
0.0
30
0.0
9
$UCSORGRIGHT
10
0.0
20
0.0
30
0.0
9
$UCSORGFRONT
10
0.0
20
0.0
30
0.0
9
$UCSORGBACK
10
0.0
20
0.0
30
0.0
9
$PUCSBASE
2
9
$PUCSNAME
2
9
$PUCSORG
10
0.0
20
0.0
30
0.0
9
$PUCSXDIR
10
1.0
20
0.0
30
0.0
9
$PUCSYDIR
10
0.0
20
1.0
30
0.0
9
$PUCSORTHOREF
2
9
$PUCSORTHOVIEW
70
0
9
$PUCSORGTOP
10
0.0
20
0.0
30
0.0
9
$PUCSORGBOTTOM
10
0.0
20
0.0
30
0.0
9
$PUCSORGLEFT
10
0.0
20
0.0
30
0.0
9
$PUCSORGRIGHT
10
0.0
20
0.0
30
0.0
9
$PUCSORGFRONT
10
0.0
20
0.0
30
0.0
9
$PUCSORGBACK
10
0.0
20
0.0
30
0.0
9
$USERI1
70
0
9
$USERI2
70
0
9
$USERI3
70
0
9
$USERI4
70
0
9
$USERI5
70
0
9
$USERR1
40
0.0
9
$USERR2
40
0.0
9
$USERR3
40
0.0
9
$USERR4
40
0.0
9
$USERR5
40
0.0
9
$WORLDVIEW
70
1
9
$SHADEDGE
70
3
9
$SHADEDIF
70
70
9
$TILEMODE
70
1
9
$MAXACTVP
70
64
9
$PINSBASE
10
0.0
20
0.0
30
0.0
9
$PLIMCHECK
70
0
9
$PEXTMIN
10
0.0
20
0.0
30
0.0
9
$PEXTMAX
10
0.0
20
0.0
30
0.0
9
$PLIMMIN
10
0.0
20
0.0
9
$PLIMMAX
10
12.0
20
9.0
9
$UNITMODE
70
0
9
$VISRETAIN
70
1
9
$PLINEGEN
70
0
9
$PSLTSCALE
70
1
9
$TREEDEPTH
70
3020
9
$CMLSTYLE
2
Standard
9
$CMLJUST
70
0
9
$CMLSCALE
40
20.0
9
$PROXYGRAPHICS
70
1
9
$MEASUREMENT
70
1
9
$CELWEIGHT
370
-1
9
$ENDCAPS
280
0
9
$JOINSTYLE
280
0
9
$LWDISPLAY
290
0
9
$INSUNITS
70
4
9
$HYPERLINKBASE
1
9
$STYLESHEET
1
9
$XEDIT
290
1
9
$CEPSNTYPE
380
0
9
$PSTYLEMODE
290
1
9
$FINGERPRINTGUID
2
{96A53CC7-ACDD-234C-B0F9-88300B14E85D}
9
$VERSIONGUID
2
{FDA5A254-6150-FA48-A4B8-168CBCE559AD}
9
$EXTNAMES
290
1
9
$PSVPSCALE
40
0.0
9
$OLESTARTUP
290
0
9
$SORTENTS
280
127
9
$INDEXCTL
280
0
9
$HIDETEXT
280
1
9
$XCLIPFRAME
290
0
9
$HALOGAP
280
0
9
$OBSCOLOR
70
257
9
$OBSLTYPE
280
0
9
$INTERSECTIONDISPLAY
280
0
9
$INTERSECTIONCOLOR
70
257
9
$DIMASSOC
280
2
9
$PROJECTNAME
1
9
$CAMERADISPLAY
290
0
9
$LENSLENGTH
40
50.0
9
$CAMERAHEIGHT
40
0.0
9
$STEPSPERSEC
40
2.0
9
$STEPSIZE
40
6.0
9
$3DDWFPREC
40
2.0
9
$PSOLWIDTH
40
5.0
9
$PSOLHEIGHT
40
80.0
9
$LOFTANG1
40
1.570796326794896
9
$LOFTANG2
40
1.570796326794896
9
$LOFTMAG1
40
0.0
9
$LOFTMAG2
40
0.0
9
$LOFTPARAM
70
7
9
$LOFTNORMALS
280
1
9
$LATITUDE
40
37.795
9
$LONGITUDE
40
-122.394
9
$NORTHDIRECTION
40
0.0
9
$TIMEZONE
70
-8000
9
$LIGHTGLYPHDISPLAY
280
1
9
$TILEMODELIGHTSYNCH
280
1
9
$CMATERIAL
347
EC
9
$SOLIDHIST
280
0
9
$SHOWHIST
280
1
9
$DWFFRAME
280
2
9
$DGNFRAME
280
0
9
$REALWORLDSCALE
290
1
9
$INTERFERECOLOR
62
1
9
$INTERFEREOBJVS
345
F9
9
$INTERFEREVPVS
346
F6
9
$CSHADOW
280
0
9
$SHADOWPLANELOCATION
40
0.0
0
ENDSEC
0
SECTION
2
CLASSES
0
CLASS
1
ACDBDICTIONARYWDFLT
2
AcDbDictionaryWithDefault
3
ObjectDBX Classes
90
0
91
1
280
0
281
0
0
CLASS
1
DICTIONARYVAR
2
AcDbDictionaryVar
3
ObjectDBX Classes
90
0
91
12
280
0
281
0
0
CLASS
1
TABLESTYLE
2
AcDbTableStyle
3
ObjectDBX Classes
90
4095
91
1
280
0
281
0
0
CLASS
1
MATERIAL
2
AcDbMaterial
3
ObjectDBX Classes
90
1153
91
3
280
0
281
0
0
CLASS
1
VISUALSTYLE
2
AcDbVisualStyle
3
ObjectDBX Classes
90
4095
91
24
280
0
281
0
0
CLASS
1
SCALE
2
AcDbScale
3
ObjectDBX Classes
90
1153
91
17
280
0
281
0
0
CLASS
1
MLEADERSTYLE
2
AcDbMLeaderStyle
3
ACDB_MLEADERSTYLE_CLASS
90
4095
91
2
280
0
281
0
0
CLASS
1
CELLSTYLEMAP
2
AcDbCellStyleMap
3
ObjectDBX Classes
90
1152
91
1
280
0
281
0
0
CLASS
1
EXACXREFPANELOBJECT
2
ExAcXREFPanelObject
3
EXAC_ESW
90
1025
91
0
280
0
281
0
0
CLASS
1
NPOCOLLECTION
2
AcDbImpNonPersistentObjectsCollection
3
ObjectDBX Classes
90
1153
91
0
280
0
281
0
0
CLASS
1
LAYER_INDEX
2
AcDbLayerIndex
3
ObjectDBX Classes
90
0
91
0
280
0
281
0
0
CLASS
1
SPATIAL_INDEX
2
AcDbSpatialIndex
3
ObjectDBX Classes
90
0
91
0
280
0
281
0
0
CLASS
1
IDBUFFER
2
AcDbIdBuffer
3
ObjectDBX Classes
90
0
91
0
280
0
281
0
0
CLASS
1
ACDBSECTIONVIEWSTYLE
2
AcDbSectionViewStyle
3
ObjectDBX Classes
90
1025
91
1
280
0
281
0
0
CLASS
1
ACDBDETAILVIEWSTYLE
2
AcDbDetailViewStyle
3
ObjectDBX Classes
90
1025
91
1
280
0
281
0
0
ENDSEC
0
SECTION
2
TABLES
0
TABLE
2
VPORT
5
8
330
0
100
AcDbSymbolTable
70
1
0
VPORT
5
EA
330
8
100
AcDbSymbolTableRecord
100
AcDbViewportTableRecord
2
*Active
70
0
10
0.0
20
0.0
11
1.0
21
1.0
12
26.13531116233776
22
8.376287332784158
13
0.0
23
0.0
14
10.0
24
10.0
15
10.0
25
10.0
16
0.0
26
0.0
36
1.0
17
0.0
27
0.0
37
0.0
40
393.0272442228397
41
2.104271356783919
42
50.0
43
0.0
44
0.0
50
0.0
51
0.0
71
0
72
1000
73
1
74
3
75
0
76
1
77
0
78
0
281
0
65
1
110
0.0
120
0.0
130
0.0
111
1.0
121
0.0
131
0.0
112
0.0
122
1.0
132
0.0
79
0
146
0.0
348
F5
60
3
61
5
292
1
282
1
141
0.0
142
0.0
63
250
421
3355443
1001
ACAD_NAV_VCDISPLAY
1070
3
0
ENDTAB
0
TABLE
2
LTYPE
5
5
330
0
100
AcDbSymbolTable
70
2
0
LTYPE
5
14
330
5
100
AcDbSymbolTableRecord
100
AcDbLinetypeTableRecord
2
ByBlock
70
0
3
72
65
73
0
40
0.0
0
LTYPE
5
15
330
5
100
AcDbSymbolTableRecord
100
AcDbLinetypeTableRecord
2
ByLayer
70
0
3
72
65
73
0
40
0.0
0
LTYPE
5
16
330
5
100
AcDbSymbolTableRecord
100
AcDbLinetypeTableRecord
2
Continuous
70
0
3
Solid line
72
65
73
0
40
0.0
0
ENDTAB
0
TABLE
2
LAYER
5
2
102
{ACAD_XDICTIONARY
360
1FF
102
}
330
0
100
AcDbSymbolTable
70
1
0
LAYER
5
44c
100
AcDbSymbolTableRecord
100
AcDbLayerTableRecord
2
BottomLayer
70
0
420
255
6
Continuous
370
-3
390
F
347
21
0
LAYER
5
44d
100
AcDbSymbolTableRecord
100
AcDbLayerTableRecord
2
BottomPasteMaskLayer
70
0
420
8388608
6
Continuous
370
-3
390
F
347
21
0
LAYER
5
44e
100
AcDbSymbolTableRecord
100
AcDbLayerTableRecord
2
TopSolderMaskLayer
70
0
420
8388736
6
Continuous
370
-3
390
F
347
21
0
LAYER
5
44f
100
AcDbSymbolTableRecord
100
AcDbLayerTableRecord
2
BottomSolderMaskLayer
70
0
420
11141375
6
Continuous
370
-3
390
F
347
21
0
LAYER
5
450
100
AcDbSymbolTableRecord
100
AcDbLayerTableRecord
2
BoardOutLine
70
0
420
16711935
6
Continuous
370
-3
390
F
347
21
0
LAYER
5
451
100
AcDbSymbolTableRecord
100
AcDbLayerTableRecord
2
Multi-Layer
70
0
420
12632256
6
Continuous
370
-3
390
F
347
21
0
LAYER
5
10
102
{ACAD_XDICTIONARY
360
13C
102
}
330
2
100
AcDbSymbolTableRecord
100
AcDbLayerTableRecord
2
0
70
0
62
7
6
Continuous
370
-3
390
F
347
EE
0
ENDTAB
0
TABLE
2
STYLE
5
3
330
0
100
AcDbSymbolTable
70
2
0
STYLE
5
11
330
3
100
AcDbSymbolTableRecord
100
AcDbTextStyleTableRecord
2
Standard
70
0
40
0.0
41
1.0
50
0.0
71
0
42
2.5
3
arial.ttf
4
1001
ACAD
1000
Arial
1071
34
0
STYLE
5
132
330
3
100
AcDbSymbolTableRecord
100
AcDbTextStyleTableRecord
2
Annotative
70
0
40
0.0
41
1.0
50
0.0
71
0
42
2.5
3
arial.ttf
4
1001
AcadAnnotative
1000
AnnotativeData
1002
{
1070
1
1070
1
1002
}
1001
ACAD
1000
Arial
1071
34
0
ENDTAB
0
TABLE
2
VIEW
5
6
330
0
100
AcDbSymbolTable
70
0
0
ENDTAB
0
TABLE
2
UCS
5
7
330
0
100
AcDbSymbolTable
70
0
0
ENDTAB
0
TABLE
2
APPID
5
9
330
0
100
AcDbSymbolTable
70
9
0
APPID
5
12
330
9
100
AcDbSymbolTableRecord
100
AcDbRegAppTableRecord
2
ACAD
70
0
0
APPID
5
9E
330
9
100
AcDbSymbolTableRecord
100
AcDbRegAppTableRecord
2
ACAD_PSEXT
70
0
0
APPID
5
133
330
9
100
AcDbSymbolTableRecord
100
AcDbRegAppTableRecord
2
AcadAnnoPO
70
0
0
APPID
5
134
330
9
100
AcDbSymbolTableRecord
100
AcDbRegAppTableRecord
2
AcadAnnotative
70
0
0
APPID
5
135
330
9
100
AcDbSymbolTableRecord
100
AcDbRegAppTableRecord
2
ACAD_DSTYLE_DIMJAG
70
0
0
APPID
5
136
330
9
100
AcDbSymbolTableRecord
100
AcDbRegAppTableRecord
2
ACAD_DSTYLE_DIMTALN
70
0
0
APPID
5
165
330
9
100
AcDbSymbolTableRecord
100
AcDbRegAppTableRecord
2
ACAD_MLEADERVER
70
0
0
APPID
5
217
330
9
100
AcDbSymbolTableRecord
100
AcDbRegAppTableRecord
2
ACAD_NAV_VCDISPLAY
70
0
0
APPID
5
26E
330
9
100
AcDbSymbolTableRecord
100
AcDbRegAppTableRecord
2
ACAD_EXEMPT_FROM_CAD_STANDARDS
70
0
0
ENDTAB
0
TABLE
2
DIMSTYLE
5
A
330
0
100
AcDbSymbolTable
70
4
100
AcDbDimStyleTable
71
2
340
27
340
137
0
DIMSTYLE
105
1B0
330
A
100
AcDbSymbolTableRecord
100
AcDbDimStyleTableRecord
2
Standard
70
0
340
11
0
DIMSTYLE
105
137
330
A
100
AcDbSymbolTableRecord
100
AcDbDimStyleTableRecord
2
Annotative
70
0
40
0.0
41
2.5
42
0.625
43
3.75
44
1.25
73
0
74
0
77
1
78
8
140
2.5
141
2.5
143
0.03937007874016
147
0.625
171
3
172
1
271
2
272
2
274
3
278
44
283
0
284
8
340
11
1001
AcadAnnotative
1000
AnnotativeData
1002
{
1070
1
1070
1
1002
}
1001
ACAD_DSTYLE_DIMJAG
1070
388
1040
1.5
1001
ACAD_DSTYLE_DIMTALN
1070
392
1070
0
0
DIMSTYLE
105
27
330
A
100
AcDbSymbolTableRecord
100
AcDbDimStyleTableRecord
2
ISO-25
70
0
41
2.5
42
0.625
43
3.75
44
1.25
73
0
74
0
77
1
78
8
140
2.5
141
2.5
143
0.03937007874016
147
0.625
171
3
172
1
271
2
272
2
274
3
278
44
283
0
284
8
340
11
0
ENDTAB
0
TABLE
2
BLOCK_RECORD
5
1
330
0
100
AcDbSymbolTable
70
2
0
BLOCK_RECORD
5
1F
102
{ACAD_XDICTIONARY
360
1CE
102
}
330
1
100
AcDbSymbolTableRecord
100
AcDbBlockTableRecord
2
*Model_Space
340
22
70
0
280
1
281
0
0
BLOCK_RECORD
5
D2
330
1
100
AcDbSymbolTableRecord
100
AcDbBlockTableRecord
2
*Paper_Space
340
D3
70
0
280
1
281
0
0
BLOCK_RECORD
5
D6
330
1
100
AcDbSymbolTableRecord
100
AcDbBlockTableRecord
2
*Paper_Space0
340
D7
70
0
280
1
281
0
0
ENDTAB
0
ENDSEC
0
SECTION
2
BLOCKS
0
BLOCK
5
20
330
1F
100
AcDbEntity
8
0
100
AcDbBlockBegin
2
*Model_Space
70
0
10
0.0
20
0.0
30
0.0
3
*Model_Space
1
0
ENDBLK
5
21
330
1F
100
AcDbEntity
8
0
100
AcDbBlockEnd
0
BLOCK
5
D4
330
D2
100
AcDbEntity
67
1
8
0
100
AcDbBlockBegin
2
*Paper_Space
70
0
10
0.0
20
0.0
30
0.0
3
*Paper_Space
1
0
ENDBLK
5
D5
330
D2
100
AcDbEntity
67
1
8
0
100
AcDbBlockEnd
0
BLOCK
5
D8
330
D6
100
AcDbEntity
67
1
8
0
100
AcDbBlockBegin
2
*Paper_Space0
70
0
10
0.0
20
0.0
30
0.0
3
*Paper_Space0
1
0
ENDBLK
5
D9
330
D6
100
AcDbEntity
67
1
8
0
100
AcDbBlockEnd
0
ENDSEC
0
SECTION
2
ENTITIES
0
LWPOLYLINE
5
3e8
330
1F
100
AcDbEntity
8
BottomLayer
100
AcDbPolyline
90
2
70
0
43
0.30000000000000004
10
40
20
10
10
40
20
5.249987299974578
10
39.75001270002531
20
5
0
LWPOLYLINE
5
3e9
330
1F
100
AcDbEntity
8
BottomLayer
100
AcDbPolyline
90
3
70
0
43
0.30000000000000004
10
45.00127000253997
20
10
10
43.40106680213353
20
10
10
41.02108204216415
20
7.6200152400305114
10
41.00076200152398
20
2.9997459994920064
0
LWPOLYLINE
5
3ea
330
1F
100
AcDbEntity
8
BottomLayer
100
AcDbPolyline
90
4
70
0
43
0.4
10
50.00000000000023
20
10
10
48.22707645415289
20
10
10
45.84709169418352
20
7.6200152400305114
10
44.870027940055934
20
7.6200152400305114
10
42.250012700025536
20
5
0
LWPOLYLINE
5
3eb
330
1F
100
AcDbEntity
8
BottomLayer
100
AcDbPolyline
90
2
70
0
43
0.4
10
35
20
10
10
35
20
6.499999999999886
10
38.5
20
3
0
LWPOLYLINE
5
3ec
330
1F
100
AcDbEntity
8
BottomLayer
100
AcDbPolyline
90
5
70
0
43
0.4
10
43.5
20
3
10
43.5
20
2.3519177038353973
10
42.291084582169105
20
1.1430022860045028
10
40.259080518161
20
1.1430022860045028
10
39.49707899415807
20
2.0029210058419267
10
38.5
20
3
0
LWPOLYLINE
5
3ed
330
1F
100
AcDbEntity
8
BoardOutLine
100
AcDbPolyline
90
3
70
0
43
0.25400050800101603
10
0
20
11.999974599949155
10
91.00002540005084
20
11.999974599949155
10
91.00002540005084
20
8.414833629667214
10
91.00002540005084
20
0
0
LWPOLYLINE
5
3ee
330
1F
100
AcDbEntity
8
BoardOutLine
100
AcDbPolyline
90
1
70
0
43
0.25400050800101603
10
0
20
0
10
0
20
11.999974599949155
0
LWPOLYLINE
5
3ef
330
1F
100
AcDbEntity
8
BoardOutLine
100
AcDbPolyline
90
1
70
0
43
0.25400050800101603
10
90.96004572009156
20
0
10
-0.03997967995940144
20
0
0
TEXT
5
446
100
AcDbEntity
8
TopSilkLayer
7
461
2.0320040640081283
100
AcDbText
10
28.448056896113712
20
8.763017526035014
30
0
40
2.0320040640081283
1
GND
50
0
71
1
100
AcDbText
0
TEXT
5
447
100
AcDbEntity
8
TopSilkLayer
7
461
2.0320040640081283
100
AcDbText
10
38.60807721615447
20
6.731013462026908
30
0
40
2.0320040640081283
1
DN
50
0
71
1
100
AcDbText
0
TEXT
5
448
100
AcDbEntity
8
TopSilkLayer
7
461
2.0320040640081283
100
AcDbText
10
43.561087122174285
20
6.731013462026908
30
0
40
2.0320040640081283
1
DP
50
0
71
1
100
AcDbText
0
TEXT
5
449
100
AcDbEntity
8
TopSilkLayer
7
461
2.0320040640081283
100
AcDbText
10
51.30810261620536
20
8.763017526035014
30
0
40
2.0320040640081283
1
5V
50
0
71
1
100
AcDbText
0
CIRCLE
5
3f1
330
1F
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbCircle
10
43.500127000254
20
3
30
0.0
40
0.7874015748031498
0
HATCH
5
3f2
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
42.71272542545085
20
3
42
1
10
44.287528575057145
20
3
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
3f4
330
1F
100
AcDbEntity
8
BottomPasteMaskLayer
100
AcDbCircle
10
43.500127000254
20
3
30
0.0
40
0.7620015240030481
0
HATCH
5
3f5
100
AcDbEntity
8
BottomPasteMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
42.73812547625095
20
3
42
1
10
44.262128524257044
20
3
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
3f7
330
1F
100
AcDbEntity
8
BottomLayer
100
AcDbCircle
10
43.500127000254
20
3
30
0.0
40
0.7620015240030481
0
HATCH
5
3f8
100
AcDbEntity
8
BottomLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
42.73812547625095
20
3
42
1
10
44.262128524257044
20
3
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
3fa
330
1F
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbCircle
10
41.00000000000023
20
3
30
0.0
40
0.7874015748031498
0
HATCH
5
3fb
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
40.21259842519708
20
3
42
1
10
41.787401574803376
20
3
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
3fd
330
1F
100
AcDbEntity
8
BottomPasteMaskLayer
100
AcDbCircle
10
41.00000000000023
20
3
30
0.0
40
0.7620015240030481
0
HATCH
5
3fe
100
AcDbEntity
8
BottomPasteMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
40.23799847599718
20
3
42
1
10
41.762001524003274
20
3
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
400
330
1F
100
AcDbEntity
8
BottomLayer
100
AcDbCircle
10
41.00000000000023
20
3
30
0.0
40
0.7620015240030481
0
HATCH
5
401
100
AcDbEntity
8
BottomLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
40.23799847599718
20
3
42
1
10
41.762001524003274
20
3
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
403
330
1F
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbCircle
10
38.499872999746
20
3
30
0.0
40
0.7874015748031498
0
HATCH
5
404
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
37.712471424942855
20
3
42
1
10
39.28727457454915
20
3
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
406
330
1F
100
AcDbEntity
8
BottomPasteMaskLayer
100
AcDbCircle
10
38.499872999746
20
3
30
0.0
40
0.7620015240030481
0
HATCH
5
407
100
AcDbEntity
8
BottomPasteMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
37.737871475742956
20
3
42
1
10
39.26187452374905
20
3
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
409
330
1F
100
AcDbEntity
8
BottomLayer
100
AcDbCircle
10
38.499872999746
20
3
30
0.0
40
0.7620015240030481
0
HATCH
5
40a
100
AcDbEntity
8
BottomLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
37.737871475742956
20
3
42
1
10
39.26187452374905
20
3
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
40c
330
1F
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbCircle
10
44.750063500127
20
5
30
0.0
40
0.7874015748031498
0
HATCH
5
40d
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
43.96266192532385
20
5
42
1
10
45.53746507493015
20
5
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
40f
330
1F
100
AcDbEntity
8
BottomPasteMaskLayer
100
AcDbCircle
10
44.750063500127
20
5
30
0.0
40
0.7620015240030481
0
HATCH
5
410
100
AcDbEntity
8
BottomPasteMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
43.98806197612395
20
5
42
1
10
45.512065024130045
20
5
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
412
330
1F
100
AcDbEntity
8
BottomLayer
100
AcDbCircle
10
44.750063500127
20
5
30
0.0
40
0.7620015240030481
0
HATCH
5
413
100
AcDbEntity
8
BottomLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
43.98806197612395
20
5
42
1
10
45.512065024130045
20
5
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
415
330
1F
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbCircle
10
42.249936499873
20
5
30
0.0
40
0.7874015748031498
0
HATCH
5
416
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
41.46253492506985
20
5
42
1
10
43.03733807467615
20
5
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
418
330
1F
100
AcDbEntity
8
BottomPasteMaskLayer
100
AcDbCircle
10
42.249936499873
20
5
30
0.0
40
0.7620015240030481
0
HATCH
5
419
100
AcDbEntity
8
BottomPasteMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
41.487934975869955
20
5
42
1
10
43.01193802387605
20
5
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
41b
330
1F
100
AcDbEntity
8
BottomLayer
100
AcDbCircle
10
42.249936499873
20
5
30
0.0
40
0.7620015240030481
0
HATCH
5
41c
100
AcDbEntity
8
BottomLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
41.487934975869955
20
5
42
1
10
43.01193802387605
20
5
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
41e
330
1F
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbCircle
10
39.750063500127
20
5
30
0.0
40
0.7874015748031498
0
HATCH
5
41f
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
38.96266192532385
20
5
42
1
10
40.53746507493015
20
5
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
421
330
1F
100
AcDbEntity
8
BottomPasteMaskLayer
100
AcDbCircle
10
39.750063500127
20
5
30
0.0
40
0.7620015240030481
0
HATCH
5
422
100
AcDbEntity
8
BottomPasteMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
38.98806197612395
20
5
42
1
10
40.512065024130045
20
5
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
424
330
1F
100
AcDbEntity
8
BottomLayer
100
AcDbCircle
10
39.750063500127
20
5
30
0.0
40
0.7620015240030481
0
HATCH
5
425
100
AcDbEntity
8
BottomLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
38.98806197612395
20
5
42
1
10
40.512065024130045
20
5
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
426
330
1F
100
AcDbEntity
8
TopSolderMaskLayer
100
AcDbCircle
10
35
20
10
30
0.0
40
0.47244094488188987
0
CIRCLE
5
427
330
1F
100
AcDbEntity
8
TopSolderMaskLayer
100
AcDbCircle
10
35
20
10
30
0.0
40
0.7874015748031498
0
HATCH
5
428
100
AcDbEntity
8
TopSolderMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
34.21259842519685
20
10
42
1
10
35.78740157480315
20
10
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
429
330
1F
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbCircle
10
35
20
10
30
0.0
40
0.47244094488188987
0
CIRCLE
5
42a
330
1F
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbCircle
10
35
20
10
30
0.0
40
0.7874015748031498
0
HATCH
5
42b
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
34.21259842519685
20
10
42
1
10
35.78740157480315
20
10
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
42c
330
1F
100
AcDbEntity
8
Multi-Layer
100
AcDbCircle
10
35
20
10
30
0.0
40
0.45720091440182886
0
CIRCLE
5
42d
330
1F
100
AcDbEntity
8
Multi-Layer
100
AcDbCircle
10
35
20
10
30
0.0
40
0.7620015240030481
0
CIRCLE
5
42e
330
1F
100
AcDbEntity
8
TopSolderMaskLayer
100
AcDbCircle
10
40
20
10
30
0.0
40
0.47244094488188987
0
CIRCLE
5
42f
330
1F
100
AcDbEntity
8
TopSolderMaskLayer
100
AcDbCircle
10
40
20
10
30
0.0
40
0.7874015748031498
0
HATCH
5
430
100
AcDbEntity
8
TopSolderMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
39.21259842519685
20
10
42
1
10
40.78740157480315
20
10
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
431
330
1F
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbCircle
10
40
20
10
30
0.0
40
0.47244094488188987
0
CIRCLE
5
432
330
1F
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbCircle
10
40
20
10
30
0.0
40
0.7874015748031498
0
HATCH
5
433
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
39.21259842519685
20
10
42
1
10
40.78740157480315
20
10
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
434
330
1F
100
AcDbEntity
8
Multi-Layer
100
AcDbCircle
10
40
20
10
30
0.0
40
0.45720091440182886
0
CIRCLE
5
435
330
1F
100
AcDbEntity
8
Multi-Layer
100
AcDbCircle
10
40
20
10
30
0.0
40
0.7620015240030481
0
CIRCLE
5
436
330
1F
100
AcDbEntity
8
TopSolderMaskLayer
100
AcDbCircle
10
45
20
10
30
0.0
40
0.47244094488188987
0
CIRCLE
5
437
330
1F
100
AcDbEntity
8
TopSolderMaskLayer
100
AcDbCircle
10
45
20
10
30
0.0
40
0.7874015748031498
0
HATCH
5
438
100
AcDbEntity
8
TopSolderMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
44.21259842519685
20
10
42
1
10
45.78740157480315
20
10
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
439
330
1F
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbCircle
10
45
20
10
30
0.0
40
0.47244094488188987
0
CIRCLE
5
43a
330
1F
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbCircle
10
45
20
10
30
0.0
40
0.7874015748031498
0
HATCH
5
43b
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
44.21259842519685
20
10
42
1
10
45.78740157480315
20
10
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
43c
330
1F
100
AcDbEntity
8
Multi-Layer
100
AcDbCircle
10
45
20
10
30
0.0
40
0.45720091440182886
0
CIRCLE
5
43d
330
1F
100
AcDbEntity
8
Multi-Layer
100
AcDbCircle
10
45
20
10
30
0.0
40
0.7620015240030481
0
CIRCLE
5
43e
330
1F
100
AcDbEntity
8
TopSolderMaskLayer
100
AcDbCircle
10
50.00000000000023
20
10
30
0.0
40
0.47244094488188987
0
CIRCLE
5
43f
330
1F
100
AcDbEntity
8
TopSolderMaskLayer
100
AcDbCircle
10
50.00000000000023
20
10
30
0.0
40
0.7874015748031498
0
HATCH
5
440
100
AcDbEntity
8
TopSolderMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
49.21259842519708
20
10
42
1
10
50.787401574803376
20
10
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
441
330
1F
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbCircle
10
50.00000000000023
20
10
30
0.0
40
0.47244094488188987
0
CIRCLE
5
442
330
1F
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbCircle
10
50.00000000000023
20
10
30
0.0
40
0.7874015748031498
0
HATCH
5
443
100
AcDbEntity
8
BottomSolderMaskLayer
100
AcDbHatch
10
0
20
0
30
0
210
0
220
0
230
1
2
SOLID
70
1
71
0
91
1
92
7
72
1
73
1
93
2
10
49.21259842519708
20
10
42
1
10
50.787401574803376
20
10
42
1
97
1
330
75
0
76
1
47
0.8681437583925616
98
1
10
3.629517071192367
20
33.92795499968543
450
0
451
0
460
0
461
0
452
1
462
1
453
2
463
0
63
5
421
255
463
1
63
7
421
16777215
470
LINEAR
1001
ACAD
1010
0
1020
0
1030
0
0
CIRCLE
5
444
330
1F
100
AcDbEntity
8
Multi-Layer
100
AcDbCircle
10
50.00000000000023
20
10
30
0.0
40
0.45720091440182886
0
CIRCLE
5
445
330
1F
100
AcDbEntity
8
Multi-Layer
100
AcDbCircle
10
50.00000000000023
20
10
30
0.0
40
0.7620015240030481
0
CIRCLE
5
44a
330
1F
100
AcDbEntity
8
Multi-Layer
100
AcDbCircle
10
61.249936499873
20
5.4998729997458895
30
0.0
40
1.7500127000254002
0
CIRCLE
5
44b
330
1F
100
AcDbEntity
8
Multi-Layer
100
AcDbCircle
10
30.249936499873
20
5.4998729997458895
30
0.0
40
1.7500127000254002
0
ENDSEC
0
SECTION
2
OBJECTS
0
DICTIONARY
5
C
330
0
100
AcDbDictionary
281
1
3
ACAD_CIP_PREVIOUS_PRODUCT_INFO
350
216
3
ACAD_COLOR
350
6B
3
ACAD_DETAILVIEWSTYLE
350
21B
3
ACAD_GROUP
350
D
3
ACAD_LAYOUT
350
1A
3
ACAD_MATERIAL
350
6A
3
ACAD_MLEADERSTYLE
350
12D
3
ACAD_MLINESTYLE
350
17
3
ACAD_PLOTSETTINGS
350
19
3
ACAD_PLOTSTYLENAME
350
E
3
ACAD_SCALELIST
350
10C
3
ACAD_SECTIONVIEWSTYLE
350
219
3
ACAD_TABLESTYLE
350
7E
3
ACAD_VISUALSTYLE
350
EF
3
ACDB_RECOMPOSE_DATA
350
27D
3
AcDbVariableDictionary
350
5E
3
AcDsDecomposeData
350
283
0
DICTIONARY
5
1FF
330
2
100
AcDbDictionary
280
1
281
1
3
ACAD_LAYERSTATES
360
200
0
DICTIONARY
5
13C
330
10
100
AcDbDictionary
280
1
281
1
0
DICTIONARY
5
1CE
330
1F
100
AcDbDictionary
280
1
281
1
0
XRECORD
5
216
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbXrecord
280
1
300
ACD
300
2017
300
ACD_F_S
0
DICTIONARY
5
6B
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
0
DICTIONARY
5
21B
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
3
Metric50
350
21C
0
DICTIONARY
5
D
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
0
DICTIONARY
5
1A
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
3
Model
350
22
3
布局1
350
D3
3
布局2
350
D7
0
DICTIONARY
5
6A
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
3
ByBlock
350
ED
3
ByLayer
350
EC
3
Global
350
EE
0
DICTIONARY
5
12D
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
3
Annotative
350
13B
3
Standard
350
12E
0
DICTIONARY
5
17
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
3
Standard
350
18
0
DICTIONARY
5
19
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
0
ACDBDICTIONARYWDFLT
5
E
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
3
Normal
350
F
100
AcDbDictionaryWithDefault
340
F
0
DICTIONARY
5
10C
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
3
A0
350
10D
3
A1
350
1BE
3
A2
350
1BF
3
A3
350
1C0
3
A4
350
1C1
3
A5
350
1C2
3
A6
350
1C3
3
A7
350
1C4
3
A8
350
1C5
3
A9
350
1C6
3
B0
350
1C7
3
B1
350
1C8
3
B2
350
1C9
3
B3
350
1CA
3
B4
350
1CB
3
B5
350
1CC
3
B6
350
1CD
0
DICTIONARY
5
219
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
3
Metric50
350
21A
0
DICTIONARY
5
7E
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
3
Standard
350
7F
0
DICTIONARY
5
EF
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
3
2dWireframe
350
F5
3
Basic
350
F4
3
Brighten
350
FB
3
ColorChange
350
FF
3
Conceptual
350
F8
3
Dim
350
FA
3
EdgeColorOff
350
1E6
3
Facepattern
350
FE
3
Flat
350
F0
3
FlatWithEdges
350
F1
3
Gouraud
350
F2
3
GouraudWithEdges
350
F3
3
Hidden
350
F7
3
JitterOff
350
1E4
3
Linepattern
350
FD
3
OverhangOff
350
1E5
3
Realistic
350
F9
3
Shaded
350
1F3
3
Shaded with edges
350
1F2
3
Shades of Gray
350
1EF
3
Sketchy
350
1F0
3
Thicken
350
FC
3
Wireframe
350
F6
3
X-Ray
350
1F1
0
XRECORD
5
27D
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbXrecord
280
1
90
1
330
7F
0
DICTIONARY
5
5E
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
3
CANNOSCALE
350
146
3
CENTEREXE
350
259
3
CENTERLTYPEFILE
350
25A
3
CMLEADERSTYLE
350
145
3
CTABLESTYLE
350
84
3
CVIEWDETAILSTYLE
350
227
3
CVIEWSECTIONSTYLE
350
228
3
DIMASSOC
350
5F
3
HIDETEXT
350
63
3
LAYEREVAL
350
1AE
3
LAYERNOTIFY
350
1AF
3
XCLIPFRAME
350
27B
0
DICTIONARY
5
283
102
{ACAD_REACTORS
330
C
102
}
330
C
100
AcDbDictionary
281
1
3
AcDsRecords
350
285
3
AcDsSchemas
350
284
1001
ACAD
1070
2
0
DICTIONARY
5
200
102
{ACAD_REACTORS
330
1FF
102
}
330
1FF
100
AcDbDictionary
281
1
0
ACDBDETAILVIEWSTYLE
5
21C
102
{ACAD_XDICTIONARY
360
236
102
}
102
{ACAD_REACTORS
330
21B
102
}
330
21B
100
AcDbModelDocViewStyle
70
0
3
Metric50
290
0
100
AcDbDetailViewStyle
70
0
71
0
90
3
71
1
340
11
62
256
40
5.0
340
0
62
256
40
5.0
300
40
0.0
280
1
71
2
340
16
90
25
62
256
71
3
340
11
62
256
40
5.0
90
0
40
15.0
90
1
300
%<AcVar ViewDetailId>% (%<AcVar ViewScale "%sn">%)
71
4
340
16
90
25
62
256
340
16
90
25
62
256
280
0
0
LAYOUT
5
22
102
{ACAD_XDICTIONARY
360
205
102
}
102
{ACAD_REACTORS
330
1A
102
}
330
1A
100
AcDbPlotSettings
1
2
none_device
4
ISO_A4_(210.00_x_297.00_MM)
6
40
7.5
41
20.0
42
7.5
43
20.0
44
210.0
45
297.0
46
11.54999923706054
47
-13.65000009536743
48
0.0
49
0.0
140
0.0
141
0.0
142
1.0
143
8.704084754739808
70
11952
72
1
73
0
74
0
7
75
0
147
0.1148885871608098
76
0
77
2
78
300
148
0.0
149
0.0
100
AcDbLayout
1
Model
70
1
71
0
10
0.0
20
0.0
11
12.0
21
9.0
12
0.0
22
0.0
32
0.0
14
0.0
24
0.0
34
0.0
15
0.0
25
0.0
35
0.0
146
0.0
13
0.0
23
0.0
33
0.0
16
1.0
26
0.0
36
0.0
17
0.0
27
1.0
37
0.0
76
0
330
1F
331
EA
1001
ACAD_PSEXT
1000
None
1000
None
1000
Not applicable
1000
The layout will not be plotted unless a new plotter configuration name is selected.
1070
0
0
LAYOUT
5
D3
102
{ACAD_REACTORS
330
1A
102
}
330
1A
100
AcDbPlotSettings
1
2
C:Documents and SettingsasasApplication DataAutodeskAutoCAD 2005R16.1enuplottersDefault Windows System Printer.pc3
4
6
40
0.0
41
0.0
42
0.0
43
0.0
44
0.0
45
0.0
46
0.0
47
0.0
48
0.0
49
0.0
140
0.0
141
0.0
142
1.0
143
1.0
70
688
72
0
73
0
74
5
7
75
16
147
1.0
76
0
77
2
78
300
148
0.0
149
0.0
100
AcDbLayout
1
布局1
70
1
71
1
10
0.0
20
0.0
11
12.0
21
9.0
12
0.0
22
0.0
32
0.0
14
0.0
24
0.0
34
0.0
15
0.0
25
0.0
35
0.0
146
0.0
13
0.0
23
0.0
33
0.0
16
1.0
26
0.0
36
0.0
17
0.0
27
1.0
37
0.0
76
0
330
D2
0
LAYOUT
5
D7
102
{ACAD_REACTORS
330
1A
102
}
330
1A
100
AcDbPlotSettings
1
2
C:Documents and SettingsasasApplication DataAutodeskAutoCAD 2005R16.1enuplottersDefault Windows System Printer.pc3
4
6
40
0.0
41
0.0
42
0.0
43
0.0
44
0.0
45
0.0
46
0.0
47
0.0
48
0.0
49
0.0
140
0.0
141
0.0
142
1.0
143
1.0
70
688
72
0
73
0
74
5
7
75
16
147
1.0
76
0
77
2
78
300
148
0.0
149
0.0
100
AcDbLayout
1
布局2
70
1
71
2
10
0.0
20
0.0
11
12.0
21
9.0
12
0.0
22
0.0
32
0.0
14
0.0
24
0.0
34
0.0
15
0.0
25
0.0
35
0.0
146
0.0
13
0.0
23
0.0
33
0.0
16
1.0
26
0.0
36
0.0
17
0.0
27
1.0
37
0.0
76
0
330
D6
0
MATERIAL
5
ED
102
{ACAD_XDICTIONARY
360
1F9
102
}
102
{ACAD_REACTORS
330
6A
102
}
330
6A
100
AcDbMaterial
1
ByBlock
94
63
0
MATERIAL
5
EC
102
{ACAD_XDICTIONARY
360
1F7
102
}
102
{ACAD_REACTORS
330
6A
102
}
330
6A
100
AcDbMaterial
1
ByLayer
94
63
0
MATERIAL
5
EE
102
{ACAD_XDICTIONARY
360
173
102
}
102
{ACAD_REACTORS
330
6A
102
}
330
6A
100
AcDbMaterial
1
Global
43
0.0007999999797903
43
0.0
43
0.0
43
0.0
43
0.0
43
0.0007999999797903
43
0.0
43
0.0
43
0.0
43
0.0
43
1.0
43
0.0
43
0.0
43
0.0
43
0.0
43
1.0
49
0.0007999999797903
49
0.0
49
0.0
49
0.0
49
0.0
49
0.0007999999797903
49
0.0
49
0.0
49
0.0
49
0.0
49
1.0
49
0.0
49
0.0
49
0.0
49
0.0
49
1.0
142
0.0007999999797903
142
0.0
142
0.0
142
0.0
142
0.0
142
0.0007999999797903
142
0.0
142
0.0
142
0.0
142
0.0
142
1.0
142
0.0
142
0.0
142
0.0
142
0.0
142
1.0
144
0.0007999999797903
144
0.0
144
0.0
144
0.0
144
0.0
144
0.0007999999797903
144
0.0
144
0.0
144
0.0
144
0.0
144
1.0
144
0.0
144
0.0
144
0.0
144
0.0
144
1.0
94
63
1001
ACAD
1070
-1
1070
3
1070
0
1000
1071
0
1070
0
0
MLEADERSTYLE
5
13B
102
{ACAD_REACTORS
330
12D
102
}
330
12D
100
AcDbMLeaderStyle
170
2
171
1
172
0
90
2
40
0.0
41
0.0
173
1
91
-1056964608
340
14
92
-2
290
1
42
2.0
291
1
43
8.0
3
Standard
44
4.0
300
342
11
174
1
178
1
175
1
176
0
93
-1056964608
45
4.0
292
0
297
0
46
4.0
94
-1056964608
47
1.0
49
1.0
140
1.0
293
1
141
0.0
294
1
177
0
142
1.0
295
0
296
1
143
3.75
1001
ACAD_MLEADERVER
1070
2
0
MLEADERSTYLE
5
12E
102
{ACAD_REACTORS
330
12D
102
}
330
12D
100
AcDbMLeaderStyle
170
2
171
1
172
0
90
2
40
0.0
41
0.0
173
1
91
-1056964608
340
14
92
-2
290
1
42
2.0
291
1
43
8.0
3
Standard
44
4.0
300
342
11
174
1
178
1
175
1
176
0
93
-1056964608
45
4.0
292
0
297
0
46
4.0
94
-1056964608
47
1.0
49
1.0
140
1.0
293
1
141
0.0
294
1
177
0
142
1.0
295
0
296
0
143
3.75
1001
ACAD_MLEADERVER
1070
2
0
MLINESTYLE
5
18
102
{ACAD_REACTORS
330
17
102
}
330
17
100
AcDbMlineStyle
2
STANDARD
70
0
3
62
256
51
90.0
52
90.0
71
2
49
0.5
62
256
6
BYLAYER
49
-0.5
62
256
6
BYLAYER
0
ACDBPLACEHOLDER
5
F
102
{ACAD_REACTORS
330
E
102
}
330
E
0
SCALE
5
10D
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
1:1
140
1.0
141
1.0
290
1
0
SCALE
5
1BE
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
1:2
140
1.0
141
2.0
290
0
0
SCALE
5
1BF
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
1:4
140
1.0
141
4.0
290
0
0
SCALE
5
1C0
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
1:5
140
1.0
141
5.0
290
0
0
SCALE
5
1C1
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
1:8
140
1.0
141
8.0
290
0
0
SCALE
5
1C2
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
1:10
140
1.0
141
10.0
290
0
0
SCALE
5
1C3
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
1:16
140
1.0
141
16.0
290
0
0
SCALE
5
1C4
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
1:20
140
1.0
141
20.0
290
0
0
SCALE
5
1C5
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
1:30
140
1.0
141
30.0
290
0
0
SCALE
5
1C6
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
1:40
140
1.0
141
40.0
290
0
0
SCALE
5
1C7
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
1:50
140
1.0
141
50.0
290
0
0
SCALE
5
1C8
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
1:100
140
1.0
141
100.0
290
0
0
SCALE
5
1C9
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
2:1
140
2.0
141
1.0
290
0
0
SCALE
5
1CA
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
4:1
140
4.0
141
1.0
290
0
0
SCALE
5
1CB
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
8:1
140
8.0
141
1.0
290
0
0
SCALE
5
1CC
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
10:1
140
10.0
141
1.0
290
0
0
SCALE
5
1CD
102
{ACAD_REACTORS
330
10C
102
}
330
10C
100
AcDbScale
70
0
300
100:1
140
100.0
141
1.0
290
0
0
ACDBSECTIONVIEWSTYLE
5
21A
102
{ACAD_XDICTIONARY
360
234
102
}
102
{ACAD_REACTORS
330
219
102
}
330
219
100
AcDbModelDocViewStyle
70
0
3
Metric50
290
0
100
AcDbSectionViewStyle
70
0
71
0
90
102
71
1
340
11
62
256
40
5.0
340
0
340
0
62
256
40
5.0
300
I, O, Q, S, X, Z
40
10.0
90
0
40
2.5
90
0
71
2
340
16
90
25
62
256
340
16
90
50
62
256
40
5.0
40
2.5
40
5.0
71
3
340
11
62
256
40
5.0
90
0
40
15.0
90
1
300
%<AcVar ViewSectionStartId>%-%<AcVar ViewSectionEndId>% (%<AcVar ViewScale "%sn">%)
71
4
62
256
62
257
300
ANSI31
40
1.0
90
0
290
0
290
0
90
6
40
0.0
40
1.570796326794896
40
0.2617993877991494
40
1.308996938995747
40
-0.2617993877991494
40
1.832595714594046
0
TABLESTYLE
5
7F
102
{ACAD_XDICTIONARY
360
162
102
}
102
{ACAD_REACTORS
330
7E
102
}
330
7E
100
AcDbTableStyle
3
Standard
70
0
71
0
40
1.5
41
1.5
280
0
281
0
7
Standard
140
4.5
170
2
62
0
63
7
283
0
90
512
91
0
1
274
-2
284
1
64
0
275
-2
285
1
65
0
276
-2
286
1
66
0
277
-2
287
1
67
0
278
-2
288
1
68
0
279
-2
289
1
69
0
7
Standard
140
6.0
170
5
62
0
63
7
283
0
90
512
91
0
1
274
-2
284
1
64
0
275
-2
285
1
65
0
276
-2
286
1
66
0
277
-2
287
1
67
0
278
-2
288
1
68
0
279
-2
289
1
69
0
7
Standard
140
4.5
170
5
62
0
63
7
283
0
90
512
91
0
1
274
-2
284
1
64
0
275
-2
285
1
65
0
276
-2
286
1
66
0
277
-2
287
1
67
0
278
-2
288
1
68
0
279
-2
289
1
69
0
0
VISUALSTYLE
5
F5
102
{ACAD_XDICTIONARY
360
290
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
2dWireframe
70
4
71
0
72
2
73
1
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
1
91
4
64
7
65
257
75
1
175
1
42
1.0
92
0
66
257
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
1
44
0.0
173
0
291
0
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
F4
102
{ACAD_XDICTIONARY
360
28E
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Basic
70
7
71
1
72
0
73
1
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
0
91
4
64
7
65
257
75
1
175
1
42
1.0
92
8
66
7
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
1
44
0.0
173
0
291
1
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
FB
102
{ACAD_XDICTIONARY
360
29C
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Brighten
70
12
71
2
72
2
73
1
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
1
91
4
64
7
65
257
75
1
175
1
42
1.0
92
8
66
7
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
1
44
50.0
173
0
291
1
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
FF
102
{ACAD_XDICTIONARY
360
2A4
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
ColorChange
70
16
71
2
72
2
73
3
90
0
40
-0.6
41
-30.0
62
5
63
8
421
8421504
74
1
91
4
64
7
65
257
75
1
175
1
42
1.0
92
8
66
8
424
8421504
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
1
44
0.0
173
0
291
1
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
F8
102
{ACAD_XDICTIONARY
360
296
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Conceptual
70
9
71
3
72
2
73
1
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
2
91
2
64
7
65
257
75
1
175
1
42
40.0
92
8
66
7
43
1.0
76
1
77
6
78
2
67
7
79
3
170
0
171
0
290
0
174
0
93
1
44
0.0
173
0
291
0
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
FA
102
{ACAD_XDICTIONARY
360
29A
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Dim
70
11
71
2
72
2
73
1
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
1
91
4
64
7
65
257
75
1
175
1
42
1.0
92
8
66
7
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
1
44
-50.0
173
0
291
1
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
1E6
102
{ACAD_XDICTIONARY
360
2AA
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
EdgeColorOff
70
22
71
2
72
2
73
0
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
1
91
4
64
7
65
257
75
1
175
1
42
1.0
92
8
66
7
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
1
44
0.0
173
0
291
1
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
FE
102
{ACAD_XDICTIONARY
360
2A2
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Facepattern
70
15
71
2
72
2
73
1
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
1
91
4
64
7
65
257
75
1
175
1
42
1.0
92
8
66
7
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
1
44
0.0
173
0
291
1
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
F0
102
{ACAD_XDICTIONARY
360
286
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Flat
70
0
71
2
72
1
73
1
90
2
40
-0.6
41
30.0
62
5
63
7
421
16777215
74
0
91
0
64
7
65
257
75
1
175
1
42
1.0
92
8
66
7
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
13
44
0.0
173
0
291
1
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
F1
102
{ACAD_XDICTIONARY
360
288
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
FlatWithEdges
70
1
71
2
72
1
73
1
90
2
40
-0.6
41
30.0
62
5
63
7
421
16777215
74
1
91
0
64
7
65
257
75
1
175
1
42
1.0
92
0
66
257
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
13
44
0.0
173
0
291
1
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
F2
102
{ACAD_XDICTIONARY
360
28A
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Gouraud
70
2
71
2
72
2
73
1
90
2
40
-0.6
41
30.0
62
5
63
7
421
16777215
74
0
91
0
64
7
65
257
75
1
175
1
42
1.0
92
0
66
7
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
13
44
0.0
173
0
291
1
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
F3
102
{ACAD_XDICTIONARY
360
28C
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
GouraudWithEdges
70
3
71
2
72
2
73
1
90
2
40
-0.6
41
30.0
62
5
63
7
421
16777215
74
1
91
0
64
7
65
257
75
1
175
1
42
1.0
92
0
66
257
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
13
44
0.0
173
0
291
1
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
F7
102
{ACAD_XDICTIONARY
360
294
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Hidden
70
6
71
1
72
2
73
2
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
2
91
2
64
7
65
257
75
2
175
1
42
40.0
92
0
66
257
43
1.0
76
1
77
6
78
2
67
7
79
3
170
0
171
0
290
0
174
0
93
1
44
0.0
173
0
291
0
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
1E4
102
{ACAD_XDICTIONARY
360
2A6
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
JitterOff
70
20
71
2
72
2
73
0
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
1
91
4
64
7
65
257
75
1
175
1
42
1.0
92
10
66
7
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
1
44
0.0
173
0
291
1
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
FD
102
{ACAD_XDICTIONARY
360
2A0
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Linepattern
70
14
71
2
72
2
73
1
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
1
91
4
64
7
65
257
75
7
175
7
42
1.0
92
8
66
7
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
1
44
0.0
173
0
291
1
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
1E5
102
{ACAD_XDICTIONARY
360
2A8
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
OverhangOff
70
21
71
2
72
2
73
0
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
1
91
4
64
7
65
257
75
1
175
1
42
1.0
92
9
66
7
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
1
44
0.0
173
0
291
1
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
F9
102
{ACAD_XDICTIONARY
360
298
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Realistic
70
8
71
2
72
3
73
0
90
2
40
-0.6
41
30.0
62
5
63
7
421
16777215
74
0
91
0
64
7
65
257
75
1
175
1
42
1.0
92
8
66
257
43
1.0
76
1
77
6
78
2
67
7
79
3
170
0
171
0
290
0
174
0
93
13
44
0.0
173
0
291
0
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
1F3
102
{ACAD_XDICTIONARY
360
2B4
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Shaded
70
27
71
2
72
2
73
1
90
2
40
-0.6
41
30.0
62
5
63
7
421
16777215
74
0
91
4
64
7
65
257
75
1
175
1
42
1.0
92
8
66
257
43
1.0
76
1
77
6
78
2
67
8
425
7895160
79
3
170
0
171
0
290
0
174
0
93
5
44
0.0
173
0
291
0
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
1F2
102
{ACAD_XDICTIONARY
360
2B2
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Shaded with edges
70
26
71
2
72
2
73
1
90
2
40
-0.6
41
30.0
62
5
63
7
421
16777215
74
1
91
2
64
7
65
257
75
2
175
1
42
1.0
92
8
66
257
43
1.0
76
1
77
6
78
2
67
7
79
3
170
0
171
0
290
0
174
0
93
5
44
0.0
173
0
291
0
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
1EF
102
{ACAD_XDICTIONARY
360
2AC
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Shades of Gray
70
23
71
2
72
2
73
3
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
2
91
2
64
7
65
7
75
1
175
1
42
40.0
92
8
66
7
43
1.0
76
1
77
6
78
2
67
7
79
3
170
0
171
0
290
0
174
0
93
1
44
0.0
173
0
291
0
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
1F0
102
{ACAD_XDICTIONARY
360
2AE
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Sketchy
70
24
71
1
72
2
73
2
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
2
91
2
64
7
65
7
75
1
175
1
42
40.0
92
11
66
7
43
1.0
76
1
77
6
78
2
67
7
79
6
170
0
171
0
290
0
174
0
93
1
44
0.0
173
0
291
0
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
FC
102
{ACAD_XDICTIONARY
360
29E
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Thicken
70
13
71
2
72
2
73
1
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
1
91
4
64
7
65
257
75
1
175
1
42
1.0
92
12
66
7
43
1.0
76
1
77
6
78
2
67
7
79
5
170
0
171
0
290
0
174
0
93
1
44
0.0
173
0
291
1
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
F6
102
{ACAD_XDICTIONARY
360
292
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
Wireframe
70
5
71
0
72
2
73
0
90
0
40
-0.6
41
-30.0
62
5
63
7
421
16777215
74
1
91
4
64
7
65
257
75
1
175
1
42
1.0
92
0
66
257
43
1.0
76
1
77
6
78
2
67
7
79
3
170
0
171
0
290
0
174
0
93
1
44
0.0
173
0
291
0
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
VISUALSTYLE
5
1F1
102
{ACAD_XDICTIONARY
360
2B0
102
}
102
{ACAD_REACTORS
330
EF
102
}
330
EF
100
AcDbVisualStyle
2
X-Ray
70
25
71
2
72
2
73
1
90
1
40
0.5
41
-30.0
62
5
63
7
421
16777215
74
1
91
0
64
7
65
257
75
1
175
1
42
1.0
92
8
66
7
43
1.0
76
1
77
6
78
2
67
7
79
3
170
0
171
0
290
0
174
0
93
13
44
0.0
173
0
291
0
45
0.0
1001
ACAD
1000
AcDbSavedByObjectVersion
1070
0
0
DICTIONARYVAR
5
146
102
{ACAD_REACTORS
330
5E
102
}
330
5E
100
DictionaryVariables
280
0
1
1:1
0
DICTIONARYVAR
5
259
102
{ACAD_REACTORS
330
5E
102
}
330
5E
100
DictionaryVariables
280
0
1
3.500000
0
DICTIONARYVAR
5
25A
102
{ACAD_REACTORS
330
5E
102
}
330
5E
100
DictionaryVariables
280
0
1
acadiso.lin
0
DICTIONARYVAR
5
145
102
{ACAD_REACTORS
330
5E
102
}
330
5E
100
DictionaryVariables
280
0
1
STANDARD
0
DICTIONARYVAR
5
84
102
{ACAD_REACTORS
330
5E
102
}
330
5E
100
DictionaryVariables
280
0
1
STANDARD
0
DICTIONARYVAR
5
227
102
{ACAD_REACTORS
330
5E
102
}
330
5E
100
DictionaryVariables
280
0
1
Metric50
0
DICTIONARYVAR
5
228
102
{ACAD_REACTORS
330
5E
102
}
330
5E
100
DictionaryVariables
280
0
1
Metric50
0
DICTIONARYVAR
5
5F
102
{ACAD_REACTORS
330
5E
102
}
330
5E
100
DictionaryVariables
280
0
1
2
0
DICTIONARYVAR
5
63
102
{ACAD_REACTORS
330
5E
102
}
330
5E
100
DictionaryVariables
280
0
1
1
0
DICTIONARYVAR
5
1AE
102
{ACAD_REACTORS
330
5E
102
}
330
5E
100
DictionaryVariables
280
0
1
0
0
DICTIONARYVAR
5
1AF
102
{ACAD_REACTORS
330
5E
102
}
330
5E
100
DictionaryVariables
280
0
1
0
0
DICTIONARYVAR
5
27B
102
{ACAD_REACTORS
330
5E
102
}
330
5E
100
DictionaryVariables
280
0
1
2
0
DICTIONARY
5
285
102
{ACAD_REACTORS
330
283
102
}
330
283
100
AcDbDictionary
281
1
0
DICTIONARY
5
284
102
{ACAD_REACTORS
330
283
102
}
330
283
100
AcDbDictionary
281
1
3
1923465580128
350
27E
3
1923465580144
350
27F
3
1923465580160
350
280
3
1923465580176
350
281
3
1923465580192
350
282
0
DICTIONARY
5
236
330
21C
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
2B7
0
DICTIONARY
5
205
330
22
100
AcDbDictionary
280
1
281
1
0
DICTIONARY
5
1F9
330
ED
100
AcDbDictionary
280
1
281
1
3
FBXASSET
360
1FA
0
DICTIONARY
5
1F7
330
EC
100
AcDbDictionary
280
1
281
1
3
FBXASSET
360
1F8
0
DICTIONARY
5
173
330
EE
100
AcDbDictionary
280
1
281
1
3
BUMPTILE
360
175
3
DIFFUSETILE
360
174
3
FBXASSET
360
1FB
3
OPACITYTILE
360
176
3
REFLECTIONTILE
360
177
0
DICTIONARY
5
234
330
21A
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
2B6
0
DICTIONARY
5
162
330
7F
100
AcDbDictionary
280
1
281
1
3
ACAD_ROUNDTRIP_2008_TABLESTYLE_CELLSTYLEMAP
360
27C
0
DICTIONARY
5
290
330
F5
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
291
0
DICTIONARY
5
28E
330
F4
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
28F
0
DICTIONARY
5
29C
330
FB
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
29D
0
DICTIONARY
5
2A4
330
FF
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
2A5
0
DICTIONARY
5
296
330
F8
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
297
0
DICTIONARY
5
29A
330
FA
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
29B
0
DICTIONARY
5
2AA
330
1E6
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
2AB
0
DICTIONARY
5
2A2
330
FE
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
2A3
0
DICTIONARY
5
286
330
F0
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
287
0
DICTIONARY
5
288
330
F1
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
289
0
DICTIONARY
5
28A
330
F2
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
28B
0
DICTIONARY
5
28C
330
F3
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
28D
0
DICTIONARY
5
294
330
F7
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
295
0
DICTIONARY
5
2A6
330
1E4
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
2A7
0
DICTIONARY
5
2A0
330
FD
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
2A1
0
DICTIONARY
5
2A8
330
1E5
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
2A9
0
DICTIONARY
5
298
330
F9
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
299
0
DICTIONARY
5
2B4
330
1F3
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
2B5
0
DICTIONARY
5
2B2
330
1F2
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
2B3
0
DICTIONARY
5
2AC
330
1EF
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
2AD
0
DICTIONARY
5
2AE
330
1F0
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
2AF
0
DICTIONARY
5
29E
330
FC
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
29F
0
DICTIONARY
5
292
330
F6
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
293
0
DICTIONARY
5
2B0
330
1F1
100
AcDbDictionary
280
1
281
1
3
ACAD_XREC_ROUNDTRIP
360
2B1
0
XRECORD
5
27E
102
{ACAD_REACTORS
330
284
102
}
330
284
100
AcDbXrecord
280
1
1
AcDb_Thumbnail_Schema
102
{ATTRRECORD
341
27F
2
AcDbDs::TreatedAsObjectData
280
1
291
1
102
ATTRRECORD}
102
{ATTRRECORD
341
280
2
AcDbDs::Legacy
280
1
291
1
102
ATTRRECORD}
2
AcDbDs::ID
280
10
91
8
102
{ATTRRECORD
341
281
2
AcDs:Indexable
280
1
291
1
102
ATTRRECORD}
102
{ATTRRECORD
341
282
2
AcDbDs::HandleAttribute
280
7
282
1
102
ATTRRECORD}
2
Thumbnail_Data
280
15
91
0
0
XRECORD
5
27F
102
{ACAD_REACTORS
330
284
102
}
330
284
100
AcDbXrecord
280
1
1
AcDbDs::TreatedAsObjectDataSchema
2
AcDbDs::TreatedAsObjectData
280
1
91
0
0
XRECORD
5
280
102
{ACAD_REACTORS
330
284
102
}
330
284
100
AcDbXrecord
280
1
1
AcDbDs::LegacySchema
2
AcDbDs::Legacy
280
1
91
0
0
XRECORD
5
281
102
{ACAD_REACTORS
330
284
102
}
330
284
100
AcDbXrecord
280
1
1
AcDbDs::IndexedPropertySchema
2
AcDs:Indexable
280
1
91
0
0
XRECORD
5
282
102
{ACAD_REACTORS
330
284
102
}
330
284
100
AcDbXrecord
280
1
1
AcDbDs::HandleAttributeSchema
2
AcDbDs::HandleAttribute
280
7
91
1
284
1
0
XRECORD
5
2B7
102
{ACAD_REACTORS
330
236
102
}
330
236
100
AcDbXrecord
280
1
102
DISPLAYNAME
1
Metric50
102
FLAGS
90
0
0
XRECORD
5
1FA
102
{ACAD_REACTORS
330
1F9
102
}
330
1F9
100
AcDbXrecord
280
1
70
1
90
429727718
1
D62C5603-E3A1-4AEA-B7FB-FE5D8D0755AF
310
504B03040A0000080000CC70623B3DEE336E79000000790000001B0000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574662D3822203F3E3C666F726D6174733E3C666F726D61743E687474703A2F2F736368656D612E
310
6175746F6465736B2E636F6D2F64657369676E2D7061636B6167652F323030393C2F666F726D61743E3C2F666F726D6174733E504B0304140006080800CC70623BD486FD9CA0000000F4000000130000005B436F6E74656E745F54797065735D2E786D6C7D8EC10E82300C865F65E91D8A1E8C310C0EEA1BF002731658846E
310
D98AC1B77784ABF1D8FE5FBFBF75BBCE937A534CCEB38643598122B6FEE978D0B0485F9C41B54DDD7D022595594E1A469170414C76A4D9A4D207E29CF43ECE46F218070CC6BECC4078ACAA135ACF422C856C0E68EA1BF5669944DDD7BCDE7B1F8E415D77AECB980613C2E4AC91FC167A2B244592486606FC29C8FD7F045B9A
310
EF7053A7E60B504B0304140006080800CC70623B853B8169EB0000007C01000008000000636F72652E786D6C8D90416EC3201045AF62CDB6C206821CC7C244919D9CA01740401C94182C03558F5F9C3852BBEB6A467FFE9B197D7EFC9E1EC5975982F5AE035262288C535E5B377690E21535501C055FBC8FBF6C503839990E
310
5619041F179FE64D52DE45E362569DD7661365082642A11EB9E920A89B99642953CC8E702F67A9EE7234257977194EC9EAE275C4EABCCF5EAD5940D4AC6F0E35A568B8F43562CD7046CD199FD07E60174276A7BE677B5EADB0E0D14EEFFB6A31321A0D82627C4084204C3F096B71DD52F6819B16635EADF63F509AF53FA164
310
5DDCD1EDDD17164090FCC8732078B56691CB33A85CD7DCC40F504B0304140006080800CC70623B55019EA25F0000007C00000007000000636E782E786D6C4DCB3B0E80201045D1AD90E915ED2CF8AC45050C11660C8261F98AB1B07AC9C97D42D718D865D3E909258CFD00CCE24AC6E326A164D74DC0B4128928FF32603847
310
2BA13128B1252AC747C6BAB984FC68F0B87FE8960A5C09FE86CFB69FBA01504B0304140006080800CC70623BDBABAAF470010000D40300000C0000006662782F636F72652E786D6CC553D16E823014FD95A6AF4B694182CC941A83FA05FB810A9511A125A5257EFE2E82712ECEB8A7F100CD39F7F69E734AF9FADC366850B6
310
AF8DCE7018308C942E4C59EB2AC3DE1D498AD15A706B8CFB56869196ADCAF00863C12B6B7C374385D14E6907A836A59A41D9F7CA615434B0C8705F7CAA5606D23BA8E84F41278B93AC54100640439DE0BDB320004D43C63716C7C399D30917DCFBBA9CD9BA8469F5B156168B24CED3F7248AC8769F27244EB73B92EED8862C
310
B7F13E0C179B3C8F979C8ECD82BBBABDAA2BAC924E9558448CBD9330242CFA08E3154B5651FCC6D215639C8EE5774DBE2B5F6CF2B5768B68963BB5F5588420E442FC700B1139D4CB01F450C1E918227C2E09DF070D8140C84E1E9AAB8F1340832A9CB13130A5F1376A908D57309505ECF2A0DF179C4E9D30F5B239B87E3823
310
7A79C6F31DE1A8A5AEC08474B03C7837EAE4938639B44E5932B833D2C6B6B279CDC613877FA26EE21F4A2A4C63EC7F29A2F301D1F9F7A0E37D145F504B0304140006080800CC70623B9C113CC27E0000009D0000000B0000006662782F636E782E786D6C4DCCDF0A83201C86E15B91DFB94BFB330DD428C8FB886521330DA7
310
6397BF1A1DECE883878F57749FCDA1B7892F1BBC047A23808C7F84D9FA55424E0BE6803A256208E9EF06C84F9B91703228B1C690F78B66B34CD9A5439DF5CF0BFBF65E35BCA1B8D6A5C6F540381E886698B5741C695F9503EBA150A2F8958E3DC3EA0B504B0304140006080800CC70623B7DF2F77C2A010000120200003100
310
00006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F636F72652E786D6C8D51DB8EC22014FC15C2939B0D2DB4B45643319AE817EC0F6041255A68B86CFCFC856D4D76DF7CE190393373060EDB3DC707F856CE6B6B7A480A0C81328395DA5C7B18C3057510EC3873D686
310
3F34088C18550F330C39BB3A1BA7051AAC09CA84841A2BD5020AEF55806078A44B0FFD7053A328440C89E1EFC52486BBB8AA8214A99D789CF9E05200300FC927E4FB4D5B375D43103D5527440FB843077C5AA3F5861C8F645F5787F59E95B390B318B55CE45AA638FAA2957BD7248B390B7A7CC51F9C124149C82B8C378810
310
84AB2F42B7B8DD56F413775B8C5999E9FF4471926F8AA236A1AE96B8B3CC434E5839373893369E1FAF30EA395917409EB7F26AF8801C171837A4A6AC9C89E9F9C9B1A58BA30FD6A5EF5DDDCF894B9AD9B6A59C957943A9FCAE2FD5BC4DFE03504B0304140006080800CC70623BAD7543B64E01000033030000300000006662
310
782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F636E782E786D6CD593CD6EC32010845F0571AD6CE3D48AD20813A9873E410FBD12D82434182C7EAAE6EDBB2424CD25871E7B41D6EC30B3FA84F9E67BB2E40B4234DE8DB46F1925E094D7C6ED479AD3AE5951B2113C789FEE
310
6C943839C1488B4C05DF079FE72A69D8C96C13AAD6B8631503449F83828872B949AC57D26200B826A308D316B4064D6E46FCDA41C05550DC9E483A00797BFD207EFB092A45DE9514C1BBD22178396BD39D891265658C238DEA00936C654E5E433CB65A26D9F6EDB5EBC14EBF49A45CB856E66048291F6939A9A81BB5C89177
310
38143CA680F4AA299D66A042CEB3354A2684DC9D8D178FE0D9B8B41CAAD720F880EE7EF93C0C18769E099ECC04D5A102C8049A8A05632F4DDF376CF1DE0F6BB65C2F8627B65A33C6BB62177CEBBDAD973006829F89F22E814B54F4BC2BE347F8AA8F681390B50FA73F804400B5F542E796F19FF974E7F78DB802FE05E20750
310
4B0304140006080800CC70623BE75B7789680500003C100000340000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F6F626A656374732E786D6CAD575B8F9B3818FD2B887D06C22499CB8AA1CA655245D5B455A356FB305264C061D8018C6C3393D95FBFC7600890
310
A4CD5EF210B0B1BFEBF98E3F7B1FF6596ABC522E1296DF9BAE3D320D9A872C4AF2F8DE2CE5CEBA358D0FBEC719939D65A691938CDE9B6ADAF4BD98B3B2D05311DD91329583D9D5FC0F438434A7A611A644887B5384CF34233629258BA878B12322891DEFF6B66BD70BFB62634E8AE781D082709A4B588AF91C528CDA28B73F
310
1C998EEF39EABBEFA97FBD6A7C7E9553F9D3D79FE442923C3C523610337627CB87ABE99D359D4CC6D6E4FACAB5E6ABF9D2726FC6A3C5F56271377BB88362213924694B38DD99FE47C48627A1E7D49F5A8BB5E1A74C0A599ED3B0F21F1E56366B89112D681E218F0915D0D6F17AD41FBA2A369DCF6335D62ABBD39779D5DDD1
310
11D4D8DE3CBB96B2E04FB8202E41051754A1AA8E8F76B4C6DFE810B580B1547F4B84911149794252234D024EF8BBE963A95AE27B3D310A9D5C215C7960FAEE415ED75694C6AFB17BCACA5D99A60A9AA65F217B0BFC53292ACB92BF283FAD0D3621576592CB5BED907C2FA8E9DF794E35E97BEA31BED21FEB401ABB94C44839
310
DCACBF0E1C5DA8DA5B2F4DFFD32AD86F543D9E565E7056502E157C00AD2671CD534549AB752FCA9CDA00677A313F04E51B22FF19E57B300579E3C97EB29F682D92935CEC18CF901B7B54FD8C51F362B56FC72FE0B3C1EAE335EDCCBF5AEC39ADB17DC238973F804BA5E6F6BFE7AF1FB32E523BE9F3BD571418E3631DCA4D48
310
5250CF639223210A9446CA30052EDF057BD35F8329C1ECD84552BF0DC8D18BE7BCE23BFE6BD960AB4A7DE79923A103BEBD80F911CBAA2C60DB19B01CF164A5583B772EE6D3FFA56666CBCDA74DC97724A48F9A58967497E489C4D979006FD7A05E227A1EBDD0F737C623387A9C844D3709995625106D157315F8B8392CD4E0
310
A0B9A720C4BE9829CEF37EA1E13111214D53925356365ADA634861B52519DD27A00AEB808EAF0628E6F435519D446F45CF2C9CF5214F0A15B2F6D06B79DA3EE3CBF7F56780D2F4E7EF73A0F5E5B02A38D07DC852C6B7C1FBB6664213E0C39E3EBA7FF4E1AD23EA2829407C85E586727488B751B2DB9502BC7B228A3FD68B6E
310
A65A22397E690AA8D158D7E404EC8CDA235CC3B7D1898680131CEC2CDF2638C65196279577750F15884AEE19F94199155B92B13297978469D4F8D358DF0AEF7631E28DC8F0D9F437D5D39A83B2231A1D52D543813A824EF8D44BCFF2FA6A31BD1E8DAD87F1CCB526B3879935BF59CDADD5C37479BB1CDD4CA7B3556B516589
310
EF352754B706114D9C885EC9131DE6EFEB43D99AFE2391C2F958179413D7CFEF6B1B6DB1E7600F00DE6E5C67454A339A4BA2E0FBA85ED26F045D454F463DBFCE484C2F90F2E5E3666003662ED8F755951A7D1BECD5B30B550B2785C8E7320B7292A4838DDA71BBC863ED7613CAF659337A3354231D4FF4A182A54904C2898C
310
98B28C4AD0CE056CCF332A80986E571EE9DBC305BB5FEB7E509220A58D25CF042D712A806AC0AD0C657FDEF80D2D9CEAA2EE4D1C76F60BFE74219A06527D6F82DF6412526107381E55E353090704D085B52408A8913C4ED159D79BDA71BB4BC506F4831350EB6F975CD22D69BF7AC49B91A2C0A9DDA3D5CA36AD20FC478E37
310
E61844E2352865EBCB61A275A65283CAAA9DD27703B4102F5AF51EF5F573B75CBB5AD38BC845F7A49F82A0966A49C2E3EA5EA0ECD326CD965F1DB402C6FA8B51A4658C5C5E2EC9E214602E55810345408596591009A82E7E7FFACA19EEA299B14A0081A705CB3296EBC14CDF658DCD336EA6D1136881AAEB87B81AB9EE53D5
310
F5EB8BC8362082DA24122F98680A4E7930C01A0079749CEA14382A0783E5EBA5A10F8C098456A03D6A4AEB6BB881E2513747552A5DB22C7EDAF83BD5528081A365F7FF06504B0304140006080000CC70623B000000000000000000000000350000006662782F41393633353835312D344632462D344230382D423046372D37
310
39314545314133324237412F76657274696365732E62696E504B0304140006080800CC70623BF270F1330600000004000000360000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F747269616E676C65732E62696E636660600000504B0304140006080000CC7062
310
3B000000000000000000000000370000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F617474726962757465732E62696E504B0304140006080800CC70623B08DA0BD19000000041010000360000006662782F41393633353835312D344632462D344230382D4230
310
46372D3739314545314133324237412F6469726563746F72792E786D6C858F410AC3201045AF22B36F53E9A60B35CBEEBAE80D244E44489C6234F4F835464A48035D0DF398FF9F8AF63D0E6CC63039F212F8F9020C7D47C6792B21C5FE7403D62A1188E2E60C98D7234A5830286103A55745067B9D86B8A3CF9C7F90C11DE6
310
07FB144396D7B6A82D282E9A152AD114D5EF2CB866EEE831B8EEA07A7BB5A8D7D61A2BAAEB7FD5F70921FF497D00504B0304140006080800CC70623BEDD1DC58FD000000A00100003B0000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F7265736F75726365732F
310
636F72652E786D6C8D504B6E833010BD0A9A6D65B00922041947112427E8052C33A156828DFCA97AFC9A40A576D7CDCCE87D344F8F9FBFE667F689CE6B6B3A6039850C8DB2A336530731DC4903D95970676DF82583CCC8193B5861107C72362E3BA4AC096842428D1D7107A5F7182053CF7474E0D507CE32973124857FE48B
310
540F3961CEF244279DE03EB81420DB9EAC1384436FA353E879B1B182C7A8C75DA3C7F453DF353A1075D537A7BA6464B8F535A99AE14A9A2BBD90E350DD183B5CFABE3AF262350B1EF4FC9351399401471025A527C218A1E53BAB5A5AB765F5469B96525EACF23FA6B88CFF34456DC2A1DCE36E360F82A5202F42F062ED2BAD
310
579969AFDD8A6F504B010214000A0000080000CC70623B3DEE336E79000000790000001B00000000000000000000000000000000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C504B01021400140006080800CC70623BD486FD9CA0000000F40000001300000000000000000000000000B20000005B
310
436F6E74656E745F54797065735D2E786D6C504B01021400140006080800CC70623B853B8169EB0000007C010000080000000000000000000000000083010000636F72652E786D6C504B01021400140006080800CC70623B55019EA25F0000007C000000070000000000000000000000000094020000636E782E786D6C504B
310
01021400140006080800CC70623BDBABAAF470010000D40300000C00000000000000000000000000180300006662782F636F72652E786D6C504B01021400140006080800CC70623B9C113CC27E0000009D0000000B00000000000000000000000000B20400006662782F636E782E786D6C504B01021400140006080800CC70
310
623B7DF2F77C2A010000120200003100000000000000000000000000590500006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F636F72652E786D6C504B01021400140006080800CC70623BAD7543B64E010000330300003000000000000000000000000000D2060000
310
6662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F636E782E786D6C504B01021400140006080800CC70623BE75B7789680500003C10000034000000000000000000000000006E0800006662782F41393633353835312D344632462D344230382D423046372D3739314545
310
314133324237412F6F626A656374732E786D6C504B01021400140006080000CC70623B0000000000000000000000003500000000000000000000000000280E00006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F76657274696365732E62696E504B01021400140006
310
080800CC70623BF270F133060000000400000036000000000000000000000000007B0E00006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F747269616E676C65732E62696E504B01021400140006080000CC70623B0000000000000000000000003700000000000000
310
000000000000D50E00006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F617474726962757465732E62696E504B01021400140006080800CC70623B08DA0BD1900000004101000036000000000000000000000000002A0F00006662782F41393633353835312D344632
310
462D344230382D423046372D3739314545314133324237412F6469726563746F72792E786D6C504B01021400140006080800CC70623BEDD1DC58FD000000A00100003B000000000000000000000000000E1000006662782F41393633353835312D344632462D344230382D423046372D3739314545314133324237412F7265
310
736F75726365732F636F72652E786D6C504B0506000000000E000E0080040000641100000000
0
XRECORD
5
1F8
102
{ACAD_REACTORS
330
1F7
102
}
330
1F7
100
AcDbXrecord
280
1
70
1
90
429727718
1
30362254-06B7-45E0-A893-8CFA70E3D6BC
310
504B03040A0000080000CC70623B3DEE336E79000000790000001B0000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574662D3822203F3E3C666F726D6174733E3C666F726D61743E687474703A2F2F736368656D612E
310
6175746F6465736B2E636F6D2F64657369676E2D7061636B6167652F323030393C2F666F726D61743E3C2F666F726D6174733E504B0304140006080800CC70623BD486FD9CA0000000F4000000130000005B436F6E74656E745F54797065735D2E786D6C7D8EC10E82300C865F65E91D8A1E8C310C0EEA1BF002731658846E
310
D98AC1B77784ABF1D8FE5FBFBF75BBCE937A534CCEB38643598122B6FEE978D0B0485F9C41B54DDD7D022595594E1A469170414C76A4D9A4D207E29CF43ECE46F218070CC6BECC4078ACAA135ACF422C856C0E68EA1BF5669944DDD7BCDE7B1F8E415D77AECB980613C2E4AC91FC167A2B244592486606FC29C8FD7F045B9A
310
EF7053A7E60B504B0304140006080800CC70623B1EC5D7A3EB0000007C01000008000000636F72652E786D6C8D90416EC3201045AF82665B6103C6756C6122AB4D4ED00B204C5C94182C03558F5F9C3852BBEB6A467FFE9B197D71FC9E6FE8CBACC17AD7032D0820E3B41FAD9B7A48F1820F808E52ACDEC75F36404ECDA687
310
4D0629A6D5A76597B477D1B89855E747B38B2A041301E95B6E7A08FAD3CCAA50296647B8168BD2573599823EBB0CA76447F43862C7BCCF5EAC59410E4DDD9C7973C2755553CCCFA4C603E3040F1565ED3B1FDE4E432BCA0D9622DAF9795FAF464533826484B498524CD807E51D79ED187F21878E10516EF63F505AC67F42C9
310
BA58B1FDDD071640D2FCC87D2045B96591CB3DA85CB7DCE40F504B0304140006080800CC70623B55019EA25F0000007C00000007000000636E782E786D6C4DCB3B0E80201045D1AD90E915ED2CF8AC45050C11660C8261F98AB1B07AC9C97D42D718D865D3E909258CFD00CCE24AC6E326A164D74DC0B4128928FF32603847
310
2BA13128B1252AC747C6BAB984FC68F0B87FE8960A5C09FE86CFB69FBA01504B0304140006080800CC70623B8C9102E971010000D40300000C0000006662782F636F72652E786D6CC5535B6E833010BC8AE5DF0A6C08340F1947A84D4ED00B38C6A128602363A31CBFCB234A53A551FA553EC09AD9F5CE8C31DB9E9B1AF5CA
310
7695D1198E428A91D2D214952E33ECDD315861B4E5CC1AE3BE9561A445A3323CC098B3D21ADFCE9034DA29ED00D5A6503328BA4E398C640D8B0C77F253352214DE4145770A5B214FA2546114020D759C75CE8200340D19DE981F0F6746269C33EFAB6266AB02A655C74A59CCF365BADC27CB5D902ED22848F6340DF238A141
310
BE88E2F57B92BFEDF23523433367AE6A2EEAA455C2A902F398D2751045018D3FA264435F3771F242571B4A1919CA6F9A7C5B3CD9E42BED16F12C776AEB308F40C848FC700B1139D4891EF410CEC810227CC6846F8386402064270EF5C5C709A05E49676C024C61FC95EA45ED154CA5211D1FF4FB8291A913A68E9B83EBBB33
310
E2A7673CDE118E5AE8124C0807CB8377834E366998436B950D7A7746DAD846D4CFD978E0F04FD455FC5D49D2D4C6FE9722321F10997F0F32DC47FE05504B0304140006080800CC70623BFFEA85907E0000009D0000000B0000006662782F636E782E786D6C4DCCD10A83201886E15B91FFDC95D95A811AB6F23E625948A6C3
310
E9D8E5AF46073BFAE0E1E365ED67B3E8ADC3CB78C7815C7240DA3DFC64DCC221C519D7805AC182F7F1EF06C88D9BE6703008B6049F9E274D7A1E938DBB5AE3D6131B2589BA0D3D965551E0B2EA732C9B9A624AAEB41E3A557677029960D9AFB4EF11165F504B0304140006080800CC70623B4FEEA4082C0100001202000031
310
0000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F636F72652E786D6C8D515B6EC32010BC0AE2AB55850DD871ED0813254D72825EC00192A2C460F1A872FC42ED48ED5F7E00CDCECCCEB26C731F6FE05B39AFADE921293004CA082BB5B9F43086336A21D870E6AC
310
0D7F68109861543DCC30E4ECE26C9C164858139409093556AA051CBC570102714B8F1E7AF1A5C6A11862480C7F2DA6415C878B2A4891CA89C7990F2E050073937C42DE1DB7E4F87ED8A36D4329AA9B3D46DBAEAD504556557BD81DEBDD0761E52CE42C462D17B996298E3E6BE59E35C962CE821E1FF18553435012728A7187
310
0841987E927A8D9B35ADDF70BBC6989599FE4F1427F9A4286A132ABAC49D651EF234CD5CE04CDA78BA3DC2A8FB645D00B9DF8B57E215725C60BCA2A463E54C4CE327C7A65E1C7DB02E7DEFCBF594B864C5CA6CDBD49C957943E9FA5D5FBAF336F90F504B0304140006080800CC70623BAD7543B64E01000033030000300000
310
006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F636E782E786D6CD593CD6EC32010845F0571AD6CE3D48AD20813A9873E410FBD12D82434182C7EAAE6EDBB2424CD25871E7B41D6EC30B3FA84F9E67BB2E40B4234DE8DB46F1925E094D7C6ED479AD3AE5951B2113C
310
789FEE6C943839C1488B4C05DF079FE72A69D8C96C13AAD6B8631503449F83828872B949AC57D26200B826A308D316B4064D6E46FCDA41C05550DC9E483A00797BFD207EFB092A45DE9514C1BBD22178396BD39D891265658C238DEA00936C654E5E433CB65A26D9F6EDB5EBC14EBF49A45CB856E66048291F6939A9A81BB5
310
C8917738143CA680F4AA299D66A042CEB3354A2684DC9D8D178FE0D9B8B41CAAD720F880EE7EF93C0C18769E099ECC04D5A102C8049A8A05632F4DDF376CF1DE0F6BB65C2F8627B65A33C6BB62177CEBBDAD973006829F89F22E814B54F4BC2BE347F8AA8F681390B50FA73F804400B5F542E796F19FF974E7F78DB802FE05
310
E207504B0304140006080800CC70623B16AB87BA640500003C100000340000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F6F626A656374732E786D6CAD575B6FA33818FD2B887DE6924B3BED8A326A92B68A663B534DD4D13E548A0C38942D60649B369D5FBFC7
310
600890A493BDE42160637FD7F31D7FF63E6FB3D478A55C242CBF3247B66B1A340F5994E4F19559CA8D75611A9F7D8F33263BCB4C232719BD32D5B4E97B316765A1A722BA21652A07B3B7B33F0D11D29C9A46981221AE4C113ED38CD8A4942CA2E2C58E882476BCD9DA23BB5ED8171B73523C0F841684D35CC252CCE79062D4
310
468DFA43D7747CCF51DF7D4FFDEB5593E3AB9CCA9FBEFE241792E4E19EB28198C968BAB8199F5D5A67D3E9C49A9E8F47D6EC76B6B0469F26EEFC7C3EBFBCBEB98462213924694B38DD98FE1D62C393D073EA4FADC5DAF04326852CCF6958F90F0F2B9BB5C48816348F90C7840A68EB78EDF68723159BCEE7891A6B95DDE9D3
310
BCEAEEE8086A6C6F9E5D4B59F0175C10A7A0820BAA5055C7473B5AE3CFDD452D602CD5DF12616444529E90D448938013FE6EFA58AA96F85E4F8C42275708571E98FE6827AF6B2B4AE3D7D83D64E5A64C53054DD3AF90BD06FEA9149565C94FCA0F6B834DC85599E4F2423B24DF0B6AFA979E534DFA9E7A4CC6FA631D486393
310
921829879BF5D781A373557BCB85E97FB90DB62B558F8795179C15944B051F40AB495CF35451D26A4727654E6D8033BD98EF82F21D91FF8AF2DD9982BCF1643BDD4EB516C9492E368C67C88DED563FC36D5EACF66DFF057C3658BDBFA69DF9578B3DA735B64F18C7F20770A9D45CFCF7FCF563D6456A277DBEF78A02637CA2
310
43B90A490AEAB94F72244481D24819A6C0E59B606BFA4B3025981DBB48EAB701D97BF19C577CC77F2D1B6C55A9EF3C732474C0B727303F625995056C3B02963D9EAC146BE78EC5FCEC7FA999EBC5EACBAAE41B12D27B4D2C0BBA49F244E2ECDC81B76B502F113D8F5EE8FB1BE3111CDD4FC2AA9B844CAB1288B68AB90A7CDC
310
1C166AB0D3DC5310625FCC14E779BFD0709F8890A629C9292B1B2DED31A4B0DA928CEE135085754027E3018A397D4D5427D15BD1330B677DC8934285AC3DF45A9EB68FF8F2B8FC0A509AFEECFD0FF2DE25CC6047F7214B195F07EFEB9A094D800F7BFAE8FED187B78EA8A3A400F115961BCAD1215E47C966530AF0EE8128FE
310
58CEBB996A8964FFA529A046635D9353B0336A8F700DDF46271A024E70B0B37C9DE01847591E54DED53D54202AB947E4076556AC49C6CA5C9E1226B7F1A7B1BE15DEED62C41B91E1B3E9AFAAA735036547343A925075041DF0A9979E893B391F8FCFA6967B3EFB644DCF6E5CEBFAE272625DCC6FAF3FB93793C5F90CE1EF57
310
407342756B10D1C489E8953CD1617E5CEECAD6F4EF8914CE5D5D504E5C3F1F9736DA62CFC11E00BCDDB8CC8A9466349744C1F75EBDA4DF09BA8A9E8C7A7E9991989E20E5DBDD6A6003664ED8F7A04A8DBE0DF6EAD9B9AA858342E47399053949D2C146EDB85DE4B176BB0965FBAC19BD19AA918E27FA50C1D22402E144464C
310
59462568E704B6E71915404CB72B8FF4EDE184DDAF753F284990D2C6926782963815403548A70C657FDEF80D2D9CEAA2AE4C1C76F60BFE74219A06527D6582DF6412526107381E55E353090704D085B52408D0933C4ED159D79BDA71BB4BC506F4831350EB6F979CD22D69BF7AC49B91A2C0A9DDA3D5CA36AD20FC478E37E6
310
1844E2352865EBCB6EA275A652E3836BE04EFB400BF1A2556F515F1FBB35B2AB35BD889C744FFA1004B5544B121E57F70215746DD2F5E2C1412B602CBF19455AC6C8E5E9922C4E01E65215385004546899059180EAFCF7A707CE7017CD8CDB0410789AB32C63B91E5CEBBBACB17AC6CD347A022D5075FD106377347AAABA7E
310
7D11590744509B44E205134DC1290F06580320F78E537D3D73540E06CB970B431F185308AD40BBD794D6D77003C5A36E8EAA54BA64597CD8F83BD552A080A365F7FF06504B0304140006080000CC70623B000000000000000000000000350000006662782F39464131463745442D413632322D343644302D413938332D3331
310
353338454246344243312F76657274696365732E62696E504B0304140006080800CC70623BF270F1330600000004000000360000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F747269616E676C65732E62696E636660600000504B0304140006080000CC70623B
310
000000000000000000000000370000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F617474726962757465732E62696E504B0304140006080800CC70623B08DA0BD19000000041010000360000006662782F39464131463745442D413632322D343644302D413938
310
332D3331353338454246344243312F6469726563746F72792E786D6C858F410AC3201045AF22B36F53E9A60B35CBEEBAE80D244E44489C6234F4F835464A48035D0DF398FF9F8AF63D0E6CC63039F212F8F9020C7D47C6792B21C5FE7403D62A1188E2E60C98D7234A5830286103A55745067B9D86B8A3CF9C7F90C11DE607
310
FB144396D7B6A82D282E9A152AD114D5EF2CB866EEE831B8EEA07A7BB5A8D7D61A2BAAEB7FD5F70921FF497D00504B0304140006080800CC70623B0D6EF93BFE000000A00100003B0000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F7265736F75726365732F63
310
6F72652E786D6C8D50596E833010BD0A9ADFCA60B334011947A8694ED00B586642AC041B79A97AFC9A40A5F6AF3F33A3B7689E1E3F7DCD8FEC139DD7D6F4C0720A191A65476DA61E62B892236427C19DB5E1970C322367EC618541F0C9D9B8EC90B226A009093576C41D94DE63804C3DD2D18357379C652E63480A7FCF17A9
310
EE72C29CE5894E3AC17D702940B63D59270887DE46A7D0F36263058F518FBB468FE9A7BE6A7420864373B8D4873369AA8691FA421B3294352543C5CAF65C0F6FEF43CB8BD52C78D0F34F46E550061C419494B6843142CB0F5677F4B52BEB177AEC28E5C52AFF638ACBF84F53D42654E51E77B379102C05791282176B5F693D
310
CB4C7BED567C03504B010214000A0000080000CC70623B3DEE336E79000000790000001B00000000000000000000000000000000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C504B01021400140006080800CC70623BD486FD9CA0000000F40000001300000000000000000000000000B20000005B
310
436F6E74656E745F54797065735D2E786D6C504B01021400140006080800CC70623B1EC5D7A3EB0000007C010000080000000000000000000000000083010000636F72652E786D6C504B01021400140006080800CC70623B55019EA25F0000007C000000070000000000000000000000000094020000636E782E786D6C504B
310
01021400140006080800CC70623B8C9102E971010000D40300000C00000000000000000000000000180300006662782F636F72652E786D6C504B01021400140006080800CC70623BFFEA85907E0000009D0000000B00000000000000000000000000B30400006662782F636E782E786D6C504B01021400140006080800CC70
310
623B4FEEA4082C0100001202000031000000000000000000000000005A0500006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F636F72652E786D6C504B01021400140006080800CC70623BAD7543B64E010000330300003000000000000000000000000000D5060000
310
6662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F636E782E786D6C504B01021400140006080800CC70623B16AB87BA640500003C1000003400000000000000000000000000710800006662782F39464131463745442D413632322D343644302D413938332D3331353338
310
454246344243312F6F626A656374732E786D6C504B01021400140006080000CC70623B0000000000000000000000003500000000000000000000000000270E00006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F76657274696365732E62696E504B01021400140006
310
080800CC70623BF270F133060000000400000036000000000000000000000000007A0E00006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F747269616E676C65732E62696E504B01021400140006080000CC70623B0000000000000000000000003700000000000000
310
000000000000D40E00006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F617474726962757465732E62696E504B01021400140006080800CC70623B08DA0BD190000000410100003600000000000000000000000000290F00006662782F39464131463745442D413632
310
322D343644302D413938332D3331353338454246344243312F6469726563746F72792E786D6C504B01021400140006080800CC70623B0D6EF93BFE000000A00100003B000000000000000000000000000D1000006662782F39464131463745442D413632322D343644302D413938332D3331353338454246344243312F7265
310
736F75726365732F636F72652E786D6C504B0506000000000E000E0080040000641100000000
0
XRECORD
5
175
102
{ACAD_REACTORS
330
173
102
}
330
173
100
AcDbXrecord
280
1
270
1
271
1
0
XRECORD
5
174
102
{ACAD_REACTORS
330
173
102
}
330
173
100
AcDbXrecord
280
1
270
1
271
1
0
XRECORD
5
1FB
102
{ACAD_REACTORS
330
173
102
}
330
173
100
AcDbXrecord
280
1
70
0
90
1673772943
1
ECE7A1D2-D628-4531-984C-D00F80459256
310
504B03040A0000080000CC70623B3DEE336E79000000790000001B0000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574662D3822203F3E3C666F726D6174733E3C666F726D61743E687474703A2F2F736368656D612E
310
6175746F6465736B2E636F6D2F64657369676E2D7061636B6167652F323030393C2F666F726D61743E3C2F666F726D6174733E504B0304140006080800CC70623BD486FD9CA0000000F4000000130000005B436F6E74656E745F54797065735D2E786D6C7D8EC10E82300C865F65E91D8A1E8C310C0EEA1BF002731658846E
310
D98AC1B77784ABF1D8FE5FBFBF75BBCE937A534CCEB38643598122B6FEE978D0B0485F9C41B54DDD7D022595594E1A469170414C76A4D9A4D207E29CF43ECE46F218070CC6BECC4078ACAA135ACF422C856C0E68EA1BF5669944DDD7BCDE7B1F8E415D77AECB980613C2E4AC91FC167A2B244592486606FC29C8FD7F045B9A
310
EF7053A7E60B504B0304140006080800CC70623BD9DDAED0EC0000007C01000008000000636F72652E786D6C8D90416EC3201045AF82665B61836D9CD8C2444DD39CA01740405C94182C03558F5F9C3852BBEB6A467FFE9B197D7EF89E6EE8CB2CC17A37002D0820E394D7D68D03A478C17B4007C117EFE32F1B20272733C0
310
2A83E0E3E2D3BC49CABB685CCCAAF3DA6CA20CC14440EA969B0182FA34932C648AD911AEC52CD5558EA6A0CF2EC329598D1E47ACCEFBECC59A050463A7EA5833865FEBDD0E37353BE3EE8DBDE3F6786A48D375FBF6CC78B9C282473B3DEFABC5C86834888A900E538A49F5419B9EB47DD5BC907D4F082F57FB1F28CDFA9F50
310
B22ED6D5F6EE030B20687EE43E10BC5CB3C8E51E54AE6B6EE207504B0304140006080800CC70623B55019EA25F0000007C00000007000000636E782E786D6C4DCB3B0E80201045D1AD90E915ED2CF8AC45050C11660C8261F98AB1B07AC9C97D42D718D865D3E909258CFD00CCE24AC6E326A164D74DC0B4128928FF326038
310
472BA13128B1252AC747C6BAB984FC68F0B87FE8960A5C09FE86CFB69FBA01504B0304140006080800CC70623BA24EB22D72010000D40300000C0000006662782F636F72652E786D6CC5535B6E833010BC8AE5DF0A6C5E49888CA3A6694ED00B38E05014B091B1518EDFE511A5A9D228FD2A1F60CDEC7A67C6986DCE4D8D7A
310
69BA4AAB0C073EC548AA5C17952A33ECECD15B61B4E1CC686DBF9561A44423333CC098B3D268D7CE50AE9595CA02AA74216750749DB418E5352C32DCE59FB211BE70162ABA93DF8AFC244AE9073ED050C759670D0840D390E18DF9F1706664C23973AE2A66B62A605A75ACA4C13C4976E1364A12EF355A2EBD384AF65EFA96
310
BC7B8BED2EA6719AAE16FB8491A199335B351775B991C2CA02F390D2D40B028F861F41BCA68B7518BFD0D59A524686F29B26D7164F36B94AD9289CE54E6D1DE6010819891F6E21228B3AD1831EC219194284CF98F06DD01008846CC5A1BEF83801D4CBDC6A1303536877A57A513B0953A94FC707FDBE6064EA84A9E3E6E0FA
310
EE8CF0E9198F7784A316AA0413C2C2F2E0ECA0934D1AE6D05A69BCDE9E91D2A611F573361E38FC1375157F5752AE6B6DFE4B11990F88CCBF0719EE23FF02504B0304140006080800CC70623B408A7D3B7C0000009D0000000B0000006662782F636E782E786D6C4DCCD10A83201886E15B91FFDC552A92A0064DBC8F581632
310
D3703A76F9ABD1C18E3E78F878E5F0D9027ABBFCF2292AE86E2D20171F69F6715550CB827B40839639A5F2770314A7CD293819B45C73AAFB45B35BA61ACAA1C1C7E7855C58C15BC331339661262CC762340413D68D77DA5B42298546CBE6573AF60CEB2F504B0304140006080800CC70623B449FB9BD290100001202000031
310
0000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F636F72652E786D6C8D515B6EC32010BC0AE22B55850D98B871848994463E412FE002495162B07854397EA176A4F62F3F2C9A9D991D587EB84F37F0AD7D30CEF6905418026DA553C65E7A98E219ED203808EE9D
310
8B7F6810D871D23D2C3014FCE25D9A57483A1BB58D19B54EE9151C43D0110279CB971E06F9A5A7B11A53CC8C70ADE6515EC78BAE4895DB992778883E0700CB907242D17643D7E2538BD869608875438BBAE38922CAC8F1BDD90DB4691A5E2F42C153326A951B95E398B3D1FE599322163C9AE9115F7A3D46ADA0A018778810
310
84E907617BDCEE297BC5BB3DC6BC2EF47FA234AB2745C9D8D8D035EE220B50105E2F0DC1954B9FB747187D9F9D8FA0CCDB042D5FA0C015C65B42DF78BD10F3F3B363CB56C7109DCFDFBBB97E662ED92EB62D13BC2E1BCAE5777DB9966D8A1F504B0304140006080800CC70623BAD7543B64E01000033030000300000006662
310
782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F636E782E786D6CD593CD6EC32010845F0571AD6CE3D48AD20813A9873E410FBD12D82434182C7EAAE6EDBB2424CD25871E7B41D6EC30B3FA84F9E67BB2E40B4234DE8DB46F1925E094D7C6ED479AD3AE5951B2113C789FEE
310
6C943839C1488B4C05DF079FE72A69D8C96C13AAD6B8631503449F83828872B949AC57D26200B826A308D316B4064D6E46FCDA41C05550DC9E483A00797BFD207EFB092A45DE9514C1BBD22178396BD39D891265658C238DEA00936C654E5E433CB65A26D9F6EDB5EBC14EBF49A45CB856E66048291F6939A9A81BB5C89177
310
38143CA680F4AA299D66A042CEB3354A2684DC9D8D178FE0D9B8B41CAAD720F880EE7EF93C0C18769E099ECC04D5A102C8049A8A05632F4DDF376CF1DE0F6BB65C2F8627B65A33C6BB62177CEBBDAD973006829F89F22E814B54F4BC2BE347F8AA8F681390B50FA73F804400B5F542E796F19FF974E7F78DB802FE05E20750
310
4B0304140006080800CC70623B8D05915C650500003B100000340000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F6F626A656374732E786D6CAD575B6FA33814FE2B887D06429276DA1565D4266D158D3A339A6846FB502932E050B66023DB74D2FDF5FB190C01
310
9276B2973C046C8ECFF53B17071F77456EBD502133CEAE6CDF9DD81665314F32965ED995DA3A17B6F5310C04E7AA47665B8C14F4CAD6DB7618A48257A5D94AE89654B91AEDDEDDFC61C998326A5B714EA4BCB265FC440BE2924AF184CA6737218AB8E976E7FA6E4338649B0A523E8D98964450A6A029F619B8588D52FE7039
310
B1BD30F0F4F730D0FF866AF6369557DB33949F31A9088B0F848DD8CCFCF9F2767A76E99CCDE733677E3EF59D9BBB9BA5E37F984D16E78BC5E5F5ED25044B25C0C96822E8D60EEFE11B91C581D77CEA34368A1F5329E68CD1B8B61F16D63A1B8E092D294B10C78C4A48EB593D192E7DED9BDEE7995E1B91FDEDD3ACEA9FE831
310
6A756F9F7D4D79F4274C90A7A04248AA51D5F8C718DAE06FB2F75AC4796EBE65D22A88A22223B995679120E2D50E41AA49C260C046A35368846B0BECD0DFF3EBEB8AD4F835768F69B9ADF25C43D30E6B646F807FAA64AD59F61715C7A54127C4AACA98BA3006A9D792DAE165E0D59B61A01FB3A9F9D838D2DAE62445C86166
310
F37564E842E7DE6A69879FEEA2DD5AE7E371E1A5E025154AC307D06A03D73EB5978C58FFA4C8E9033066E0F3BD53BEC1F39F91BE7B55103791EDE6BBB991A2046172CB4581D8B893FA674DDA17A77B3B7C413D1B511FD2743BFF8A38F03A658705E3ADF8015C3A3417FF3D7E439FF591DA0B5F18BC20C1B8981957AE6392A3
310
F43C640C01D1A0B4728E2DD4F26DB4B3C3152A252A3B4E913CEC1C72F012782FF88EFF8637AA552DBEF76408E8A8DE9E50F9E1CB3A2DA0DB1B6039A893B56063DC5B3E3FFB5F72E67AB9FEB4AEC496C4F4C1149625DD662C53E89D7BF0F6151A046260D1337DFDC94502430F83B0EE07A130A224BCAD7DAE1D9FB6CD422FF6
310
920702629C4BB9AE79C12F243C6432A6794E18E5552BA56B431AAB5D91317302B2B071E86C3A42B1A02F999E24061403B5D0EB639195DA655DD3EBEAB4FB862DDF579F014AD0E73C22F99E28DA57FB98E75C6CA2D74D53086D600F4786E0FE3144B771A8A7B900F03594DB8A633CBC49B2EDB69228BB479CF863B5E807AAAB
310
23872F6DFEB4129B949CA33823F58830E86D65621E10047D9DB34D862E8EAC3C2ABC2F7B2C40D67CDFE01F5545B92105AF983AC54D93D69E56FB8E797F88913F898A9FEC705D3F9D1B54EC8426FB500D40A03BD0119B06E1B95DDC7EB8F6975367793EBD70E66733DFB9BC982F9CE564727731999F5D4ECFCE3B8D6A4DC2A0
310
6D50FD148437D110834A64C6CDDF57FBACB5C307A2A477DFE4939736CFEF2B175371E0E10CF0DD1D5C15654E0BCA14D1E87DD02FF93782A162C0A3D95F1524A52770F972BF1EE9809D13CE7DD599467F8ECE9ADD85CE85A34CD45355448C64F9E8A031DC2D596ACC6E5DD93D9B82DE2EF5CAF81363A8E47996A0DE24564A79
310
4115AACE09C55E14540231FDA13C319787134EBF34E3A022514E5B4D9E0826E25C02D5805B15ABE1BEF51B26383D445DD9E875EE33FE4C22DA16427D65A3BCA92CA6D28DD01DF5DC53330704308475351050232CCD31583787BA75774AFB06E5070DD0C8EF484E19968C5D83BA5B90B244D31E54D55A372320FE4786B7EA58
310
44E135AA5467CB7EA333A61683CC6A8C3257034C10CF46F40EF9F5BE59BE5BD30C3C72D235E95D10345C1D45445A5F0BB47E46A5EBE5570F9380B5FA629579952296A773720405982B9DE04011506178964401AA8BDF1FBF0A8EAB6861DD6580C0E38217056766716DAEB2D6FA0917D3E4116581EADB879C4E7CFFB11EFACD
310
3D641311495D92C8676CB409A72D18610D803CE8A626049E8EC1887CB5B44CC39883690DDA8399B4B9855B481E7D71D4A9D22F96E5BB73BF5793020C02137BF837504B0304140006080000CC70623B000000000000000000000000350000006662782F36394639363044362D344446342D343946362D394244322D32343142
310
43333846323333332F76657274696365732E62696E504B0304140006080800CC70623BF270F1330600000004000000360000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F747269616E676C65732E62696E636660600000504B0304140006080000CC70623B0000
310
00000000000000000000370000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F617474726962757465732E62696E504B0304140006080800CC70623B08DA0BD19000000041010000360000006662782F36394639363044362D344446342D343946362D394244322D
310
3234314243333846323333332F6469726563746F72792E786D6C858F410AC3201045AF22B36F53E9A60B35CBEEBAE80D244E44489C6234F4F835464A48035D0DF398FF9F8AF63D0E6CC63039F212F8F9020C7D47C6792B21C5FE7403D62A1188E2E60C98D7234A5830286103A55745067B9D86B8A3CF9C7F90C11DE607FB14
310
4396D7B6A82D282E9A152AD114D5EF2CB866EEE831B8EEA07A7BB5A8D7D61A2BAAEB7FD5F70921FF497D00504B0304140006080800CC70623BCA768048FE000000A00100003B0000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F7265736F75726365732F636F72
310
652E786D6C8D50596E833010BD0A9ADFCA60D600328E9AA639412F609909B1126CE4A5EAF16B0295DABFFECC8CDEA2797AECF8353F924FB44E193D409E5248504B332A3D0D10FC95B4901C39B3C6F85F3248B49871801506CE266BC2B243D2688FDA47549B11775038871E12F988C7004EDE7016A9083E2ADC3D5D84BC8B09
310
D33C8D74D471E6BC8D0192EDC93A815B742658898E651BCB59086ADC356A8C3FD555A1055ED7E7E254D615792D0F075295F585746FF53B694EE78A565DD736979A65AB9933AFE69F8CD2A2F038022F28ED489E135A7CE4554F9BBEA85E68DB53CAB255FEC71496F19FA6A0B42F8B3DEE6673C0F318E4497096AD7DC5F52C33
310
EEB55BFE0D504B010214000A0000080000CC70623B3DEE336E79000000790000001B00000000000000000000000000000000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C504B01021400140006080800CC70623BD486FD9CA0000000F40000001300000000000000000000000000B20000005B436F
310
6E74656E745F54797065735D2E786D6C504B01021400140006080800CC70623BD9DDAED0EC0000007C010000080000000000000000000000000083010000636F72652E786D6C504B01021400140006080800CC70623B55019EA25F0000007C000000070000000000000000000000000095020000636E782E786D6C504B0102
310
1400140006080800CC70623BA24EB22D72010000D40300000C00000000000000000000000000190300006662782F636F72652E786D6C504B01021400140006080800CC70623B408A7D3B7C0000009D0000000B00000000000000000000000000B50400006662782F636E782E786D6C504B01021400140006080800CC70623B
310
449FB9BD290100001202000031000000000000000000000000005A0500006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F636F72652E786D6C504B01021400140006080800CC70623BAD7543B64E010000330300003000000000000000000000000000D20600006662
310
782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F636E782E786D6C504B01021400140006080800CC70623B8D05915C650500003B10000034000000000000000000000000006E0800006662782F36394639363044362D344446342D343946362D394244322D32343142433338
310
46323333332F6F626A656374732E786D6C504B01021400140006080000CC70623B0000000000000000000000003500000000000000000000000000250E00006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F76657274696365732E62696E504B010214001400060808
310
00CC70623BF270F13306000000040000003600000000000000000000000000780E00006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F747269616E676C65732E62696E504B01021400140006080000CC70623B00000000000000000000000037000000000000000000
310
00000000D20E00006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F617474726962757465732E62696E504B01021400140006080800CC70623B08DA0BD190000000410100003600000000000000000000000000270F00006662782F36394639363044362D344446342D
310
343946362D394244322D3234314243333846323333332F6469726563746F72792E786D6C504B01021400140006080800CC70623BCA768048FE000000A00100003B000000000000000000000000000B1000006662782F36394639363044362D344446342D343946362D394244322D3234314243333846323333332F7265736F
310
75726365732F636F72652E786D6C504B0506000000000E000E0080040000621100000000
0
XRECORD
5
176
102
{ACAD_REACTORS
330
173
102
}
330
173
100
AcDbXrecord
280
1
270
1
271
1
0
XRECORD
5
177
102
{ACAD_REACTORS
330
173
102
}
330
173
100
AcDbXrecord
280
1
270
1
271
1
0
XRECORD
5
2B6
102
{ACAD_REACTORS
330
234
102
}
330
234
100
AcDbXrecord
280
1
102
DISPLAYNAME
1
Metric50
102
FLAGS
90
0
0
CELLSTYLEMAP
5
27C
102
{ACAD_REACTORS
330
162
102
}
330
162
100
AcDbCellStyleMap
90
3
300
CELLSTYLE
1
TABLEFORMAT_BEGIN
90
5
170
1
91
0
92
32768
62
257
93
1
300
CONTENTFORMAT
1
CONTENTFORMAT_BEGIN
90
0
91
0
92
512
93
0
300
40
0.0
140
1.0
94
5
62
0
340
11
144
6.0
309
CONTENTFORMAT_END
171
1
301
MARGIN
1
CELLMARGIN_BEGIN
40
1.5
40
1.5
40
1.5
40
1.5
40
4.5
40
4.5
309
CELLMARGIN_END
94
6
95
1
302
GRIDFORMAT
1
GRIDFORMAT_BEGIN
90
0
91
1
62
0
92
-2
340
14
93
0
40
1.125
309
GRIDFORMAT_END
95
2
302
GRIDFORMAT
1
GRIDFORMAT_BEGIN
90
0
91
1
62
0
92
-2
340
14
93
0
40
1.125
309
GRIDFORMAT_END
95
4
302
GRIDFORMAT
1
GRIDFORMAT_BEGIN
90
0
91
1
62
0
92
-2
340
14
93
0
40
1.125
309
GRIDFORMAT_END
95
8
302
GRIDFORMAT
1
GRIDFORMAT_BEGIN
90
0
91
1
62
0
92
-2
340
14
93
0
40
1.125
309
GRIDFORMAT_END
95
16
302
GRIDFORMAT
1
GRIDFORMAT_BEGIN
90
0
91
1
62
0
92
-2
340
14
93
0
40
1.125
309
GRIDFORMAT_END
95
32
302
GRIDFORMAT
1
GRIDFORMAT_BEGIN
90
0
91
1
62
0
92
-2
340
14
93
0
40
1.125
309
GRIDFORMAT_END
309
TABLEFORMAT_END
1
CELLSTYLE_BEGIN
90
1
91
1
300
_TITLE
309
CELLSTYLE_END
300
CELLSTYLE
1
TABLEFORMAT_BEGIN
90
5
170
1
91
0
92
0
62
257
93
1
300
CONTENTFORMAT
1
CONTENTFORMAT_BEGIN
90
0
91
0
92
512
93
0
300
40
0.0
140
1.0
94
5
62
0
340
11
144
4.5
309
CONTENTFORMAT_END
171
1
301
MARGIN
1
CELLMARGIN_BEGIN
40
1.5
40
1.5
40
1.5
40
1.5
40
4.5
40
4.5
309
CELLMARGIN_END
94
6
95
1
302
GRIDFORMAT
1
GRIDFORMAT_BEGIN
90
0
91
1
62
0
92
-2
340
14
93
0
40
1.125
309
GRIDFORMAT_END
95
2
302
GRIDFORMAT
1
GRIDFORMAT_BEGIN
90
0
91
1
62
0
92
-2
340
14
93
0
40
1.125
309
GRIDFORMAT_END
95
4
302
GRIDFORMAT
1
GRIDFORMAT_BEGIN
90
0
91
1
62
0
92
-2
340
14
93
0
40
1.125
309
GRIDFORMAT_END
95
8
302
GRIDFORMAT
1
GRIDFORMAT_BEGIN
90
0
91
1
62
0
92
-2
340
14
93
0
40
1.125
309
GRIDFORMAT_END
95
16
302
GRIDFORMAT
1
GRIDFORMAT_BEGIN
90
0
91
1
62
0
92
-2
340
14
93
0
40
1.125
309
GRIDFORMAT_END
95
32
302
GRIDFORMAT
1
GRIDFORMAT_BEGIN
90
0
91
1
62
0
92
-2
340
14
93
0
40
1.125
309
GRIDFORMAT_END
309
TABLEFORMAT_END
1
CELLSTYLE_BEGIN
90
2
91
1
300
_HEADER
309
CELLSTYLE_END
300
CELLSTYLE
gitextract_41kwzyiw/
├── .gitignore
├── LICENSE
├── README.md
├── kernel-patch/
│ ├── 0001-HID-lenovo-Rename-hid-lenovo-tpkbd-to-hid-lenovo.patch
│ ├── 0002-HID-lenovo-Prepare-support-for-adding-other-devices.patch
│ ├── 0003-HID-lenovo-Style-fixes.patch
│ ├── 0004-HID-lenovo-Add-support-for-Compact-BT-USB-keyboard.patch
│ ├── 1001-HID-lenovo-Move-USB-KEY_FILE-to-0x00f9-to-prevent-sc.patch
│ ├── 1002-HID-lenovo-Don-t-set-EV_REP-to-avoid-repeating-mice-.patch
│ ├── 2001-HID-lenovo-Add-sensitivity-control-to-compact-keyboa.patch
│ ├── 2002-HID-lenovo-Use-native-middle-button-mode-for-compact.patch
│ ├── 3001-HID-lenovo-Use-constants-for-axes-names.patch
│ ├── 3002-HID-lenovo-Add-missing-return-value-check.patch
│ └── 3003-HID-lenovo-Hide-middle-button-press-until-release.patch
├── tp-compact-bt-keyboard/
│ ├── README.md
│ └── tp-compact-keyboard
├── tp-compact-usb-keyboard/
│ ├── Makefile
│ ├── README.md
│ └── tp-compact-usb-keyboard.c
├── tp-multi-connect/
│ └── README.md
├── tp-tablet2/
│ └── README.md
└── x1-tablet-keyboard/
├── README.md
└── tp-x1t-gen1-adapter.dxf
SYMBOL INDEX (2 symbols across 1 files) FILE: tp-compact-usb-keyboard/tp-compact-usb-keyboard.c function send_cmd (line 42) | void send_cmd(int fd, int arg1, int arg2) function main (line 60) | int main(int argc, char **argv)
Condensed preview — 23 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (335K chars).
[
{
"path": ".gitignore",
"chars": 177,
"preview": "/module/*.mod.c\n/module/*.cmd\n/module/*.ko\n/module/*.tmp_versions\n/module/Module.symvers\n/module/modules.order\n\n/linux\n/"
},
{
"path": "LICENSE",
"chars": 18026,
"preview": "GNU GENERAL PUBLIC LICENSE\n Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundati"
},
{
"path": "README.md",
"chars": 414,
"preview": "# Lenovo Thinkpad Keyboards\n\nRepository dedicated to using ~standalone Lenovo Thinkpad Keyboards, particularly under Lin"
},
{
"path": "kernel-patch/0001-HID-lenovo-Rename-hid-lenovo-tpkbd-to-hid-lenovo.patch",
"chars": 18669,
"preview": "diff --git a/Documentation/ABI/testing/sysfs-driver-hid-lenovo-tpkbd b/Documentation/ABI/testing/sysfs-driver-hid-lenovo"
},
{
"path": "kernel-patch/0002-HID-lenovo-Prepare-support-for-adding-other-devices.patch",
"chars": 3068,
"preview": "diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c\nindex 0320b96..a56b9e7 100644\n--- a/drivers/hid/hid-len"
},
{
"path": "kernel-patch/0003-HID-lenovo-Style-fixes.patch",
"chars": 938,
"preview": "diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c\nindex a56b9e7..f96bf09 100644\n--- a/drivers/hid/hid-len"
},
{
"path": "kernel-patch/0004-HID-lenovo-Add-support-for-Compact-BT-USB-keyboard.patch",
"chars": 13380,
"preview": "diff --git a/Documentation/ABI/testing/sysfs-driver-hid-lenovo b/Documentation/ABI/testing/sysfs-driver-hid-lenovo\nindex"
},
{
"path": "kernel-patch/1001-HID-lenovo-Move-USB-KEY_FILE-to-0x00f9-to-prevent-sc.patch",
"chars": 1579,
"preview": "From 40d0b99beb52e25a444b914e4986f6c33a43fee8 Mon Sep 17 00:00:00 2001\nFrom: Jamie Lentin <jm@lentin.co.uk>\nDate: Mon, 3"
},
{
"path": "kernel-patch/1002-HID-lenovo-Don-t-set-EV_REP-to-avoid-repeating-mice-.patch",
"chars": 1167,
"preview": "From 941f424a0e0a370727f8aaaafc2e289aa6187c9d Mon Sep 17 00:00:00 2001\nFrom: Jamie Lentin <jm@lentin.co.uk>\nDate: Mon, 3"
},
{
"path": "kernel-patch/2001-HID-lenovo-Add-sensitivity-control-to-compact-keyboa.patch",
"chars": 3004,
"preview": "From 5120cff1d8ebb1e8cc7d5dd1c2396f405ff23717 Mon Sep 17 00:00:00 2001\nFrom: Jamie Lentin <jm@lentin.co.uk>\nDate: Tue, 1"
},
{
"path": "kernel-patch/2002-HID-lenovo-Use-native-middle-button-mode-for-compact.patch",
"chars": 2771,
"preview": "From 6550fd74d659e44b8711534eea67fd8868d81a3b Mon Sep 17 00:00:00 2001\nFrom: Jamie Lentin <jm@lentin.co.uk>\nDate: Sun, 1"
},
{
"path": "kernel-patch/3001-HID-lenovo-Use-constants-for-axes-names.patch",
"chars": 951,
"preview": "From 2decbccdcfcfe19b35ed7424881d57213bfc5a17 Mon Sep 17 00:00:00 2001\nFrom: Jamie Lentin <jm@lentin.co.uk>\nDate: Sun, 2"
},
{
"path": "kernel-patch/3002-HID-lenovo-Add-missing-return-value-check.patch",
"chars": 1080,
"preview": "From 543e190688a51d947a024c011a09dbc6ed23a62b Mon Sep 17 00:00:00 2001\nFrom: Jamie Lentin <jm@lentin.co.uk>\nDate: Sun, 2"
},
{
"path": "kernel-patch/3003-HID-lenovo-Hide-middle-button-press-until-release.patch",
"chars": 3016,
"preview": "From 9a8c4f2d805fbc4589ab238e7f04cd1a34f5b922 Mon Sep 17 00:00:00 2001\nFrom: Jamie Lentin <jm@lentin.co.uk>\nDate: Sun, 2"
},
{
"path": "tp-compact-bt-keyboard/README.md",
"chars": 8457,
"preview": "# ThinkPad Compact Bluetooth Keyboard with TrackPoint\n\n[Images of BT keyboard internals](http://bdm.cc/2016/06/lenovo-bl"
},
{
"path": "tp-compact-bt-keyboard/tp-compact-keyboard",
"chars": 2928,
"preview": "#!/bin/sh\n\nif [ \"$1\" = \"--help\" ]; then\n cat <<EOF\nUsage: tp-compact-keyboard [OPTION...]\n\n--help\n Print this help"
},
{
"path": "tp-compact-usb-keyboard/Makefile",
"chars": 312,
"preview": "# kbuild trick to avoid linker error. Can be omitted if a module is built.\nobj- := dummy.o\n\nall: tp-compact-usb-keyboard"
},
{
"path": "tp-compact-usb-keyboard/README.md",
"chars": 2207,
"preview": "# ThinkPad Compact USB Keyboard with TrackPoint\n\n[Images of USB keyboard internals](tp-compact-usb-keyboard/)\n\n* **HID N"
},
{
"path": "tp-compact-usb-keyboard/tp-compact-usb-keyboard.c",
"chars": 2394,
"preview": "/*\n * Utility to play with Thinkpad compact USB keyboard\n *\n * Based on Hidraw Userspace Example\n *\n * Copyright (c) 201"
},
{
"path": "tp-multi-connect/README.md",
"chars": 1274,
"preview": "Thinkpad Multi-Connect Keyboard\n===============================\n\nThere is also another physically-identical keyboard, th"
},
{
"path": "tp-tablet2/README.md",
"chars": 2000,
"preview": "Thinkpad Tablet 2 Keyboard\n==========================\n\n* [User guide](https://download.lenovo.com/ibmdl/pub/pc/pccbbs/mo"
},
{
"path": "x1-tablet-keyboard/README.md",
"chars": 3189,
"preview": "# X1 Tablet Thin Keyboard (gen1 / gen2)\n\nA USB keyboard with a connector built-in to the hinge.\n\n. The extraction includes 23 files (296.1 KB), approximately 136.7k tokens, and a symbol index with 2 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.