Two gigaseconds (#147)
* Fix look of position time field to match the rest of the UI. * Fix typo. * Improve position time display. * Add days, hours support to position time display. * Fix "Current Time" toolbar item geometry/layout. * Don’t enforce leading double-digits in position time display. * MainMenu.xib touched by Xcode. * Implement and use MonospacedDigitTextFieldCell. This way the digits of numbers in playlist columns consisting of mostly digits will be aligned vertically. * Disable font scaling code without effect. * Set "Current Time" toolbar item to use MonospacedDigitTextFieldCell. * Improve SecondsFormatter. * Merge in SecondsFormatter improvements from Play. * Move formatter setup into XIB. * Add CogTests. These can later be used for integration tests. * Add SecondsFormatterTests. Tests are stubbed out. * Pouring foundation for SecondsFormatterTests. * Implement -testPositive. * Replace unsigned with int in SecondsFormatter. * Implement negative support, tests. * Rewrite SecondsFormatter in preparation for better readability.. * Rewrite SecondsFormatter for better readability. * Add negative zero support. * Improve SecondsFormatter readability. * Refactor into -stringForTimeInterval: in SecondsFormatter. * Cleanup. * Mark TimeField as space-indented. * Replace custom time formatting code in TimeField with SecondsFormatter. * Cleanup. * Improve SecondsFormatter format strings. * Add internal type for time calculations. Co-authored-by: Jan Weiß <jan@geheimwerk.de>CQTexperiment
parent
503b4a471c
commit
c5ac86725d
|
@ -1,8 +1,8 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="17701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17701"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
|
@ -18,7 +18,7 @@
|
||||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
||||||
<windowCollectionBehavior key="collectionBehavior" fullScreenPrimary="YES"/>
|
<windowCollectionBehavior key="collectionBehavior" fullScreenPrimary="YES"/>
|
||||||
<rect key="contentRect" x="331" y="367" width="1000" height="400"/>
|
<rect key="contentRect" x="331" y="367" width="1000" height="400"/>
|
||||||
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1415"/>
|
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
|
||||||
<value key="minSize" type="size" width="750" height="200"/>
|
<value key="minSize" type="size" width="750" height="200"/>
|
||||||
<stackView key="contentView" distribution="equalSpacing" orientation="vertical" alignment="centerX" spacing="0.0" detachesHiddenViews="YES" id="2">
|
<stackView key="contentView" distribution="equalSpacing" orientation="vertical" alignment="centerX" spacing="0.0" detachesHiddenViews="YES" id="2">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="1000" height="400"/>
|
<rect key="frame" x="0.0" y="0.0" width="1000" height="400"/>
|
||||||
|
@ -46,7 +46,8 @@
|
||||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="backgroundColor" white="0.33333299" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.33333299" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
</tableHeaderCell>
|
</tableHeaderCell>
|
||||||
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="right" title="Text Cell" id="1507">
|
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="right" id="1507" customClass="MonospacedDigitTextFieldCell">
|
||||||
|
<customFormatter key="formatter" id="nTf-SH-hvf" customClass="IndexFormatter"/>
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
@ -147,16 +148,18 @@
|
||||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
|
||||||
</tableHeaderCell>
|
</tableHeaderCell>
|
||||||
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="right" title="Text Cell" id="1510">
|
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="right" id="1510" customClass="MonospacedDigitTextFieldCell">
|
||||||
|
<customFormatter key="formatter" id="tMx-da-cg2" customClass="SecondsFormatter"/>
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||||
<connections>
|
<connections>
|
||||||
<binding destination="218" name="value" keyPath="arrangedObjects.length" id="1658">
|
<binding destination="218" name="value" keyPath="arrangedObjects.length" id="3wK-vR-bZH">
|
||||||
<dictionary key="options">
|
<dictionary key="options">
|
||||||
<integer key="NSConditionallySetsEditable" value="1"/>
|
<bool key="NSConditionallySetsEditable" value="YES"/>
|
||||||
|
<string key="NSNullPlaceholder">0</string>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
</binding>
|
</binding>
|
||||||
<binding destination="1689" name="fontSize" keyPath="values.fontSize" id="1919"/>
|
<binding destination="1689" name="fontSize" keyPath="values.fontSize" id="1919"/>
|
||||||
|
@ -167,7 +170,8 @@
|
||||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
|
||||||
</tableHeaderCell>
|
</tableHeaderCell>
|
||||||
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="right" title="Text Cell" id="1511">
|
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="right" id="1511" customClass="MonospacedDigitTextFieldCell">
|
||||||
|
<customFormatter key="formatter" id="uVF-7t-Nw2" customClass="BlankZeroFormatter"/>
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
@ -200,7 +204,8 @@
|
||||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
|
||||||
</tableHeaderCell>
|
</tableHeaderCell>
|
||||||
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="right" title="Text Cell" id="1513">
|
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="right" id="1513" customClass="MonospacedDigitTextFieldCell">
|
||||||
|
<customFormatter key="formatter" id="QXs-TV-W1R" customClass="BlankZeroFormatter"/>
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
@ -291,7 +296,7 @@
|
||||||
</connections>
|
</connections>
|
||||||
</splitView>
|
</splitView>
|
||||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="778">
|
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="778">
|
||||||
<rect key="frame" x="370" y="4" width="261" height="14"/>
|
<rect key="frame" x="369" y="4" width="262" height="14"/>
|
||||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" alignment="center" title="Total Duration: 00 hours 00 minutes 00 seconds" bezelStyle="round" id="1473">
|
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" alignment="center" title="Total Duration: 00 hours 00 minutes 00 seconds" bezelStyle="round" id="1473">
|
||||||
<font key="font" metaFont="controlContent" size="11"/>
|
<font key="font" metaFont="controlContent" size="11"/>
|
||||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
@ -412,10 +417,10 @@
|
||||||
<toolbarItem implicitItemIdentifier="B042D8A5-AFF4-43B2-9DFB-E87A09B7F861" label="Current Time" paletteLabel="Current Time" visibilityPriority="5" sizingBehavior="auto" id="1568">
|
<toolbarItem implicitItemIdentifier="B042D8A5-AFF4-43B2-9DFB-E87A09B7F861" label="Current Time" paletteLabel="Current Time" visibilityPriority="5" sizingBehavior="auto" id="1568">
|
||||||
<nil key="toolTip"/>
|
<nil key="toolTip"/>
|
||||||
<textField key="view" verticalHuggingPriority="750" id="1566" customClass="TimeField">
|
<textField key="view" verticalHuggingPriority="750" id="1566" customClass="TimeField">
|
||||||
<rect key="frame" x="14" y="14" width="49" height="19"/>
|
<rect key="frame" x="8" y="14" width="61" height="22"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" borderStyle="bezel" alignment="center" title="0:00" usesSingleLineMode="YES" bezelStyle="round" id="1567">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" borderStyle="bezel" alignment="center" title="0:00" usesSingleLineMode="YES" bezelStyle="round" id="1567" customClass="MonospacedDigitTextFieldCell">
|
||||||
<font key="font" metaFont="message" size="11"/>
|
<font key="font" metaFont="system"/>
|
||||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
|
@ -567,7 +572,7 @@
|
||||||
<window title="Cog" separatorStyle="none" allowsToolTipsWhenApplicationIsInactive="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="Mini Window" animationBehavior="default" toolbarStyle="unified" id="2234" userLabel="Mini Window (Window)" customClass="MiniWindow">
|
<window title="Cog" separatorStyle="none" allowsToolTipsWhenApplicationIsInactive="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="Mini Window" animationBehavior="default" toolbarStyle="unified" id="2234" userLabel="Mini Window (Window)" customClass="MiniWindow">
|
||||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
||||||
<rect key="contentRect" x="192" y="547" width="640" height="0.0"/>
|
<rect key="contentRect" x="192" y="547" width="640" height="0.0"/>
|
||||||
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1415"/>
|
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
|
||||||
<view key="contentView" hidden="YES" wantsLayer="YES" id="2235">
|
<view key="contentView" hidden="YES" wantsLayer="YES" id="2235">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="640" height="0.0"/>
|
<rect key="frame" x="0.0" y="0.0" width="640" height="0.0"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
@ -1443,7 +1448,6 @@ Gw
|
||||||
<string>status</string>
|
<string>status</string>
|
||||||
<mutableString>queued</mutableString>
|
<mutableString>queued</mutableString>
|
||||||
</declaredKeys>
|
</declaredKeys>
|
||||||
<classReference key="objectClass" className="PlaylistEntry"/>
|
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="playbackController" destination="705" id="2121"/>
|
<outlet property="playbackController" destination="705" id="2121"/>
|
||||||
<outlet property="playlistLoader" destination="1319" id="1321"/>
|
<outlet property="playlistLoader" destination="1319" id="1321"/>
|
||||||
|
@ -1763,7 +1767,6 @@ Gw
|
||||||
<mutableString>title</mutableString>
|
<mutableString>title</mutableString>
|
||||||
<mutableString>artist</mutableString>
|
<mutableString>artist</mutableString>
|
||||||
</declaredKeys>
|
</declaredKeys>
|
||||||
<classReference key="objectClass" className="PlaylistEntry"/>
|
|
||||||
<connections>
|
<connections>
|
||||||
<binding destination="218" name="contentObject" keyPath="currentEntry" id="1902"/>
|
<binding destination="218" name="contentObject" keyPath="currentEntry" id="1902"/>
|
||||||
</connections>
|
</connections>
|
||||||
|
@ -1775,7 +1778,6 @@ Gw
|
||||||
<string>artist</string>
|
<string>artist</string>
|
||||||
<string>album</string>
|
<string>album</string>
|
||||||
</declaredKeys>
|
</declaredKeys>
|
||||||
<classReference key="objectClass" className="PlaylistEntry"/>
|
|
||||||
<connections>
|
<connections>
|
||||||
<binding destination="218" name="contentArray" keyPath="arrangedObjects" id="2039"/>
|
<binding destination="218" name="contentArray" keyPath="arrangedObjects" id="2039"/>
|
||||||
<binding destination="218" name="selectionIndexes" keyPath="selectionIndexes" id="2041"/>
|
<binding destination="218" name="selectionIndexes" keyPath="selectionIndexes" id="2041"/>
|
||||||
|
@ -1801,152 +1803,152 @@ Gw
|
||||||
<image name="imageCell:1801:image" width="17" height="17">
|
<image name="imageCell:1801:image" width="17" height="17">
|
||||||
<mutableData key="keyedArchiveRepresentation">
|
<mutableData key="keyedArchiveRepresentation">
|
||||||
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05T
|
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05T
|
||||||
S2V5ZWRBcmNoaXZlctEICVRyb290gAGuCwwZGh8UJCkqMTQ3PUBVJG51bGzWDQ4PEBESExQVFhcYVk5T
|
S2V5ZWRBcmNoaXZlctEICVRyb290gAGuCwwZGh8UJCgpMDM2PD9VJG51bGzWDQ4PEBESExQVFhcYVk5T
|
||||||
U2l6ZV5OU1Jlc2l6aW5nTW9kZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVwc1dOU0NvbG9ygAIQAIAN
|
U2l6ZV5OU1Jlc2l6aW5nTW9kZVYkY2xhc3NcTlNJbWFnZUZsYWdzVk5TUmVwc1dOU0NvbG9ygAIQAIAN
|
||||||
EiDAAACAA4ALWHsxNywgMTd90hsPHB5aTlMub2JqZWN0c6EdgASACtIbDyAjoiEigAWABoAJ0w8lJico
|
EiDAAACAA4ALWHsxNywgMTd90hsPHB5aTlMub2JqZWN0c6EdgASACtIbDyAjoiEigAWABoAJ0iUPJidf
|
||||||
FF8QFE5TVElGRlJlcHJlc2VudGF0aW9uXxAZTlNJbnRlcm5hbExheW91dERpcmVjdGlvboAIgAdPER/e
|
EBROU1RJRkZSZXByZXNlbnRhdGlvboAHgAhPER/eTU0AKgAAEhjo6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
TU0AKgAAEhjo6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
|
||||||
6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/
|
6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/ABIBAAADAAAAAQAiAAABAQAD
|
||||||
6Ojo/+jo6P/o6Oj/ABIBAAADAAAAAQAiAAABAQADAAAAAQAiAAABAgADAAAABAAAEwYBAwADAAAAAQAB
|
AAAAAQAiAAABAgADAAAABAAAEwYBAwADAAAAAQABAAABBgADAAAAAQACAAABCgADAAAAAQABAAABEQAE
|
||||||
AAABBgADAAAAAQACAAABCgADAAAAAQABAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAE
|
AAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAAAQAiAAABFwAEAAAAAQAAEhABGgAF
|
||||||
AAABFgADAAAAAQAiAAABFwAEAAAAAQAAEhABGgAFAAAAAQAAEvYBGwAFAAAAAQAAEv4BHAADAAAAAQAB
|
AAAAAQAAEvYBGwAFAAAAAQAAEv4BHAADAAAAAQABAAABKAADAAAAAQACAAABUgADAAAAAQABAAABUwAD
|
||||||
AAABKAADAAAAAQACAAABUgADAAAAAQABAAABUwADAAAABAAAEw6HcwAHAAAMyAAAExYAAAAAAAAAkAAA
|
AAAABAAAEw6HcwAHAAAMyAAAExYAAAAAAAAAkAAAAAEAAACQAAAAAQAIAAgACAAIAAEAAQABAAEAAAzI
|
||||||
AAEAAACQAAAAAQAIAAgACAAIAAEAAQABAAEAAAzIYXBwbAIQAABtbnRyUkdCIFhZWiAH4AABAA0AFwAD
|
YXBwbAIQAABtbnRyUkdCIFhZWiAH4AABAA0AFwADAB1hY3NwQVBQTAAAAABBUFBMAAAAAAAAAAAAAAAA
|
||||||
AB1hY3NwQVBQTAAAAABBUFBMAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAA
|
AAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFkZXNjAAABUAAAAGJkc2NtAAABtAAA
|
AAAAAAAAABFkZXNjAAABUAAAAGJkc2NtAAABtAAAAbBjcHJ0AAADZAAAACN3dHB0AAADiAAAABRyWFla
|
||||||
AbBjcHJ0AAADZAAAACN3dHB0AAADiAAAABRyWFlaAAADnAAAABRnWFlaAAADsAAAABRiWFlaAAADxAAA
|
AAADnAAAABRnWFlaAAADsAAAABRiWFlaAAADxAAAABRyVFJDAAAD2AAACAxhYXJnAAAL5AAAACB2Y2d0
|
||||||
ABRyVFJDAAAD2AAACAxhYXJnAAAL5AAAACB2Y2d0AAAMBAAAADBuZGluAAAMNAAAAD5jaGFkAAAMdAAA
|
AAAMBAAAADBuZGluAAAMNAAAAD5jaGFkAAAMdAAAACxtbW9kAAAMoAAAAChiVFJDAAAD2AAACAxnVFJD
|
||||||
ACxtbW9kAAAMoAAAAChiVFJDAAAD2AAACAxnVFJDAAAD2AAACAxhYWJnAAAL5AAAACBhYWdnAAAL5AAA
|
AAAD2AAACAxhYWJnAAAL5AAAACBhYWdnAAAL5AAAACBkZXNjAAAAAAAAAAhEaXNwbGF5AAAAAAAAAAAA
|
||||||
ACBkZXNjAAAAAAAAAAhEaXNwbGF5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAAiAAAADGhy
|
AAAAAAAAAAAAAAAAbWx1YwAAAAAAAAAiAAAADGhySFIAAAAIAAABqGtvS1IAAAAIAAABqG5iTk8AAAAI
|
||||||
SFIAAAAIAAABqGtvS1IAAAAIAAABqG5iTk8AAAAIAAABqGlkAAAAAAAIAAABqGh1SFUAAAAIAAABqGNz
|
AAABqGlkAAAAAAAIAAABqGh1SFUAAAAIAAABqGNzQ1oAAAAIAAABqGRhREsAAAAIAAABqHVrVUEAAAAI
|
||||||
Q1oAAAAIAAABqGRhREsAAAAIAAABqHVrVUEAAAAIAAABqGFyAAAAAAAIAAABqGl0SVQAAAAIAAABqHJv
|
AAABqGFyAAAAAAAIAAABqGl0SVQAAAAIAAABqHJvUk8AAAAIAAABqG5sTkwAAAAIAAABqGhlSUwAAAAI
|
||||||
Uk8AAAAIAAABqG5sTkwAAAAIAAABqGhlSUwAAAAIAAABqGVzRVMAAAAIAAABqGZpRkkAAAAIAAABqHpo
|
AAABqGVzRVMAAAAIAAABqGZpRkkAAAAIAAABqHpoVFcAAAAIAAABqHZpVk4AAAAIAAABqHNrU0sAAAAI
|
||||||
VFcAAAAIAAABqHZpVk4AAAAIAAABqHNrU0sAAAAIAAABqHpoQ04AAAAIAAABqHJ1UlUAAAAIAAABqGZy
|
AAABqHpoQ04AAAAIAAABqHJ1UlUAAAAIAAABqGZyRlIAAAAIAAABqG1zAAAAAAAIAAABqGNhRVMAAAAI
|
||||||
RlIAAAAIAAABqG1zAAAAAAAIAAABqGNhRVMAAAAIAAABqHRoVEgAAAAIAAABqGVzWEwAAAAIAAABqGRl
|
AAABqHRoVEgAAAAIAAABqGVzWEwAAAAIAAABqGRlREUAAAAIAAABqGVuVVMAAAAIAAABqHB0QlIAAAAI
|
||||||
REUAAAAIAAABqGVuVVMAAAAIAAABqHB0QlIAAAAIAAABqHBsUEwAAAAIAAABqGVsR1IAAAAIAAABqHN2
|
AAABqHBsUEwAAAAIAAABqGVsR1IAAAAIAAABqHN2U0UAAAAIAAABqHRyVFIAAAAIAAABqGphSlAAAAAI
|
||||||
U0UAAAAIAAABqHRyVFIAAAAIAAABqGphSlAAAAAIAAABqHB0UFQAAAAIAAABqABpAE0AYQBjdGV4dAAA
|
AAABqHB0UFQAAAAIAAABqABpAE0AYQBjdGV4dAAAAABDb3B5cmlnaHQgQXBwbGUgSW5jLiwgMjAxNgAA
|
||||||
AABDb3B5cmlnaHQgQXBwbGUgSW5jLiwgMjAxNgAAWFlaIAAAAAAAAPPYAAEAAAABFghYWVogAAAAAAAA
|
WFlaIAAAAAAAAPPYAAEAAAABFghYWVogAAAAAAAAc9QAADomAAABblhZWiAAAAAAAABehgAAujcAABPt
|
||||||
c9QAADomAAABblhZWiAAAAAAAABehgAAujcAABPtWFlaIAAAAAAAACR8AAALowAAvdJjdXJ2AAAAAAAA
|
WFlaIAAAAAAAACR8AAALowAAvdJjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADYAOwBA
|
||||||
BAAAAAAFAAoADwAUABkAHgAjACgALQAyADYAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCL
|
AEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8AowCoAK0AsgC3ALwAwQDGAMsA0ADV
|
||||||
AJAAlQCaAJ8AowCoAK0AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQEr
|
ANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGS
|
||||||
ATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIM
|
AZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKY
|
||||||
AhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4
|
AqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APs
|
||||||
A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2
|
A/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWW
|
||||||
BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaM
|
BaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZ
|
||||||
Bp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+
|
B6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7
|
||||||
CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtR
|
ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzA
|
||||||
C2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5J
|
DNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/s
|
||||||
DmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGq
|
EAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxOD
|
||||||
EckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4
|
E6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJ
|
||||||
FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3
|
F64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwC
|
||||||
Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5q
|
HCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDw
|
||||||
HpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOU
|
IRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZX
|
||||||
I8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4
|
JocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5
|
||||||
KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9a
|
LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKb
|
||||||
L5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9
|
MtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/
|
||||||
Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0i
|
Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDn
|
||||||
PWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTO
|
QSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjX
|
||||||
RRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0C
|
SR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQ
|
||||||
TUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXC
|
UZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pW
|
||||||
Vg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8P
|
WqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2Pr
|
||||||
X2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjs
|
ZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4S
|
||||||
aUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNd
|
bmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjM
|
||||||
c7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5i
|
eSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQd
|
||||||
fsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+
|
hICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAG
|
||||||
imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0
|
kG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJ
|
||||||
lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMG
|
nPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mp
|
||||||
o3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1
|
qhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldo
|
||||||
sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6E
|
t+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XI
|
||||||
vv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01
|
xkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL
|
||||||
zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK
|
1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz
|
||||||
3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG
|
5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC
|
||||||
7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p
|
9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//3BhcmEAAAAAAAMAAAACZmYAAPKn
|
||||||
/br+S/7c/23//3BhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAAoOdmNndAAAAAAAAAABAAEAAAAA
|
AAANWQAAE9AAAAoOdmNndAAAAAAAAAABAAEAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAEAAAAAAAAAAQAA
|
||||||
AAAAAQAAAAEAAAAAAAAAAQAAAAEAAAAAAAAAAQAAbmRpbgAAAAAAAAA2AACnwAAAVQAAAEuAAACgAAAA
|
bmRpbgAAAAAAAAA2AACnwAAAVQAAAEuAAACgAAAAJgAAAAwAAABQQAAAVEAAAjMzAAIzMwACMzMAAAAA
|
||||||
JgAAAAwAAABQQAAAVEAAAjMzAAIzMwACMzMAAAAAAAAAAHNmMzIAAAAAAAELtwAABZb///NXAAAHKQAA
|
AAAAAHNmMzIAAAAAAAELtwAABZb///NXAAAHKQAA/df///u3///9pgAAA9oAAMD2bW1vZAAAAAAAAAYQ
|
||||||
/df///u3///9pgAAA9oAAMD2bW1vZAAAAAAAAAYQAACuA5v0iCnPTo6AAAAAAAAAAAAAAAAAAAAAANIr
|
AACuA5v0iCnPTo6AAAAAAAAAAAAAAAAAAAAAANIqKywtWiRjbGFzc25hbWVYJGNsYXNzZXNfEBBOU0Jp
|
||||||
LC0uWiRjbGFzc25hbWVYJGNsYXNzZXNfEBBOU0JpdG1hcEltYWdlUmVwoy0vMFpOU0ltYWdlUmVwWE5T
|
dG1hcEltYWdlUmVwoywuL1pOU0ltYWdlUmVwWE5TT2JqZWN00iorMTJXTlNBcnJheaIxL9IqKzQ1Xk5T
|
||||||
T2JqZWN00issMjNXTlNBcnJheaIyMNIrLDU2Xk5TTXV0YWJsZUFycmF5ozUyMNM4OQ86OzxXTlNXaGl0
|
TXV0YWJsZUFycmF5ozQxL9M3OA85OjtXTlNXaGl0ZVxOU0NvbG9yU3BhY2VEMCAwABADgAzSKis9PldO
|
||||||
ZVxOU0NvbG9yU3BhY2VEMCAwABADgAzSKyw+P1dOU0NvbG9yoj4w0issQUJXTlNJbWFnZaJBMAAIABEA
|
U0NvbG9yoj0v0iorQEFXTlNJbWFnZaJALwAIABEAGgAkACkAMgA3AEkATABRAFMAYgBoAHUAfACLAJIA
|
||||||
GgAkACkAMgA3AEkATABRAFMAYgBoAHUAfACLAJIAnwCmAK4AsACyALQAuQC7AL0AxgDLANYA2ADaANwA
|
nwCmAK4AsACyALQAuQC7AL0AxgDLANYA2ADaANwA4QDkAOYA6ADqAO8BBgEIAQog7CDxIPwhBSEYIRwh
|
||||||
4QDkAOYA6ADqAPEBCAEkASYBKCEKIQ8hGiEjITYhOiFFIU4hUyFbIV4hYyFyIXYhfSGFIZIhlyGZIZsh
|
JyEwITUhPSFAIUUhVCFYIV8hZyF0IXkheyF9IYIhiiGNIZIhmgAAAAAAAAIBAAAAAAAAAEIAAAAAAAAA
|
||||||
oCGoIashsCG4AAAAAAAAAgEAAAAAAAAAQwAAAAAAAAAAAAAAAAAAIbs
|
AAAAAAAAACGdA
|
||||||
</mutableData>
|
</mutableData>
|
||||||
</image>
|
</image>
|
||||||
<image name="infoTemplate" width="16" height="16"/>
|
<image name="infoTemplate" width="16" height="16"/>
|
||||||
|
|
|
@ -90,6 +90,10 @@
|
||||||
17F561400C3BD4F30019975C /* CogAudio.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 17F561330C3BD4DC0019975C /* CogAudio.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
17F561400C3BD4F30019975C /* CogAudio.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 17F561330C3BD4DC0019975C /* CogAudio.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
||||||
17F6C8070F603701000D9DA9 /* PlaybackEventController.m in Sources */ = {isa = PBXBuildFile; fileRef = 17F6C8060F603701000D9DA9 /* PlaybackEventController.m */; };
|
17F6C8070F603701000D9DA9 /* PlaybackEventController.m in Sources */ = {isa = PBXBuildFile; fileRef = 17F6C8060F603701000D9DA9 /* PlaybackEventController.m */; };
|
||||||
17FAEBAC0F662985007C8707 /* ToolTipTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 17FAEBAB0F662985007C8707 /* ToolTipTextField.m */; };
|
17FAEBAC0F662985007C8707 /* ToolTipTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 17FAEBAB0F662985007C8707 /* ToolTipTextField.m */; };
|
||||||
|
3D42D1302641739C002A170C /* MonospacedDigitTextFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D42D12F2641739C002A170C /* MonospacedDigitTextFieldCell.m */; };
|
||||||
|
3D42D1B82642BB62002A170C /* CogTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D42D1B72642BB62002A170C /* CogTests.m */; };
|
||||||
|
3D42D2772642BEA0002A170C /* SecondsFormatterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D42D2762642BEA0002A170C /* SecondsFormatterTests.m */; };
|
||||||
|
3D42D2C12642BF5D002A170C /* SecondsFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 17D1B1670F632ABB00694C57 /* SecondsFormatter.m */; };
|
||||||
5604D45B0D60349B004F5C5D /* SpotlightWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5604D4590D60349B004F5C5D /* SpotlightWindowController.m */; };
|
5604D45B0D60349B004F5C5D /* SpotlightWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5604D4590D60349B004F5C5D /* SpotlightWindowController.m */; };
|
||||||
5604D4F60D60726E004F5C5D /* SpotlightPlaylistEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = 5604D4F50D60726E004F5C5D /* SpotlightPlaylistEntry.m */; };
|
5604D4F60D60726E004F5C5D /* SpotlightPlaylistEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = 5604D4F50D60726E004F5C5D /* SpotlightPlaylistEntry.m */; };
|
||||||
56462EAF0D6341F6000AB68C /* SpotlightTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = 56462EAE0D6341F6000AB68C /* SpotlightTransformers.m */; };
|
56462EAF0D6341F6000AB68C /* SpotlightTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = 56462EAE0D6341F6000AB68C /* SpotlightTransformers.m */; };
|
||||||
|
@ -301,6 +305,13 @@
|
||||||
remoteGlobalIDString = 8D5B49AC048680CD000E48DA;
|
remoteGlobalIDString = 8D5B49AC048680CD000E48DA;
|
||||||
remoteInfo = Preferences;
|
remoteInfo = Preferences;
|
||||||
};
|
};
|
||||||
|
3D42D1BA2642BB62002A170C /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 8D1107260486CEB800E47090;
|
||||||
|
remoteInfo = Cog;
|
||||||
|
};
|
||||||
566D321A0D538550004466A5 /* PBXContainerItemProxy */ = {
|
566D321A0D538550004466A5 /* PBXContainerItemProxy */ = {
|
||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
containerPortal = 566D32160D538550004466A5 /* APL.xcodeproj */;
|
containerPortal = 566D32160D538550004466A5 /* APL.xcodeproj */;
|
||||||
|
@ -789,7 +800,7 @@
|
||||||
17E0D5E50F520F02005B6FED /* PositionSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PositionSlider.h; path = Window/PositionSlider.h; sourceTree = "<group>"; };
|
17E0D5E50F520F02005B6FED /* PositionSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PositionSlider.h; path = Window/PositionSlider.h; sourceTree = "<group>"; };
|
||||||
17E0D5E60F520F02005B6FED /* PositionSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PositionSlider.m; path = Window/PositionSlider.m; sourceTree = "<group>"; };
|
17E0D5E60F520F02005B6FED /* PositionSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PositionSlider.m; path = Window/PositionSlider.m; sourceTree = "<group>"; };
|
||||||
17E0D5E70F520F02005B6FED /* TimeField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TimeField.h; path = Window/TimeField.h; sourceTree = "<group>"; };
|
17E0D5E70F520F02005B6FED /* TimeField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TimeField.h; path = Window/TimeField.h; sourceTree = "<group>"; };
|
||||||
17E0D5E80F520F02005B6FED /* TimeField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TimeField.m; path = Window/TimeField.m; sourceTree = "<group>"; };
|
17E0D5E80F520F02005B6FED /* TimeField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TimeField.m; path = Window/TimeField.m; sourceTree = "<group>"; usesTabs = 0; };
|
||||||
17E0D6120F520F87005B6FED /* FontSizetoLineHeightTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FontSizetoLineHeightTransformer.h; path = Transformers/FontSizetoLineHeightTransformer.h; sourceTree = "<group>"; };
|
17E0D6120F520F87005B6FED /* FontSizetoLineHeightTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FontSizetoLineHeightTransformer.h; path = Transformers/FontSizetoLineHeightTransformer.h; sourceTree = "<group>"; };
|
||||||
17E0D6130F520F87005B6FED /* FontSizetoLineHeightTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FontSizetoLineHeightTransformer.m; path = Transformers/FontSizetoLineHeightTransformer.m; sourceTree = "<group>"; };
|
17E0D6130F520F87005B6FED /* FontSizetoLineHeightTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FontSizetoLineHeightTransformer.m; path = Transformers/FontSizetoLineHeightTransformer.m; sourceTree = "<group>"; };
|
||||||
17E0D6140F520F87005B6FED /* StringToURLTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StringToURLTransformer.h; path = Transformers/StringToURLTransformer.h; sourceTree = "<group>"; };
|
17E0D6140F520F87005B6FED /* StringToURLTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StringToURLTransformer.h; path = Transformers/StringToURLTransformer.h; sourceTree = "<group>"; };
|
||||||
|
@ -809,6 +820,14 @@
|
||||||
29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
|
29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
|
||||||
29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
|
29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
|
||||||
32CA4F630368D1EE00C91783 /* Cog_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cog_Prefix.pch; sourceTree = "<group>"; };
|
32CA4F630368D1EE00C91783 /* Cog_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cog_Prefix.pch; sourceTree = "<group>"; };
|
||||||
|
3D42D12E2641739C002A170C /* MonospacedDigitTextFieldCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MonospacedDigitTextFieldCell.h; sourceTree = "<group>"; };
|
||||||
|
3D42D12F2641739C002A170C /* MonospacedDigitTextFieldCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MonospacedDigitTextFieldCell.m; sourceTree = "<group>"; };
|
||||||
|
3D42D1B52642BB62002A170C /* CogTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CogTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
3D42D1B72642BB62002A170C /* CogTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CogTests.m; sourceTree = "<group>"; };
|
||||||
|
3D42D1B92642BB62002A170C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
3D42D2742642BEA0002A170C /* SecondsFormatterTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SecondsFormatterTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
3D42D2762642BEA0002A170C /* SecondsFormatterTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SecondsFormatterTests.m; sourceTree = "<group>"; };
|
||||||
|
3D42D2782642BEA0002A170C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
3DDFC2462344EC6B000F1453 /* DEVELOPMENT_TEAM.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DEVELOPMENT_TEAM.xcconfig; sourceTree = "<group>"; };
|
3DDFC2462344EC6B000F1453 /* DEVELOPMENT_TEAM.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DEVELOPMENT_TEAM.xcconfig; sourceTree = "<group>"; };
|
||||||
3DDFC2472344EC6B000F1453 /* Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
3DDFC2472344EC6B000F1453 /* Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Shared.xcconfig; sourceTree = "<group>"; };
|
||||||
5604D4590D60349B004F5C5D /* SpotlightWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SpotlightWindowController.m; path = Spotlight/SpotlightWindowController.m; sourceTree = "<group>"; };
|
5604D4590D60349B004F5C5D /* SpotlightWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SpotlightWindowController.m; path = Spotlight/SpotlightWindowController.m; sourceTree = "<group>"; };
|
||||||
|
@ -935,6 +954,20 @@
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
3D42D1B22642BB62002A170C /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
3D42D2712642BEA0002A170C /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
8D11072E0486CEB800E47090 /* Frameworks */ = {
|
8D11072E0486CEB800E47090 /* Frameworks */ = {
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
|
@ -1078,6 +1111,8 @@
|
||||||
17FAEBAB0F662985007C8707 /* ToolTipTextField.m */,
|
17FAEBAB0F662985007C8707 /* ToolTipTextField.m */,
|
||||||
8355D6B4180612F300D05687 /* NSData+MD5.h */,
|
8355D6B4180612F300D05687 /* NSData+MD5.h */,
|
||||||
8355D6B5180612F300D05687 /* NSData+MD5.m */,
|
8355D6B5180612F300D05687 /* NSData+MD5.m */,
|
||||||
|
3D42D12E2641739C002A170C /* MonospacedDigitTextFieldCell.h */,
|
||||||
|
3D42D12F2641739C002A170C /* MonospacedDigitTextFieldCell.m */,
|
||||||
);
|
);
|
||||||
path = Utils;
|
path = Utils;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -1323,6 +1358,8 @@
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
1770424E0B8BC41800B86321 /* Cog.app */,
|
1770424E0B8BC41800B86321 /* Cog.app */,
|
||||||
|
3D42D1B52642BB62002A170C /* CogTests.xctest */,
|
||||||
|
3D42D2742642BEA0002A170C /* SecondsFormatterTests.xctest */,
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -1335,6 +1372,8 @@
|
||||||
080E96DDFE201D6D7F000001 /* Classes */,
|
080E96DDFE201D6D7F000001 /* Classes */,
|
||||||
29B97315FDCFA39411CA2CEA /* Other Sources */,
|
29B97315FDCFA39411CA2CEA /* Other Sources */,
|
||||||
29B97317FDCFA39411CA2CEA /* Resources */,
|
29B97317FDCFA39411CA2CEA /* Resources */,
|
||||||
|
3D42D1B62642BB62002A170C /* CogTests */,
|
||||||
|
3D42D2752642BEA0002A170C /* SecondsFormatterTests */,
|
||||||
29B97323FDCFA39411CA2CEA /* Frameworks */,
|
29B97323FDCFA39411CA2CEA /* Frameworks */,
|
||||||
17B619FF0B909ED400BC003F /* PlugIns */,
|
17B619FF0B909ED400BC003F /* PlugIns */,
|
||||||
3DDFC2452344EC6A000F1453 /* Xcode-config */,
|
3DDFC2452344EC6A000F1453 /* Xcode-config */,
|
||||||
|
@ -1387,6 +1426,24 @@
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
3D42D1B62642BB62002A170C /* CogTests */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
3D42D1B72642BB62002A170C /* CogTests.m */,
|
||||||
|
3D42D1B92642BB62002A170C /* Info.plist */,
|
||||||
|
);
|
||||||
|
path = CogTests;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
3D42D2752642BEA0002A170C /* SecondsFormatterTests */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
3D42D2762642BEA0002A170C /* SecondsFormatterTests.m */,
|
||||||
|
3D42D2782642BEA0002A170C /* Info.plist */,
|
||||||
|
);
|
||||||
|
path = SecondsFormatterTests;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
3DDFC2452344EC6A000F1453 /* Xcode-config */ = {
|
3DDFC2452344EC6A000F1453 /* Xcode-config */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
@ -1675,6 +1732,41 @@
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
|
3D42D1B42642BB62002A170C /* CogTests */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 3D42D1C02642BB62002A170C /* Build configuration list for PBXNativeTarget "CogTests" */;
|
||||||
|
buildPhases = (
|
||||||
|
3D42D1B12642BB62002A170C /* Sources */,
|
||||||
|
3D42D1B22642BB62002A170C /* Frameworks */,
|
||||||
|
3D42D1B32642BB62002A170C /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
3D42D1BB2642BB62002A170C /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
name = CogTests;
|
||||||
|
productName = CogTests;
|
||||||
|
productReference = 3D42D1B52642BB62002A170C /* CogTests.xctest */;
|
||||||
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
|
};
|
||||||
|
3D42D2732642BEA0002A170C /* SecondsFormatterTests */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 3D42D27D2642BEA1002A170C /* Build configuration list for PBXNativeTarget "SecondsFormatterTests" */;
|
||||||
|
buildPhases = (
|
||||||
|
3D42D2702642BEA0002A170C /* Sources */,
|
||||||
|
3D42D2712642BEA0002A170C /* Frameworks */,
|
||||||
|
3D42D2722642BEA0002A170C /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = SecondsFormatterTests;
|
||||||
|
productName = SecondsFormatterTests;
|
||||||
|
productReference = 3D42D2742642BEA0002A170C /* SecondsFormatterTests.xctest */;
|
||||||
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
|
};
|
||||||
8D1107260486CEB800E47090 /* Cog */ = {
|
8D1107260486CEB800E47090 /* Cog */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Cog" */;
|
buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Cog" */;
|
||||||
|
@ -1734,6 +1826,17 @@
|
||||||
attributes = {
|
attributes = {
|
||||||
LastUpgradeCheck = 1250;
|
LastUpgradeCheck = 1250;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
|
3D42D1B42642BB62002A170C = {
|
||||||
|
CreatedOnToolsVersion = 12.4;
|
||||||
|
DevelopmentTeam = "";
|
||||||
|
ProvisioningStyle = Automatic;
|
||||||
|
TestTargetID = 8D1107260486CEB800E47090;
|
||||||
|
};
|
||||||
|
3D42D2732642BEA0002A170C = {
|
||||||
|
CreatedOnToolsVersion = 12.4;
|
||||||
|
DevelopmentTeam = "";
|
||||||
|
ProvisioningStyle = Automatic;
|
||||||
|
};
|
||||||
8D1107260486CEB800E47090 = {
|
8D1107260486CEB800E47090 = {
|
||||||
DevelopmentTeam = "";
|
DevelopmentTeam = "";
|
||||||
LastSwiftMigration = 1220;
|
LastSwiftMigration = 1220;
|
||||||
|
@ -1880,6 +1983,8 @@
|
||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
targets = (
|
targets = (
|
||||||
8D1107260486CEB800E47090 /* Cog */,
|
8D1107260486CEB800E47090 /* Cog */,
|
||||||
|
3D42D1B42642BB62002A170C /* CogTests */,
|
||||||
|
3D42D2732642BEA0002A170C /* SecondsFormatterTests */,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
|
@ -2105,6 +2210,20 @@
|
||||||
/* End PBXReferenceProxy section */
|
/* End PBXReferenceProxy section */
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
3D42D1B32642BB62002A170C /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
3D42D2722642BEA0002A170C /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
8D1107290486CEB800E47090 /* Resources */ = {
|
8D1107290486CEB800E47090 /* Resources */ = {
|
||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
|
@ -2192,6 +2311,23 @@
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
3D42D1B12642BB62002A170C /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
3D42D1B82642BB62002A170C /* CogTests.m in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
3D42D2702642BEA0002A170C /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
3D42D2772642BEA0002A170C /* SecondsFormatterTests.m in Sources */,
|
||||||
|
3D42D2C12642BF5D002A170C /* SecondsFormatter.m in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
8D11072C0486CEB800E47090 /* Sources */ = {
|
8D11072C0486CEB800E47090 /* Sources */ = {
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
|
@ -2256,6 +2392,7 @@
|
||||||
17F6C8070F603701000D9DA9 /* PlaybackEventController.m in Sources */,
|
17F6C8070F603701000D9DA9 /* PlaybackEventController.m in Sources */,
|
||||||
83BC5AB220E4C87100631CD4 /* DualWindow.m in Sources */,
|
83BC5AB220E4C87100631CD4 /* DualWindow.m in Sources */,
|
||||||
1784560F0F631E24007E8021 /* FileTreeViewController.m in Sources */,
|
1784560F0F631E24007E8021 /* FileTreeViewController.m in Sources */,
|
||||||
|
3D42D1302641739C002A170C /* MonospacedDigitTextFieldCell.m in Sources */,
|
||||||
178456120F631E31007E8021 /* SideViewController.m in Sources */,
|
178456120F631E31007E8021 /* SideViewController.m in Sources */,
|
||||||
17D1B1010F63255200694C57 /* InfoWindowController.m in Sources */,
|
17D1B1010F63255200694C57 /* InfoWindowController.m in Sources */,
|
||||||
17D1B1680F632ABB00694C57 /* BlankZeroFormatter.m in Sources */,
|
17D1B1680F632ABB00694C57 /* BlankZeroFormatter.m in Sources */,
|
||||||
|
@ -2318,6 +2455,11 @@
|
||||||
name = Preferences;
|
name = Preferences;
|
||||||
targetProxy = 17F5623A0C3BD9280019975C /* PBXContainerItemProxy */;
|
targetProxy = 17F5623A0C3BD9280019975C /* PBXContainerItemProxy */;
|
||||||
};
|
};
|
||||||
|
3D42D1BB2642BB62002A170C /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = 8D1107260486CEB800E47090 /* Cog */;
|
||||||
|
targetProxy = 3D42D1BA2642BB62002A170C /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
834D793020E4EFCC00C4A5CC /* PBXTargetDependency */ = {
|
834D793020E4EFCC00C4A5CC /* PBXTargetDependency */ = {
|
||||||
isa = PBXTargetDependency;
|
isa = PBXTargetDependency;
|
||||||
name = "VorbisPlugin Plugin";
|
name = "VorbisPlugin Plugin";
|
||||||
|
@ -2511,6 +2653,142 @@
|
||||||
/* End PBXVariantGroup section */
|
/* End PBXVariantGroup section */
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
|
3D42D1BC2642BB62002A170C /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
INFOPLIST_FILE = CogTests/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.CogTests;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Cog.app/Contents/MacOS/Cog";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
3D42D1BD2642BB62002A170C /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
INFOPLIST_FILE = CogTests/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.CogTests;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Cog.app/Contents/MacOS/Cog";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
3D42D2792642BEA1002A170C /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
INFOPLIST_FILE = SecondsFormatterTests/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.SecondsFormatterTests;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
3D42D27A2642BEA1002A170C /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
INFOPLIST_FILE = SecondsFormatterTests/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = org.cogx.SecondsFormatterTests;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
C01FCF4B08A954540054247B /* Debug */ = {
|
C01FCF4B08A954540054247B /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
@ -2686,6 +2964,24 @@
|
||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
/* Begin XCConfigurationList section */
|
||||||
|
3D42D1C02642BB62002A170C /* Build configuration list for PBXNativeTarget "CogTests" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
3D42D1BC2642BB62002A170C /* Debug */,
|
||||||
|
3D42D1BD2642BB62002A170C /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
3D42D27D2642BEA1002A170C /* Build configuration list for PBXNativeTarget "SecondsFormatterTests" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
3D42D2792642BEA1002A170C /* Debug */,
|
||||||
|
3D42D27A2642BEA1002A170C /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Cog" */ = {
|
C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Cog" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
|
|
|
@ -37,6 +37,16 @@
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</MacroExpansion>
|
</MacroExpansion>
|
||||||
<Testables>
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "3D42D1B42642BB62002A170C"
|
||||||
|
BuildableName = "CogTests.xctest"
|
||||||
|
BlueprintName = "CogTests"
|
||||||
|
ReferencedContainer = "container:Cog.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
</Testables>
|
</Testables>
|
||||||
</TestAction>
|
</TestAction>
|
||||||
<LaunchAction
|
<LaunchAction
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1240"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "3D42D2732642BEA0002A170C"
|
||||||
|
BuildableName = "SecondsFormatterTests.xctest"
|
||||||
|
BlueprintName = "SecondsFormatterTests"
|
||||||
|
ReferencedContainer = "container:Cog.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
|
@ -0,0 +1,36 @@
|
||||||
|
//
|
||||||
|
// CogTests.m
|
||||||
|
// CogTests
|
||||||
|
//
|
||||||
|
// Created by Jan on 05.05.21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <XCTest/XCTest.h>
|
||||||
|
|
||||||
|
@interface CogTests : XCTestCase
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation CogTests
|
||||||
|
|
||||||
|
- (void)setUp {
|
||||||
|
// Put setup code here. This method is called before the invocation of each test method in the class.
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)tearDown {
|
||||||
|
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)testExample {
|
||||||
|
// This is an example of a functional test case.
|
||||||
|
// Use XCTAssert and related functions to verify your tests produce the correct results.
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)testPerformanceExample {
|
||||||
|
// This is an example of a performance test case.
|
||||||
|
[self measureBlock:^{
|
||||||
|
// Put the code you want to measure the time of here.
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -0,0 +1,22 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>1</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
|
@ -24,4 +24,6 @@
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSString * _Nullable)stringForTimeInterval:(NSTimeInterval)timeInterval;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -20,78 +20,202 @@
|
||||||
|
|
||||||
#import "SecondsFormatter.h"
|
#import "SecondsFormatter.h"
|
||||||
|
|
||||||
|
#define TWO_GIGASECONDS_IS_ENOUGH 1 // 2 Gs is about 68 years.
|
||||||
|
#if TWO_GIGASECONDS_IS_ENOUGH
|
||||||
|
typedef int32_t sec_t; // Type used internally for time values (mostly in seconds).
|
||||||
|
#define PRIsec PRIi32
|
||||||
|
#define SEC_MAX INT32_MAX
|
||||||
|
#define scanSec scanInt
|
||||||
|
#else
|
||||||
|
typedef NSInteger sec_t;
|
||||||
|
#define PRIsec "zd"
|
||||||
|
#define SEC_MAX NSIntegerMax
|
||||||
|
#define scanSec scanInteger
|
||||||
|
#endif
|
||||||
|
|
||||||
@implementation SecondsFormatter
|
@implementation SecondsFormatter
|
||||||
|
|
||||||
- (NSString *) stringForObjectValue:(id)object
|
- (NSString *) stringForObjectValue:(id)object
|
||||||
{
|
{
|
||||||
NSString *result = nil;
|
if (nil == object || NO == [object isKindOfClass:[NSNumber class]]) {
|
||||||
unsigned value;
|
// Docs state: “Returns nil if object is not of the correct class.”
|
||||||
unsigned days = 0;
|
return nil;
|
||||||
unsigned hours = 0;
|
|
||||||
unsigned minutes = 0;
|
|
||||||
unsigned seconds = 0;
|
|
||||||
|
|
||||||
if(nil == object || NO == [object isKindOfClass:[NSNumber class]] || isnan([object doubleValue])) {
|
|
||||||
return @"";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
value = (unsigned)([object doubleValue]);
|
NSTimeInterval timeInterval = [object doubleValue];
|
||||||
|
|
||||||
seconds = value % 60;
|
return [self stringForTimeInterval:timeInterval];
|
||||||
minutes = value / 60;
|
}
|
||||||
|
|
||||||
while(60 <= minutes) {
|
- (NSString * _Nullable)stringForTimeInterval:(NSTimeInterval)timeInterval;
|
||||||
|
{
|
||||||
|
if (isnan(timeInterval)) { return @"NaN"; }
|
||||||
|
if (isinf(timeInterval)) { return @"Inf"; }
|
||||||
|
|
||||||
|
BOOL isNegative = signbit(timeInterval);
|
||||||
|
|
||||||
|
sec_t totalSeconds = (sec_t)(isNegative ? -timeInterval : timeInterval);
|
||||||
|
|
||||||
|
sec_t seconds = totalSeconds % 60;
|
||||||
|
sec_t minutes = totalSeconds / 60;
|
||||||
|
sec_t hours = 0;
|
||||||
|
sec_t days = 0;
|
||||||
|
|
||||||
|
while (60 <= minutes) {
|
||||||
minutes -= 60;
|
minutes -= 60;
|
||||||
++hours;
|
++hours;
|
||||||
}
|
}
|
||||||
|
|
||||||
while(24 <= hours) {
|
while (24 <= hours) {
|
||||||
hours -= 24;
|
hours -= 24;
|
||||||
++days;
|
++days;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(0 < days) {
|
NSString *result = nil;
|
||||||
result = [NSString stringWithFormat:@"%u:%.2u:%.2u:%.2u", days, hours, minutes, seconds];
|
|
||||||
|
const char *signPrefix = isNegative ? "-" : "";
|
||||||
|
|
||||||
|
if (0 < days) {
|
||||||
|
result = [NSString stringWithFormat:@"%s" "%" PRIsec ":" "%02" PRIsec ":" "%02" PRIsec ":" "%02" PRIsec "", signPrefix, days, hours, minutes, seconds];
|
||||||
}
|
}
|
||||||
else if(0 < hours) {
|
else if (0 < hours) {
|
||||||
result = [NSString stringWithFormat:@"%u:%.2u:%.2u", hours, minutes, seconds];
|
result = [NSString stringWithFormat:@"%s" "%" PRIsec ":" "%02" PRIsec ":" "%02" PRIsec "", signPrefix, hours, minutes, seconds];
|
||||||
}
|
}
|
||||||
else if(0 < minutes) {
|
else if (0 < minutes) {
|
||||||
result = [NSString stringWithFormat:@"%u:%.2u", minutes, seconds];
|
result = [NSString stringWithFormat:@"%s" "%" PRIsec ":" "%02" PRIsec "", signPrefix, minutes, seconds];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
result = [NSString stringWithFormat:@"0:%.2u", seconds];
|
result = [NSString stringWithFormat:@"%s" "0:" "%02" PRIsec "", signPrefix, seconds];
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL) getObjectValue:(id *)object forString:(NSString *)string errorDescription:(NSString **)error
|
- (BOOL)getObjectValue:(out id _Nullable __autoreleasing *)object
|
||||||
|
forString:(NSString *)string
|
||||||
|
errorDescription:(out NSString * _Nullable __autoreleasing *)error
|
||||||
{
|
{
|
||||||
NSScanner *scanner = nil;
|
// In the previous implementation,
|
||||||
BOOL result = NO;
|
// all types were incorrectly treated indentically.
|
||||||
int value = 0;
|
// This made the code much simpler,
|
||||||
unsigned seconds = 0;
|
// but the added complexity is needed to support both negative and large values.
|
||||||
|
|
||||||
scanner = [NSScanner scannerWithString:string];
|
NSScanner *scanner = [NSScanner scannerWithString:string];
|
||||||
|
|
||||||
while(NO == [scanner isAtEnd]) {
|
BOOL malformed = NO;
|
||||||
|
|
||||||
// Grab a value
|
const int segmentCount = 4;
|
||||||
if([scanner scanInt:&value]) {
|
const int lastSegment = segmentCount - 1;
|
||||||
seconds *= 60;
|
sec_t segments[segmentCount] = {-1, -1, -1, -1};
|
||||||
seconds += value;
|
int lastScannedSegment = -1;
|
||||||
result = YES;
|
|
||||||
|
BOOL isNegative = NO;
|
||||||
|
|
||||||
|
if ([scanner isAtEnd] == NO) {
|
||||||
|
isNegative = [scanner scanString:@"-" intoString:NULL];
|
||||||
|
|
||||||
|
int segmentIndex = 0;
|
||||||
|
|
||||||
|
while ([scanner isAtEnd] == NO) {
|
||||||
|
// Grab a value
|
||||||
|
if ([scanner scanSec:&(segments[segmentIndex])] == NO) {
|
||||||
|
segments[segmentIndex] = -1;
|
||||||
|
malformed = YES;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (segmentIndex == lastSegment) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Grab the separator, if present
|
||||||
|
if ([scanner scanString:@":" intoString:NULL] == NO) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
segmentIndex += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Grab the separator, if present
|
lastScannedSegment = segmentIndex;
|
||||||
[scanner scanString:@":" intoString:NULL];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(result && NULL != object) {
|
if ([scanner isAtEnd] == NO) {
|
||||||
*object = [NSNumber numberWithUnsignedInt:seconds];
|
malformed = YES;
|
||||||
}
|
}
|
||||||
else if(NULL != error) {
|
|
||||||
|
sec_t seconds = 0;
|
||||||
|
|
||||||
|
if (malformed == NO) {
|
||||||
|
// `segments` entries need to be mapped to the correct unit type.
|
||||||
|
// The position of each type depends on the number of scanned segments.
|
||||||
|
|
||||||
|
const int typeCount = segmentCount;
|
||||||
|
|
||||||
|
typedef enum : int {
|
||||||
|
DAYS = 0, HOURS = 1, MINUTES = 2, SECONDS = 3,
|
||||||
|
} SegmentType;
|
||||||
|
|
||||||
|
const int segmentIndexes[segmentCount][typeCount] = {
|
||||||
|
{ -1, -1, -1, 0 },
|
||||||
|
{ -1, -1, 0, 1 },
|
||||||
|
{ -1, 0, 1, 2 },
|
||||||
|
{ 0, 1, 2, 3 },
|
||||||
|
};
|
||||||
|
|
||||||
|
#define HAS_SEGMENT(segmentType) \
|
||||||
|
(segmentIndexes[lastScannedSegment][(segmentType)] >= 0)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
sec_t max;
|
||||||
|
sec_t scaleFactor;
|
||||||
|
} SegmentMetadata;
|
||||||
|
|
||||||
|
const SegmentMetadata segmentMetadata[segmentCount] = {
|
||||||
|
{.max = SEC_MAX, .scaleFactor = 24},
|
||||||
|
{.max = 24, .scaleFactor = 60},
|
||||||
|
{.max = 60, .scaleFactor = 60},
|
||||||
|
{.max = 60, .scaleFactor = 1},
|
||||||
|
};
|
||||||
|
|
||||||
|
for (SegmentType segmentType = DAYS; segmentType < segmentCount; segmentType += 1) {
|
||||||
|
if (!HAS_SEGMENT(segmentType)) {
|
||||||
|
if (segmentType == SECONDS) {
|
||||||
|
// Must have SECONDS.
|
||||||
|
malformed = YES;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const int index = segmentIndexes[lastScannedSegment][segmentType];
|
||||||
|
|
||||||
|
const SegmentMetadata metadata = segmentMetadata[segmentType];
|
||||||
|
|
||||||
|
if ((segments[index] >= 0) && (segments[index] < metadata.max)) {
|
||||||
|
seconds += segments[index];
|
||||||
|
seconds *= metadata.scaleFactor;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
malformed = YES;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
seconds *= (isNegative ? -1 : 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const BOOL result = (malformed == NO);
|
||||||
|
|
||||||
|
if (result && NULL != object) {
|
||||||
|
NSTimeInterval timeInterval = (NSTimeInterval)seconds;
|
||||||
|
// NOTE: The floating point standard has support for negative zero.
|
||||||
|
// We use that to represent the parsing result without information loss.
|
||||||
|
if (isNegative && (timeInterval == 0.0)) { timeInterval = -0.0; }
|
||||||
|
*object = @(timeInterval);
|
||||||
|
}
|
||||||
|
else if (NULL != error) {
|
||||||
*error = @"Couldn't convert value to seconds";
|
*error = @"Couldn't convert value to seconds";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,9 +224,11 @@
|
||||||
|
|
||||||
- (NSAttributedString *) attributedStringForObjectValue:(id)object withDefaultAttributes:(NSDictionary *)attributes
|
- (NSAttributedString *) attributedStringForObjectValue:(id)object withDefaultAttributes:(NSDictionary *)attributes
|
||||||
{
|
{
|
||||||
NSAttributedString *result = nil;
|
NSString *stringValue = [self stringForObjectValue:object];
|
||||||
|
if(nil == stringValue)
|
||||||
|
return nil;
|
||||||
|
|
||||||
result = [[NSAttributedString alloc] initWithString:[self stringForObjectValue:object] attributes:attributes];
|
NSAttributedString *result = [[NSAttributedString alloc] initWithString:stringValue attributes:attributes];
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,14 @@
|
||||||
- (void)awakeFromNib {
|
- (void)awakeFromNib {
|
||||||
[[self menu] setAutoenablesItems:NO];
|
[[self menu] setAutoenablesItems:NO];
|
||||||
|
|
||||||
|
#if 0
|
||||||
// Configure bindings to scale font size and row height
|
// Configure bindings to scale font size and row height
|
||||||
|
// NOTE: This currently seems to be without effect.
|
||||||
|
// NSFont value overwritten by
|
||||||
|
// -[NSDisplayFontBinder _adjustFontOfObject:mode:triggerRedisplay:compareDirectly:toFont:]
|
||||||
|
// called by
|
||||||
|
// -[NSWindow makeKeyAndOrderFront:]
|
||||||
|
|
||||||
NSControlSize s = NSControlSizeSmall;
|
NSControlSize s = NSControlSizeSmall;
|
||||||
NSFont *f = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:s]];
|
NSFont *f = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:s]];
|
||||||
// NSFont *bf = [[NSFontManager sharedFontManager] convertFont:f toHaveTrait:NSBoldFontMask];
|
// NSFont *bf = [[NSFontManager sharedFontManager] convertFont:f toHaveTrait:NSBoldFontMask];
|
||||||
|
@ -33,18 +40,7 @@
|
||||||
[[col dataCell] setControlSize:s];
|
[[col dataCell] setControlSize:s];
|
||||||
[[col dataCell] setFont:f];
|
[[col dataCell] setFont:f];
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
// Set up formatters
|
|
||||||
NSFormatter *secondsFormatter = [[SecondsFormatter alloc] init];
|
|
||||||
[[[self tableColumnWithIdentifier:@"length"] dataCell] setFormatter:secondsFormatter];
|
|
||||||
|
|
||||||
NSFormatter *indexFormatter = [[IndexFormatter alloc] init];
|
|
||||||
[[[self tableColumnWithIdentifier:@"index"] dataCell] setFormatter:indexFormatter];
|
|
||||||
|
|
||||||
NSFormatter *blankZeroFormatter = [[BlankZeroFormatter alloc] init];
|
|
||||||
[[[self tableColumnWithIdentifier:@"track"] dataCell] setFormatter:blankZeroFormatter];
|
|
||||||
[[[self tableColumnWithIdentifier:@"year"] dataCell] setFormatter:blankZeroFormatter];
|
|
||||||
// end setting up formatters
|
|
||||||
|
|
||||||
[self setVerticalMotionCanBeginDrag:YES];
|
[self setVerticalMotionCanBeginDrag:YES];
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>1</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
|
@ -0,0 +1,131 @@
|
||||||
|
//
|
||||||
|
// SecondsFormatterTests.m
|
||||||
|
// SecondsFormatterTests
|
||||||
|
//
|
||||||
|
// Created by Jan on 05.05.21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <XCTest/XCTest.h>
|
||||||
|
|
||||||
|
#import "SecondsFormatter.h"
|
||||||
|
|
||||||
|
@interface SecondsFormatterTests : XCTestCase
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation SecondsFormatterTests
|
||||||
|
|
||||||
|
- (void)setUp
|
||||||
|
{
|
||||||
|
[super setUp];
|
||||||
|
// Put setup code here. This method is called before the invocation of each test method in the class.
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)tearDown
|
||||||
|
{
|
||||||
|
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
||||||
|
[super tearDown];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)testPositive
|
||||||
|
{
|
||||||
|
NSDictionary *testsDict =
|
||||||
|
@{
|
||||||
|
// key: test name, value: test string
|
||||||
|
@"Zero": @"0:00",
|
||||||
|
@"One Second": @"0:01",
|
||||||
|
@"One Minute": @"1:00",
|
||||||
|
@"One Hour": @"1:00:00",
|
||||||
|
@"One Day": @"1:00:00:00",
|
||||||
|
@"One of Each": @"1:01:01:01",
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TEST_INFO @"Test name: %@, Source string: %@", testName, string
|
||||||
|
|
||||||
|
NSFormatter *secondsFormatter = [[SecondsFormatter alloc] init];
|
||||||
|
|
||||||
|
[testsDict enumerateKeysAndObjectsUsingBlock:
|
||||||
|
^(NSString *testName, NSString *string, BOOL * _Nonnull stop) {
|
||||||
|
NSNumber *value;
|
||||||
|
BOOL result =
|
||||||
|
[secondsFormatter getObjectValue:&value
|
||||||
|
forString:string
|
||||||
|
errorDescription:NULL];
|
||||||
|
XCTAssertTrue(result, TEST_INFO);
|
||||||
|
NSString *timeString = [secondsFormatter stringForObjectValue:value];
|
||||||
|
XCTAssertEqualObjects(string, timeString, TEST_INFO);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)testNegative
|
||||||
|
{
|
||||||
|
NSDictionary *testsDict =
|
||||||
|
@{
|
||||||
|
// key: test name, value: test string
|
||||||
|
@"Negative Zero": @"-0:00",
|
||||||
|
@"Negative One Second": @"-0:01",
|
||||||
|
@"Negative One Minute": @"-1:00",
|
||||||
|
@"Negative One Hour": @"-1:00:00",
|
||||||
|
@"Negative One Day": @"-1:00:00:00",
|
||||||
|
@"Negative One of Each": @"-1:01:01:01",
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TEST_INFO @"Test name: %@, Source string: %@", testName, string
|
||||||
|
|
||||||
|
NSFormatter *secondsFormatter = [[SecondsFormatter alloc] init];
|
||||||
|
|
||||||
|
[testsDict enumerateKeysAndObjectsUsingBlock:
|
||||||
|
^(NSString *testName, NSString *string, BOOL * _Nonnull stop) {
|
||||||
|
NSNumber *value;
|
||||||
|
BOOL result =
|
||||||
|
[secondsFormatter getObjectValue:&value
|
||||||
|
forString:string
|
||||||
|
errorDescription:NULL];
|
||||||
|
XCTAssertTrue(result, TEST_INFO);
|
||||||
|
NSString *timeString = [secondsFormatter stringForObjectValue:value];
|
||||||
|
XCTAssertEqualObjects(string, timeString, TEST_INFO);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)testMalformed
|
||||||
|
{
|
||||||
|
NSDictionary *testsDict =
|
||||||
|
@{
|
||||||
|
// key: test name, value: test string
|
||||||
|
@"Empty String": @"",
|
||||||
|
@"Random String": @"abc",
|
||||||
|
@"Solitary Minus": @"-",
|
||||||
|
@"Malformed Seconds": @"0:60",
|
||||||
|
@"Malformed Minutes": @"60:00",
|
||||||
|
@"Malformed Hours": @"24:00:00",
|
||||||
|
@"Illegal #1": @":00",
|
||||||
|
@"Illegal #2": @"-:00",
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TEST_INFO @"Test name: %@, Source string: %@", testName, string
|
||||||
|
|
||||||
|
NSFormatter *secondsFormatter = [[SecondsFormatter alloc] init];
|
||||||
|
|
||||||
|
[testsDict enumerateKeysAndObjectsUsingBlock:
|
||||||
|
^(NSString *testName, NSString *string, BOOL * _Nonnull stop) {
|
||||||
|
NSNumber *value;
|
||||||
|
BOOL result =
|
||||||
|
[secondsFormatter getObjectValue:&value
|
||||||
|
forString:string
|
||||||
|
errorDescription:NULL];
|
||||||
|
XCTAssertFalse(result, TEST_INFO);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
- (void)testPerformanceExample
|
||||||
|
{
|
||||||
|
// This is an example of a performance test case.
|
||||||
|
[self measureBlock:^{
|
||||||
|
// Put the code you want to measure the time of here.
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@end
|
|
@ -0,0 +1,18 @@
|
||||||
|
//
|
||||||
|
// MonospacedDigitTextFieldCell.h
|
||||||
|
// Cog
|
||||||
|
//
|
||||||
|
// Created by Jan on 04.05.21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface MonospacedDigitTextFieldCell : NSTextFieldCell {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,23 @@
|
||||||
|
//
|
||||||
|
// MonospacedDigitTextFieldCell.m
|
||||||
|
// Cog
|
||||||
|
//
|
||||||
|
// Created by Jan on 04.05.21.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "MonospacedDigitTextFieldCell.h"
|
||||||
|
|
||||||
|
@implementation MonospacedDigitTextFieldCell
|
||||||
|
|
||||||
|
- (void)setFont:(NSFont *)font
|
||||||
|
{
|
||||||
|
CGFloat size = font.pointSize;
|
||||||
|
|
||||||
|
NSNumber *weightNum = [font.fontDescriptor objectForKey:NSFontWeightTrait];
|
||||||
|
NSFontWeight weight = weightNum ? weightNum.doubleValue : NSFontWeightRegular;
|
||||||
|
|
||||||
|
super.font = [NSFont monospacedDigitSystemFontOfSize:size
|
||||||
|
weight:weight];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -13,21 +13,21 @@
|
||||||
|
|
||||||
- (void)setDoubleValue:(double)value
|
- (void)setDoubleValue:(double)value
|
||||||
{
|
{
|
||||||
self.positionTextField.currentTime = (long)value;
|
self.positionTextField.currentTime = value;
|
||||||
|
|
||||||
[super setDoubleValue:value];
|
[super setDoubleValue:value];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setMaxValue:(double)value
|
- (void)setMaxValue:(double)value
|
||||||
{
|
{
|
||||||
self.positionTextField.duration = (long)value;
|
self.positionTextField.duration = value;
|
||||||
|
|
||||||
[super setMaxValue:value];
|
[super setMaxValue:value];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)mouseDragged:(NSEvent *)theEvent
|
- (void)mouseDragged:(NSEvent *)theEvent
|
||||||
{
|
{
|
||||||
self.positionTextField.currentTime = (long)[self doubleValue];
|
self.positionTextField.currentTime = [self doubleValue];
|
||||||
|
|
||||||
[super mouseDragged:theEvent];
|
[super mouseDragged:theEvent];
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
@interface TimeField : NSTextField
|
@interface TimeField : NSTextField
|
||||||
|
|
||||||
@property (nonatomic) NSInteger currentTime;
|
@property (nonatomic) NSTimeInterval currentTime;
|
||||||
@property (nonatomic) NSInteger duration;
|
@property (nonatomic) NSTimeInterval duration;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -8,26 +8,46 @@
|
||||||
|
|
||||||
#import "TimeField.h"
|
#import "TimeField.h"
|
||||||
|
|
||||||
|
#import "SecondsFormatter.h"
|
||||||
|
|
||||||
|
|
||||||
static NSString *kTimerModeKey = @"timerShowTimeRemaining";
|
static NSString *kTimerModeKey = @"timerShowTimeRemaining";
|
||||||
|
|
||||||
NSString * formatTimer(long minutes, long seconds, unichar prefix) {
|
|
||||||
return [NSString localizedStringWithFormat:@"%C%lu:%02lu", prefix, minutes, seconds];;
|
|
||||||
}
|
|
||||||
|
|
||||||
@implementation TimeField {
|
@implementation TimeField {
|
||||||
BOOL showTimeRemaining;
|
BOOL showTimeRemaining;
|
||||||
NSDictionary *fontAttributes;
|
NSDictionary *fontAttributes;
|
||||||
|
SecondsFormatter *secondsFormatter;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)initWithCoder:(NSCoder *)aDecoder
|
||||||
|
{
|
||||||
|
if (self = [super initWithCoder:aDecoder])
|
||||||
|
{
|
||||||
|
[self commonInit];
|
||||||
|
}
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)initWithFrame:(CGRect)frame
|
||||||
|
{
|
||||||
|
if (self = [super initWithFrame:frame])
|
||||||
|
{
|
||||||
|
[self commonInit];
|
||||||
|
}
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)commonInit
|
||||||
|
{
|
||||||
|
secondsFormatter = [[SecondsFormatter alloc] init];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)awakeFromNib
|
- (void)awakeFromNib
|
||||||
{
|
{
|
||||||
showTimeRemaining = [[NSUserDefaults standardUserDefaults] boolForKey:kTimerModeKey];
|
showTimeRemaining = [[NSUserDefaults standardUserDefaults] boolForKey:kTimerModeKey];
|
||||||
if (@available(macOS 10.15, *)) {
|
|
||||||
fontAttributes =
|
|
||||||
@{NSFontAttributeName : [NSFont monospacedSystemFontOfSize:13
|
|
||||||
weight:NSFontWeightMedium]};
|
|
||||||
[self update];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)update
|
- (void)update
|
||||||
|
@ -35,13 +55,16 @@ NSString * formatTimer(long minutes, long seconds, unichar prefix) {
|
||||||
NSString *text;
|
NSString *text;
|
||||||
if (showTimeRemaining == NO)
|
if (showTimeRemaining == NO)
|
||||||
{
|
{
|
||||||
long sec = self.currentTime;
|
NSTimeInterval sec = self.currentTime;
|
||||||
text = formatTimer(sec / 60, sec % 60, 0x2007); // Digit-width space
|
text = [secondsFormatter stringForTimeInterval:sec];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
long sec = MAX(0, self.duration - self.currentTime);
|
NSTimeInterval sec = self.currentTime - self.duration;
|
||||||
text = formatTimer(sec / 60, sec % 60, 0x2012); // Hyphen
|
// NOTE: The floating point standard has support for negative zero.
|
||||||
|
// We use that to enforce the sign prefix.
|
||||||
|
if (sec == 0.0) { sec = -0.0; }
|
||||||
|
text = [secondsFormatter stringForTimeInterval:sec];
|
||||||
}
|
}
|
||||||
NSAttributedString *string = [[NSAttributedString alloc] initWithString:text
|
NSAttributedString *string = [[NSAttributedString alloc] initWithString:text
|
||||||
attributes:fontAttributes];
|
attributes:fontAttributes];
|
||||||
|
@ -55,7 +78,7 @@ NSString * formatTimer(long minutes, long seconds, unichar prefix) {
|
||||||
[self update];
|
[self update];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setCurrentTime:(NSInteger)currentTime
|
- (void)setCurrentTime:(NSTimeInterval)currentTime
|
||||||
{
|
{
|
||||||
_currentTime = currentTime;
|
_currentTime = currentTime;
|
||||||
[self update];
|
[self update];
|
||||||
|
|
Loading…
Reference in New Issue