Be notified of new releases
Create your free GitHub account today to subscribe to this repository for new releases and build software alongside 28 million developers.Sign up
This is primarily a hotfix release resolving issues reported by users.
- Removed unused testing packages mocha and chai. May add
jestfor tests at a future point in time.
- Now logging program version and displaying it on start view
- Subpixel anti-aliasing now working
- Tweaked search bar padding and alignment to look a bit cleaner
- Fixed tree search allowing searching by partial formID match
- Fixed bug with exact match searching (made searching by FormID completely not work)
- Fixed issue with dragging and dropping elements, see #57
- Now copying node values to clipboard when copying them
- Scroll now resets properly when user opens a new record
Referenced By View
- Fixed a bug with closing the view which caused it to not be cleaned up properly.
- Fixed progress window not being focusable
- Now using
loggerfor logging, that means colored warning/error messages and logs will be written to disk automatically
- Added delay to progress-error alert so last progress message displays
- You can now use r`raw\string\here` to make a raw string. Raw strings treat backslashes as literal backslashes.
- Resolved issue with uninstalling modules, see #64
- Now logging module versions when loading them
interApiService. This is technically a breaking change but there wasn't any code outside of zEdit core code using the
interApiServiceto my knowledge.
- Breaking change to the scripting API! Some functions were moved around a bit.
zeditnow contains services directly instead of the services mapping their functions into a top-level namespace. Use a destructuring assignment at the beginning of your script to access the services you need. Example scripts in the repo have been updated to work with this change.
- See the UPF v1.4.1 changelog
- Fixed the majority of "form submission cancelled" console warnings. There may be a few I missed.
- I'm no longer going to be uploading x86 builds for non-milestone releases of zEdit (when only last version number changes)
- Updated files without version change to fix issue with zClean freezing on "Done loading plugins". (6/5/2018 16:37 UTC-08:00)
- Added copy + paste functionality
- No longer starting inline cell editing on mouse drag
- Added enum selection to inline value editing
- Added option to toggle visibility of unassigned fields
- Added hide non-conflicting rows
- Fixed some exceptions when opening context menu
- Pasting elements copied from record view into tree view records working
- Now updating tree view when user drops in record view
- Added option to open record in new record view
- Fixed a bug with piping alert and confirm to the progress window, it now works properly
- Improved how progress bar completion is determined.
- Now throttling progress messages
- Fixed label bug when no long label is provided
- Fixed leaky handles when resolving custom scope
- Improved Conflict Status test to handle xelib.GetNodes/GetElement failure
- apiItems directive now allows specifying module - it can now be easily used for module documentation without requiring a controller
- Added support for optional icons and legacy entries in apiItems
- Module documentation topics can now be registered through a
docs\topics.jsonfile. This allows developers to create documentation for modules that don't use
ngapp, and allows module documentation to be added to the zEdit website almost entirely automatically.
- Exceptions when loading deferred modules should now create alerts instead of causing the application to silently fail to initialize.
- Scrollbar size is now reasonable on 4k monitors
- Removed scrollbar arrow buttons on dark theme (they were too hacky)
- Added support for getting stack traces from
- Modules are now named in stack traces
- Upgraded to electron 2.0.0
- Now 64-bit - fixes white screen of death issues
Referenced By View
- Fixed scrollbar not being the height of the view
- Progress bar now becomes green when progress is completed and red when there's an error
- Fixed issue with error alerts being unclickable for certain users
- Added support for
--inspector-fixtarget line param, which fixes the inspector being unclickable for certain users while the progress window is open (this is done by making the progress window non-modal, and should only used in development)
- See the xelib v0.4.1 changelog
- Updated several vulnerable packages
- Added conflict losers filter
- Error messages now include stack information
- Fixed clicking scrollbar closing modals
- File selection fields now filters based on whether or not the file starts with the entered text
- Fixed Fallout 3 and Fallout NV load order
- Added continuous logging to the application. Now we'll have logs to work with even if the application crashes unexpectedly.
Manage Extensions Modal
- Fixed exception when installing a module/theme
- Fixed bug with clicking module names trying to open undefined repository URLs
- Now handling installation of improperly packed modules
- Fixed issue with Font Awesome icons not displaying correctly
- You can now use the
--disable-transparencytarget line parameter to disable Progress Window transparency. You must use this if you have Aero disabled (e.g. when using a basic theme in Windows 7/8/10), else the progress window will not display (making the application seem to be completely frozen).
- No longer allowing
confirmto be called while progress window is open
- Created a basic log view which displays the contents of the application log (with colors!)
- Ctrl+B hotkey for building references now works
- Fixed double click to open record not working
- Fixed element deletion bug
- Added support for basic inline value editing, including reference editing (press Shift + Enter or click a selected cell to edit it inline)
- Left and right arrow keys now navigate between cells
- Ctrl+Right expands cell, Ctrl+Left collapses it
- Ctrl+Shift+Right expands a cell and all of its children
- Fixed issue with being able to open the edit value modal for cells that don't have an element (e.g. in sorted arrays)
- Insert hotkey now works for adding elements
- Fixed size arrays now use labels properly
- Ctrl+A no longer opens the record address bar
- F6 now properly opens and focuses the record address bar input
- Address bar no longer clears history when it is closed
- Fixed some bugs with following references with Ctrl + Click
- Fixed element deletion bug
Edit Value Modal
- Fixed issue with some keys not working
Referenced By View
- Fixed issue with new referenced by views not linking to record views automatically
- Fixed linking/unlinking referenced by views and record views
- Now displaying a helpful message when there are no entries on the referenced by view and the user hasn't built references for all files
- Fixed button labels (had two "OK" buttons)
- Adjusted style
- New service which provides a function to determine when a plugin is an official Bethesda File
- New service which provides functions for tracking time.
- Added functions
- New service which allows modules to publish functions to be used by zEdit scripts and UPF patchers
- Added pipe syntax for element resolution. This resolves the first path fragment which exists. E.g.
xelib.GetElement(rec, '[BODT|BOD2]');gets the BODT or BOD2 element from record
- Fixed Add array value functions ignoring last value argument
- Updated XEditLib.dll with optimizations and fixes (see the full changelog)
- Also see the xelib v0.4.0 release notes
timerServicefunctions are now accessible from scripts
- Now using a more flexible syntax for passing arguments to module loaders.
- Updated to v1.2, see the full changelog.
- Added documentation on
- Fixed description copypasta error for
- Added a page about debugging modules
xelibpaths documentation and moved it to its own page
- Added advanced record search/filtering.
- Now able to build reference information for plugins. You can right-click on a plugin in the tree view and click the "Build References" item to build references for it in the background. You can view records and use zEdit like normal while references are being built.
- Added the Referenced By View, which operates pretty much identically to xEdit's Referenced By tab, except it has custom column support.
- Tabs now display an icon and information relative what they're displaying.
- Added refactor modals for refactoring records/files.
- Added type-to-navigate to the tree view.
- Record view now supports dynamic linking - you can now unlink record views and link them to different tree views using the link/unlink buttons in the address bar.
- Fixed a bug with resizing record view columns calculating cursor position incorrectly.
- Fixed some issues with the progress window not staying above the application window/being sized incorrectly.
- Added functionality for saving a plugin at a specific file path.
- Fixed sorting of scripts on the automate modal (recent sorting works now).
- Name column on the tree view now displays placement name for placed objects.
- XEditLib.dll is now bound from a native Node Addon. This slightly reduces the overhead on all
This release introduces a new application mode, the Clean mode. You can select the application mode from the dropdown on the start view. zClean provides a streamlined experience for cleaning plugin files.
NOTE: zClean is still unstable, and should only be used for testing purposes. It is highly recommended you do NOT use zClean to clean plugins for a playthrough until we've worked through some of the issues associated with it.
- Select the zClean application mode on the start view and a profile of your choosing, then click the Start Session button.
- Select the plugins you want to load in the load order modal. You don't need to clean all of the plugins you load, but there's no reason to load plugins you don't want to clean.
- Wait for the loader to complete, then review the plugins list. Cached errors may be loaded for certain plugins. Shampoo ships with error cache files for DLC ESM files for all games, but whether or not you clean these plugins is up to you. You can toggle a plugin to be checked for errors/skipped by clicking the "Process"/"Skip" button on them.
- Click the Check For Errors button.
- All errors that are found will be given automatic resolutions by default. You can expand errors groups in plugins to view the error messages, and set individual resolutions.
zClean caches errors using plugin filenames and MD5 hashes. This means you shouldn't have to check a plugin for errors twice. Note that, if a plugin is changed the MD5 hash will change and the error cache will not be used (that includes when you resolve errors in the plugin).
- Added documentation for the clean application mode and associated views.
- Added documentation for the Referenced By View
- Added documentation for the
- Added documentation for the
- Added documentation for "common" xelib record value functions
The biggest changes in this release are the help modal (which provides documentation), the manage extensions modal, and record copying support.
- Now closing modals when a user clicks and releases the mouse outside of the modal.
- Themes and syntax themes are now placed in folders in the application's root directory instead of being packed inside the
- Tweaked some theme colors.
Manage Extensions Modal
This is a new modal for managing installed modules and themes. I hope to have a way to browse and install modules and themes from a registry similar to what Atom does at a future point in time. The manage extensions modal:
- Can be opened by pressing Ctrl + Shift + E or by clicking the three squares button on the title bar.
- Displays information about currently installed modules on the Installed Modules tab.
- Displays information about currently installed themes on the Installed Themes tab.
- Allows you to uninstall modules and themes.
- Allows you to set the active theme.
- Allows you to install modules and themes from archives/files.
Help Modal (Documentation)
The Help Modal displays help topics and documentation from within the application. There are plans to make the documentation viewable outside of the application. Search functionality is also planned.
Documentation for the core application covers all functionality, but could use some more detail in certain areas. Developer documentation is still being built, but is fairly complete for developing scripts and basic modules (such as UPF patchers).
The help modal:
- Can be opened by clicking the question mark button in the title bar.
- Displays a tree of help topics which you can navigate.
- Allows you to navigate through previously viewed help topics.
- Offers an API so module developers can add documentation for their modules to it.
Load Order Modal
- Fixed load order case sensitivity which was causing plugins to be disabled when they shouldn't be
- Fixed tooltips not being displayed properly.
- Fixed bug in XEditLib with releasing handles which was causing missing data in the tree view
- Fixed tree search not using the progress window properly
- Added full copy-paste support with hotkeys.
- Enable Editing, Clean Masters, and Sort Masters context menu items now work.
- Added hotkeys:
- Insert - creates a new child element in each selected node, if possible. Creates a new file if no nodes are selected.
- Ctrl + M - opens the automate modal.
- Ctrl + E - enables editing of the selected files, if possible.
- F2 - opens modal to rename the selected file.
- Alt + Shift + R - opens modal to rename the selected file.
- Fixed bug with element names not lining up for certain records.
- Fixed bug with how the the
reloadGUIevent was handled.
- Added support for following references using Ctrl + Click
- Added hotkeys:
- Enter - opens the selected value in the edit value modal, if possible.
- Delete - deletes the selected element, if possible.
- Insert - creates a new element at the selected cell, if possible.
Edit Value Modal
- Fixed color sample height when editing color values
- Added hotkeys
- Ctrl + Enter - Applies the value.
- Ctrl + S - Applies the value.
- Escape - Closes the modal without applying the value.
- Fixed access violation issue which sometimes occurred when returning strings.
- Fixed ITPO detection.
SetLinksToargument order to be consistent with other functions.
SetLinksTonot resolving the passed path.
- Added default empty path arguments to
- Renamed functions
- Added functions
SetHexFormID. What we were calling "local" form IDs were really "file" or "native" form IDs, so I refactored the argument from
localargument which actually gets a local form ID (local form ID excludes load order prefix, is only valid on master records).
- Several functions no longer raise exceptions by default
- Now saving script changes before closing automate modal, including when the script is executed
- Fixed issue with renaming a script before saving it
- Fixed issue with code mirror editor scrollbar appearing above the dropdown
- Fixed issue with clicking in script filename input opening the select script dropdown
- Added a button to delete the selected script
- Added hotkey support
- Ctrl + S - saves the selected script.
- Ctrl + N - creates a new script.
- F2 - focuses the script filename input so you can rename the selected script.
- Ctrl + Delete - Deletes the selected script.
- Ctrl + Enter - Runs the selected script.
Updated to v0.5. See the changelog here.
This is a quick little release that fixes some bugs that were reported shortly after the release of v0.1. It also addresses a few minor UX issues.
- Fixed issue with edited text values not saving properly (#17)
- Hopefully fixed all issues with load orders for all games
- Increased width of the load order modal and disabled wrapping of filenames (they will now be truncated with an ellipsis)
- Added some padding to the profile select so profile names don't end up going over the dropdown triangle thing
- Fixed issue with reference searching being broken
- The edit reference modal now allows you to specify a signature to target when searching. This dramatically improves the speed of searching when dealing with unchecked FormID values (e.g. in papyrus script properties)
- Fixed autocomplete input hotkeys not working
- Increased width of the edit reference modal and reduced font size of dropdown results.
- Updated packaged UPF core module to v0.3.2. You can see the UPF changelog here for more details.
This is the second alpha release of zEdit. This release is similar to the previous alpha release in that a lot of planned functionality is still not included. Please see the v0.0.1 release notes for information about currently non-functional/planned features.
Below is an overview of the features and fixes that were added in this release.
- Added support for custom themes and a dark theme.
- Added support for custom syntax themes and all of the themes that were packaged with CodeMirror.
- Created module system which allows developers to create modules to extend or add functionality to zEdit. Currently available APIs allows modules to:
- Register new context menu items
- Create new modal views, with angular controller logic
- Create new primary views (like the record view and tree view)
- Create angular services, factories, filters, and directives
- Use existing angular services, factories, filters, directives, and modal views
- Register tabs on the settings modal
- Run code on application initialization (via
- Register code to respond to certain application events
- Check for the presence of other modules
- Register custom module loaders
- Future planned APIs will allow modules to:
- Add buttons to the title bar
- Register new hotkeys
- Disabled user select for the entire application (I don't think there's any part of the app people should want to copy paste asides from input/textarea fields, or areas that will be covered by export features in the near future.)
- Fixed profile saving/loading bug
In this release we added our first core module, UPF, the zEdit Unified Patching Framework. UPF is a framework similar to SUM - it manages and executes patcher modules. You can find an example UPF patcher here on GitHub. UPF boasts a number of features which makes it arguably better than MXPF and SUM, including:
- Generic progress modal display.
- The ability to build multiple patchers into a single patch plugin file
- A single Manage Patchers modal where a user can adjust the settings of their patchers, disable patchers, and build patch plugins. Patchers can register tabs here with an HTML template and an angular controller.
- Full access to
- A highly structured patcher format which makes creating patchers faster and less repetitive.
failthrowing a string instead of an error object.
- Embedded games and game modes in xelib
deepCopyparam which wasn't present in XEditLib
- Fixed issue with record resolution by FormID which affected many functions.
- Renamed functions:
- Added functions:
- and about 50 record value functions
- Refactored to use
importsinstead of file concatenation.
- Added Fallout 3 and Fallout New Vegas logos
- Fixed Fallout NV logo showing when selecting 'none' as profile
Load Order Modal
- Now knows the master requirements of different files. When you enable a file all of its masters will be automatically enabled as well. When you disable a file, any files that require it will be automatically disabled as well.
- When the modal initializes it will automatically enable/disable files if necessary to create a valid load order.
- Files which are required as masters by other files which are enabled will appear green. Hover over them for a tooltip about which files require them.
- Files which cannot be loaded due to their masters being unavailable will appear red, and will be disabled. Hover over them for a tooltip about what masters are missing.
- Fixed bug with SSE/FO4 active plugins not including base ESMs by default
- When resizing a region using a split bar we now display the appropriate cursor regardless of what the user's mouse is over.
- Created Add Masters context menu option and modal.
- Fixed a bug which happened when deleting the last element in the tree.
Edit Columns Modal
- Fixed bug with being unable to close the modal unless a column was selected
- Improved UX of drag and drop - there will now be a glow around a field if the element you're dragging can be dropped into it.
- Added support for dragging and dropping records from the main tree view into reference elements
- Now adding required masters when dropping an element containing references
- Fixed issue with user being able to edit values in uneditable records
Automate Modal and Script Execution
- You can get example scripts here.
- You can now rename scripts from the modal
- Script execution now displays an indeterminate loader by default
- Now exposing working helper functions to scripts on
zedit. The currently available helper functions are as follows:
NavigateToElement: Causes the tree view to find the node for a file, group, or record, expanding nodes as necessary to reach it, selecting it, and scrolling so it is visible to the user. If you pass
trueas the second parameter it will also open the element in the record view, assuming it is a file or main record.
GetSelectedNodes: Returns an array corresponding to the nodes currently selected in the main tree view. Each node in this array has keys for
ShowProgress: Opens the progress modal to show progress as the script executes. See the Test Progress Modal.js script for example usage.
AddProgress: Adds progress to the progress bar in the progress modal.
ProgressTitle: Sets the title of the progress modal.
ProgressMessage: Sets the progress message displayed in the progress modal.
LogMessage: Prints a message to the log in the progress modal. In the future this will also log to the application's internal log.
Edit Value Modal
- Improved text area style
- Text fields which support HTML now use a CodeMirror editor with syntax highlighting
- Added discard button
- Fixed "unable to create directory" error when saving plugins
This is an initial alpha release of zEdit. This release is nowhere near complete, but it offers a minimum set of functionality for you to work with.
Below is an overview of included functionality and known issues that will be fixed in future builds.
- The icon is a work in progress. I threw it together in a few minutes. It will likely be changed at a future point in time. (or maybe it won't, who knows?)
- The installer is using a default configuration, and installs the application to Local AppData. If you don't like this use the portable distribution. I'll probably fix this at some future point in time, but it's not an important item at the moment.
- zEdit is intended to be used as a single installation tool. There is no good reason to install it for each game you have installed unless you want to waste hard drive space. If you enjoy having your tools in a tools folder in each of your game folders you can add a shortcut to start zEdit there.
- Ctrl+R is planned to reload the application and restore the both view layout and navigation, but is currently non-functional. (it will bring up the save modal if you have any changes, so you can cancel the reload if you press it by accident)
- Support for several target line parameters is planned. At the moment there are none.
- Works with Oblivion, Skyrim, Fallout 3, Fallout New Vegas, Fallout 4, and Skyrim Special Edition
- Automatic detection of installed games
- You can manage and create new profiles by clicking on the gear. Each profile has its own unique settings.
- I current have game logos for Oblivion, Skyrim, SSE, and Fallout 4. Other games will display a question mark when you select a profile for them. (this will be fixed soon, I just need some good FNV/FO3 logos to add)
- Should handle load orders from all games correctly, but I have not tested this thoroughly. If you see load order issues with any game mode, please let me know.
- You can reorder your load order on the load order modal with drag and drop. Note: Any changes made will not be saved to your loadorder.txt. This feature is mainly present for situations in which the program doesn't set up your load order correctly.
- You can multi-select plugins in the load order modal with Ctrl+Click or Shift+Click. You can toggle a selection of plugins by pressing space.
- A context menu for the load order modal is planned. It will allow you to check all plugins, uncheck all plugins, and invert your selection.
- Currently, required masters will not be loaded automatically. You will need to select all the plugins you want the program to load. This will be fixed in a future version.
- Currently using a fixed layout with two panes, which you can resize freely. You can create and close tabs. In the future you will be able to move tabs to new panes (splitting the view horizontally/vertically), reorder tabs with drag and drop, move tabs between panes with drag and drop, close panes by closing/removing the last tab, and more.
- There is no overflow scrolling if you open too many tabs. This will be fixed in the near future.
- Currently, none of the hotkeys for opening/closing/navigating tabs are programmed. Such hotkeys will be added in the near future.
- In the future there will be a system whereby you can save and load pane/tab layouts. The system is actually already built, it just needs a user interface.
- When you open a new tab, you will be prompted to select a view to use in the tab. In the future there will be many other views for you to choose from. zEdit modules will be able to create and register custom views.
- You can open the settings modal by clicking on the gear on the upper right corner of the title bar.
- You can save your changes at any time by pressing Ctrl+S.
- The tree view is zEdit's equivalent of xEdit's navigation view. It should behave almost exactly identical to xEdit's navigation view. It uses the same hotkeys as xEdit's navigation view. (I will document all of these hotkeys soon)
- You can sort the tree view by one of the default columns by clicking on its header. You can click a column twice to reverse the sort order. This is the same as xEdit except sorting by EditorID or Name will sort groups by their display name (xEdit always sorts them by their signature).
- File header nodes are hidden by default. To view a file header you open the file node (select and press enter, double click, drag and drop, or right-click -> open in record view). You can enable display of separate file header nodes from the Tree View tab on the Settings Modal.
- You can create and toggle the display of custom columns by clicking on the edit columns button in the upper right corner of the view. When you create a new column you will be able to give it a name and provide a code fragment for retrieving data for that column.
- The "Test" button for custom column data retrieval code doesn't do anything yet. In the future it test the code with some input nodes of your choosing.
- You can open a record in the record view by double clicking it, pressing enter with it selected, or dragging and dropping it on the record view. Note: when pressing enter or double clicking the record it will be opened in the first record view in the program. If you close this initial record view the tree view will no longer be linked to any record view until the program is restarted. This will be fixed in the near future. In addition, you will later be able to link record views with tree views arbitrarily.
- Asides from Delete removing groups/records and Enter opening them, all other context menu hotkeys are not yet operational. This will be addressed soon.
- The advanced search, record refactoring, and copy-paste context menu items are currently disabled because they are not yet implemented. They will be implemented soon.
- You can bring up or focus the search bar to search for a record by pressing Ctrl+F. The search bar lets you search for records by Editor ID, Name, or FormID, using partial or exact matching. Once you have entered a value in the search input you can find the next result by pressing Enter or clicking the down arrow button. You can find the previous result by pressing Shift+Enter or by clicking the up arrow button. You can toggle exact matching by pressing Alt+X. You can switch between searching by Editor ID, Name, and FormID by pressing Alt+E, Alt+N, and Alt+F, respectively. You can press Escape to close the search bar. (Note: All of these hotkeys only work if you have the search input focused).
- While a long search is being performed a partially transparent modal will be displayed to indicate a background process is active, disallowing access to the GUI. The first search may take awhile, but subsequent searches tend to be much faster.
- You can create and execute basic user scripts via the "Automate" option. Currently you have access to a bunch of library functions via the xelib namespace, but functionality related to the GUI is not yet exposed (such as getting the nodes the user has selected in the tree view or displaying custom modals). I am planning to have fully fleshed out documentation and example scripts here in the future.
- The record view is zEdit's equivalent of xEdit's view tab. It should behave almost exactly identical to xEdit's view tab, with some exceptions as noted below.
- Unlike xEdit's view tab, zEdit's record view supports collapsing of nodes. This is useful for when viewing very large records, where scrolling through all of the nodes can be incredibly time consuming. When you open a record, all nodes will be collapsed by default. You can expand all nodes (including children nodes) by clicking the plus button in the Element Name column header. Similarly, you can collapse all expanded nodes by clicking the minus button. In addition, there's a setting in the settings modal which allows you to have nodes automatically expand by default whenever you open a record.
- When you select a cell it will get a dashed border, the same as xEdit. However, unlike xEdit the column header for the selected cell will also change background color, indicating that you have selected an element in that column.
- You can add an element in the same way as with xEdit - right-clicking the cell and clicking Add. I would like to improve the user experience here at a future point in time. Note: The insert hotkey is not yet programmed to add an element, this will be fixed soon.
- You can delete an element in the same way as with xEdit - right-clicking the cell and clicking Delete (renamed from Remove). You can also press Delete to delete the currently selected element.
- You can edit a value by right-clicking its cell and clicking "Edit" or by double-clicking the cell.
- Inline value editing is not yet supported, but it is planned.
Edit Value Modal
- The edit value modal is what appears when you edit an element on a record. It is similar to xEdit's edit value modal, but it has more functionality for certain data types.
- A miniature hex editor is provided for editing byte arrays.
- Number input with validation.
- A multi-line text editor for text fields such as book descriptions. (just noticed it's not working for file descriptions yet, will fix soon)
- Reference input with autocomplete (it doesn't load all possible references, so you shouldn't have the program freezing for 2 minutes when you try to edit certain formID fields)
- Checkbox list editing of flags (same as xEdit, except with multi-select)
- Enumeration editing via a dropdown
- A color picker is provided for color elements. To use the color editor, double click or right-click -> edit on a structure which contains Red, Blue, Green element children. [screenshot example]
- The settings modal allows you to edit certain settings associated with the program. There are many planned settings that are not yet available here. In the future, modules will be able to register tabs in the settings modal for editing their settings, similar to SkyUI. (both the tree and record view are using this API currently)
- Full application themes via CSS will be supported in the near future.
Whew, those were some long release notes. If you actually read through all of this, congrats. You're almost as crazy as I am for writing it all!