Commit 085dacdb by Daniel Dahan

editor: added memory updates

parents 81e6a5c8 f9213969
...@@ -102,10 +102,10 @@ open class Bar: View { ...@@ -102,10 +102,10 @@ open class Bar: View {
} }
/// ContentView that holds the any desired subviews. /// ContentView that holds the any desired subviews.
open private(set) lazy var contentView = View() open fileprivate(set) lazy var contentView = UIView()
/// Left side UIViews. /// Left side UIViews.
open var leftViews = [UIView]() { open var leftViews: [UIView] {
didSet { didSet {
for v in oldValue { for v in oldValue {
v.removeFromSuperview() v.removeFromSuperview()
...@@ -115,7 +115,7 @@ open class Bar: View { ...@@ -115,7 +115,7 @@ open class Bar: View {
} }
/// Right side UIViews. /// Right side UIViews.
open var rightViews = [UIView]() { open var rightViews: [UIView] {
didSet { didSet {
for v in oldValue { for v in oldValue {
v.removeFromSuperview() v.removeFromSuperview()
...@@ -130,9 +130,6 @@ open class Bar: View { ...@@ -130,9 +130,6 @@ open class Bar: View {
return contentView.grid.views return contentView.grid.views
} }
set(value) { set(value) {
for v in contentView.grid.views {
v.removeFromSuperview()
}
contentView.grid.views = value contentView.grid.views = value
} }
} }
...@@ -142,6 +139,8 @@ open class Bar: View { ...@@ -142,6 +139,8 @@ open class Bar: View {
- Parameter aDecoder: A NSCoder instance. - Parameter aDecoder: A NSCoder instance.
*/ */
public required init?(coder aDecoder: NSCoder) { public required init?(coder aDecoder: NSCoder) {
leftViews = []
rightViews = []
super.init(coder: aDecoder) super.init(coder: aDecoder)
} }
...@@ -152,13 +151,14 @@ open class Bar: View { ...@@ -152,13 +151,14 @@ open class Bar: View {
- Parameter frame: A CGRect instance. - Parameter frame: A CGRect instance.
*/ */
public override init(frame: CGRect) { public override init(frame: CGRect) {
leftViews = []
rightViews = []
super.init(frame: frame) super.init(frame: frame)
} }
/// Basic initializer. /// Convenience initializer.
public init() { public convenience init() {
super.init(frame: .zero) self.init(frame: .zero)
frame.size = intrinsicContentSize
} }
/** /**
...@@ -167,12 +167,11 @@ open class Bar: View { ...@@ -167,12 +167,11 @@ open class Bar: View {
- Parameter rightViews: An Array of UIViews that go on the right side. - Parameter rightViews: An Array of UIViews that go on the right side.
- Parameter centerViews: An Array of UIViews that go in the center. - Parameter centerViews: An Array of UIViews that go in the center.
*/ */
public init(leftViews: [UIView]? = nil, rightViews: [UIView]? = nil, centerViews: [UIView]? = nil) { public convenience init(leftViews: [UIView]? = nil, rightViews: [UIView]? = nil, centerViews: [UIView]? = nil) {
super.init(frame: .zero) self.init()
self.leftViews = leftViews ?? [] self.leftViews = leftViews ?? []
self.rightViews = rightViews ?? [] self.rightViews = rightViews ?? []
self.centerViews = centerViews ?? [] self.centerViews = centerViews ?? []
frame.size = intrinsicContentSize
} }
open override func layoutSubviews() { open override func layoutSubviews() {
...@@ -275,11 +274,5 @@ open class Bar: View { ...@@ -275,11 +274,5 @@ open class Bar: View {
autoresizingMask = .flexibleWidth autoresizingMask = .flexibleWidth
interimSpacePreset = .interimSpace3 interimSpacePreset = .interimSpace3
contentEdgeInsetsPreset = .square1 contentEdgeInsetsPreset = .square1
prepareContentView()
}
/// Prepares the contentView.
private func prepareContentView() {
contentView.backgroundColor = nil
} }
} }
...@@ -76,10 +76,6 @@ open class BottomTabBar: UITabBar { ...@@ -76,10 +76,6 @@ open class BottomTabBar: UITabBar {
open override func layoutSublayers(of layer: CALayer) { open override func layoutSublayers(of layer: CALayer) {
super.layoutSublayers(of: layer) super.layoutSublayers(of: layer)
guard self.layer == layer else {
return
}
layoutShape() layoutShape()
} }
......
...@@ -165,10 +165,6 @@ open class Button: UIButton { ...@@ -165,10 +165,6 @@ open class Button: UIButton {
open override func layoutSublayers(of layer: CALayer) { open override func layoutSublayers(of layer: CALayer) {
super.layoutSublayers(of: layer) super.layoutSublayers(of: layer)
guard self.layer == layer else {
return
}
layoutShape() layoutShape()
layoutVisualLayer() layoutVisualLayer()
} }
......
...@@ -219,10 +219,6 @@ open class CollectionReusableView: UICollectionReusableView { ...@@ -219,10 +219,6 @@ open class CollectionReusableView: UICollectionReusableView {
open override func layoutSublayers(of layer: CALayer) { open override func layoutSublayers(of layer: CALayer) {
super.layoutSublayers(of: layer) super.layoutSublayers(of: layer)
guard self.layer == layer else {
return
}
layoutShape() layoutShape()
layoutVisualLayer() layoutVisualLayer()
} }
......
...@@ -226,10 +226,6 @@ open class CollectionViewCell: UICollectionViewCell { ...@@ -226,10 +226,6 @@ open class CollectionViewCell: UICollectionViewCell {
open override func layoutSublayers(of layer: CALayer) { open override func layoutSublayers(of layer: CALayer) {
super.layoutSublayers(of: layer) super.layoutSublayers(of: layer)
guard self.layer == layer else {
return
}
layoutShape() layoutShape()
layoutVisualLayer() layoutVisualLayer()
} }
......
...@@ -269,7 +269,7 @@ private var GridKey: UInt8 = 0 ...@@ -269,7 +269,7 @@ private var GridKey: UInt8 = 0
/// Grid extension for UIView. /// Grid extension for UIView.
extension UIView { extension UIView {
/// Grid reference. /// Grid reference.
public private(set) var grid: Grid { public fileprivate(set) var grid: Grid {
get { get {
return AssociatedObject(base: self, key: &GridKey) { return AssociatedObject(base: self, key: &GridKey) {
return Grid(context: self) return Grid(context: self)
......
...@@ -134,10 +134,6 @@ open class NavigationBar: UINavigationBar { ...@@ -134,10 +134,6 @@ open class NavigationBar: UINavigationBar {
open override func layoutSublayers(of layer: CALayer) { open override func layoutSublayers(of layer: CALayer) {
super.layoutSublayers(of: layer) super.layoutSublayers(of: layer)
guard self.layer == layer else {
return
}
layoutShape() layoutShape()
} }
......
...@@ -80,9 +80,6 @@ public class NavigationItem: NSObject { ...@@ -80,9 +80,6 @@ public class NavigationItem: NSObject {
return contentView.grid.views return contentView.grid.views
} }
set(value) { set(value) {
for v in contentView.grid.views {
v.removeFromSuperview()
}
contentView.grid.views = value contentView.grid.views = value
} }
} }
......
...@@ -152,16 +152,6 @@ open class SearchBar: Bar { ...@@ -152,16 +152,6 @@ open class SearchBar: Bar {
} }
/** /**
A convenience initializer with parameter settings.
- Parameter leftViews: An Array of UIViews that go on the left side.
- Parameter rightViews: An Array of UIViews that go on the right side.
- Parameter centerViews: An Array of UIViews that go in the center.
*/
public override init(leftViews: [UIView]? = nil, rightViews: [UIView]? = nil, centerViews: [UIView]? = nil) {
super.init(leftViews: leftViews, rightViews: rightViews, centerViews: centerViews)
}
/**
Prepares the view instance when intialized. When subclassing, Prepares the view instance when intialized. When subclassing,
it is recommended to override the prepare method it is recommended to override the prepare method
to initialize property values and other setup operations. to initialize property values and other setup operations.
......
...@@ -50,7 +50,7 @@ extension UIViewController { ...@@ -50,7 +50,7 @@ extension UIViewController {
open class StatusBarController: RootController { open class StatusBarController: RootController {
/// A reference to the statusBar. /// A reference to the statusBar.
open private(set) lazy var statusBar = View() open private(set) lazy var statusBar: View = View()
open override var isStatusBarHidden: Bool { open override var isStatusBarHidden: Bool {
didSet { didSet {
......
...@@ -103,10 +103,6 @@ open class TableViewCell: UITableViewCell { ...@@ -103,10 +103,6 @@ open class TableViewCell: UITableViewCell {
open override func layoutSublayers(of layer: CALayer) { open override func layoutSublayers(of layer: CALayer) {
super.layoutSublayers(of: layer) super.layoutSublayers(of: layer)
guard self.layer == layer else {
return
}
layoutShape() layoutShape()
layoutVisualLayer() layoutVisualLayer()
} }
......
...@@ -381,10 +381,6 @@ open class TextField: UITextField { ...@@ -381,10 +381,6 @@ open class TextField: UITextField {
open override func layoutSublayers(of layer: CALayer) { open override func layoutSublayers(of layer: CALayer) {
super.layoutSublayers(of: layer) super.layoutSublayers(of: layer)
guard self.layer == layer else {
return
}
layoutShape() layoutShape()
} }
......
...@@ -34,9 +34,10 @@ import UIKit ...@@ -34,9 +34,10 @@ import UIKit
public protocol TextViewDelegate : UITextViewDelegate {} public protocol TextViewDelegate : UITextViewDelegate {}
@objc(TextView) @objc(TextView)
public class TextView: UITextView { open class TextView: UITextView {
/// A property that accesses the backing layer's background /// A property that accesses the backing layer's background
@IBInspectable public override var backgroundColor: UIColor? { @IBInspectable
open override var backgroundColor: UIColor? {
didSet { didSet {
layer.backgroundColor = backgroundColor?.cgColor layer.backgroundColor = backgroundColor?.cgColor
} }
...@@ -47,44 +48,49 @@ public class TextView: UITextView { ...@@ -47,44 +48,49 @@ public class TextView: UITextView {
titleLabel text value is updated with the placeholderLabel titleLabel text value is updated with the placeholderLabel
text value before being displayed. text value before being displayed.
*/ */
public var titleLabel: UILabel? { @IBInspectable
open var titleLabel: UILabel? {
didSet { didSet {
prepareTitleLabel() prepareTitleLabel()
} }
} }
/// The color of the titleLabel text when the textView is not active. /// The color of the titleLabel text when the textView is not active.
@IBInspectable public var titleLabelColor: UIColor? { @IBInspectable
open var titleLabelColor: UIColor? {
didSet { didSet {
titleLabel?.textColor = titleLabelColor titleLabel?.textColor = titleLabelColor
} }
} }
/// The color of the titleLabel text when the textView is active. /// The color of the titleLabel text when the textView is active.
@IBInspectable public var titleLabelActiveColor: UIColor? @IBInspectable
open var titleLabelActiveColor: UIColor?
/** /**
A property that sets the distance between the textView and A property that sets the distance between the textView and
titleLabel. titleLabel.
*/ */
@IBInspectable public var titleLabelAnimationDistance: CGFloat = 8 @IBInspectable
open var titleLabelAnimationDistance: CGFloat = 8
/// Placeholder UILabel view. /// Placeholder UILabel view.
public var placeholderLabel: UILabel? { open var placeholderLabel: UILabel? {
didSet { didSet {
preparePlaceholderLabel() preparePlaceholderLabel()
} }
} }
/// An override to the text property. /// An override to the text property.
@IBInspectable public override var text: String! { @IBInspectable
open override var text: String! {
didSet { didSet {
handleTextViewTextDidChange() handleTextViewTextDidChange()
} }
} }
/// An override to the attributedText property. /// An override to the attributedText property.
public override var attributedText: NSAttributedString! { open override var attributedText: NSAttributedString! {
didSet { didSet {
handleTextViewTextDidChange() handleTextViewTextDidChange()
} }
...@@ -94,16 +100,16 @@ public class TextView: UITextView { ...@@ -94,16 +100,16 @@ public class TextView: UITextView {
Text container UIEdgeInset preset property. This updates the Text container UIEdgeInset preset property. This updates the
textContainerInset property with a preset value. textContainerInset property with a preset value.
*/ */
public var textContainerEdgeInsetsPreset: EdgeInsetsPreset = .none { open var textContainerEdgeInsetsPreset: EdgeInsetsPreset = .none {
didSet { didSet {
textContainerInset = EdgeInsetsPresetToValue(preset: textContainerEdgeInsetsPreset) textContainerInset = EdgeInsetsPresetToValue(preset: textContainerEdgeInsetsPreset)
} }
} }
/// Text container UIEdgeInset property. /// Text container UIEdgeInset property.
public override var textContainerInset: EdgeInsets { open override var textContainerInset: EdgeInsets {
didSet { didSet {
reloadView() reload()
} }
} }
...@@ -143,16 +149,12 @@ public class TextView: UITextView { ...@@ -143,16 +149,12 @@ public class TextView: UITextView {
removeNotificationHandlers() removeNotificationHandlers()
} }
public override func layoutSublayers(of layer: CALayer) { open override func layoutSublayers(of layer: CALayer) {
super.layoutSublayers(of: layer) super.layoutSublayers(of: layer)
guard self.layer == layer else {
return
}
layoutShape() layoutShape()
} }
public override func layoutSubviews() { open override func layoutSubviews() {
super.layoutSubviews() super.layoutSubviews()
layoutShadowPath() layoutShadowPath()
placeholderLabel?.preferredMaxLayoutWidth = textContainer.size.width - textContainer.lineFragmentPadding * 2 placeholderLabel?.preferredMaxLayoutWidth = textContainer.size.width - textContainer.lineFragmentPadding * 2
...@@ -160,7 +162,7 @@ public class TextView: UITextView { ...@@ -160,7 +162,7 @@ public class TextView: UITextView {
} }
/// Reloads necessary components when the view has changed. /// Reloads necessary components when the view has changed.
internal func reloadView() { open func reload() {
if let p = placeholderLabel { if let p = placeholderLabel {
removeConstraints(constraints) removeConstraints(constraints)
layout(p).edges( layout(p).edges(
...@@ -173,13 +175,13 @@ public class TextView: UITextView { ...@@ -173,13 +175,13 @@ public class TextView: UITextView {
/// Notification handler for when text editing began. /// Notification handler for when text editing began.
@objc @objc
internal func handleTextViewTextDidBegin() { fileprivate func handleTextViewTextDidBegin() {
titleLabel?.textColor = titleLabelActiveColor titleLabel?.textColor = titleLabelActiveColor
} }
/// Notification handler for when text changed. /// Notification handler for when text changed.
@objc @objc
internal func handleTextViewTextDidChange() { fileprivate func handleTextViewTextDidChange() {
if let p = placeholderLabel { if let p = placeholderLabel {
p.isHidden = !(true == text?.isEmpty) p.isHidden = !(true == text?.isEmpty)
} }
...@@ -198,7 +200,7 @@ public class TextView: UITextView { ...@@ -198,7 +200,7 @@ public class TextView: UITextView {
/// Notification handler for when text editing ended. /// Notification handler for when text editing ended.
@objc @objc
internal func handleTextViewTextDidEnd() { fileprivate func handleTextViewTextDidEnd() {
guard let t = text else { guard let t = text else {
hideTitleLabel() hideTitleLabel()
return return
...@@ -220,31 +222,31 @@ public class TextView: UITextView { ...@@ -220,31 +222,31 @@ public class TextView: UITextView {
The super.prepare method should always be called immediately The super.prepare method should always be called immediately
when subclassing. when subclassing.
*/ */
public func prepare() { open func prepare() {
contentScaleFactor = Device.scale contentScaleFactor = Device.scale
textContainerInset = .zero textContainerInset = .zero
backgroundColor = .white backgroundColor = .white
clipsToBounds = false clipsToBounds = false
removeNotificationHandlers() removeNotificationHandlers()
prepareNotificationHandlers() prepareNotificationHandlers()
reloadView() reload()
} }
/// prepares the placeholderLabel property. /// prepares the placeholderLabel property.
private func preparePlaceholderLabel() { fileprivate func preparePlaceholderLabel() {
if let v: UILabel = placeholderLabel { if let v: UILabel = placeholderLabel {
v.font = font v.font = font
v.textAlignment = textAlignment v.textAlignment = textAlignment
v.numberOfLines = 0 v.numberOfLines = 0
v.backgroundColor = .clear v.backgroundColor = .clear
addSubview(v) addSubview(v)
reloadView() reload()
handleTextViewTextDidChange() handleTextViewTextDidChange()
} }
} }
/// Prepares the titleLabel property. /// Prepares the titleLabel property.
private func prepareTitleLabel() { fileprivate func prepareTitleLabel() {
if let v: UILabel = titleLabel { if let v: UILabel = titleLabel {
v.isHidden = true v.isHidden = true
addSubview(v) addSubview(v)
...@@ -259,7 +261,7 @@ public class TextView: UITextView { ...@@ -259,7 +261,7 @@ public class TextView: UITextView {
} }
/// Shows and animates the titleLabel property. /// Shows and animates the titleLabel property.
private func showTitleLabel() { fileprivate func showTitleLabel() {
if let v: UILabel = titleLabel { if let v: UILabel = titleLabel {
if v.isHidden { if v.isHidden {
if let s: String = placeholderLabel?.text { if let s: String = placeholderLabel?.text {
...@@ -279,7 +281,7 @@ public class TextView: UITextView { ...@@ -279,7 +281,7 @@ public class TextView: UITextView {
} }
/// Hides and animates the titleLabel property. /// Hides and animates the titleLabel property.
private func hideTitleLabel() { fileprivate func hideTitleLabel() {
if let v: UILabel = titleLabel { if let v: UILabel = titleLabel {
if !v.isHidden { if !v.isHidden {
UIView.animate(withDuration: 0.25, animations: { UIView.animate(withDuration: 0.25, animations: {
...@@ -293,7 +295,7 @@ public class TextView: UITextView { ...@@ -293,7 +295,7 @@ public class TextView: UITextView {
} }
/// Prepares the Notification handlers. /// Prepares the Notification handlers.
private func prepareNotificationHandlers() { fileprivate func prepareNotificationHandlers() {
let defaultCenter = NotificationCenter.default let defaultCenter = NotificationCenter.default
defaultCenter.addObserver(self, selector: #selector(handleTextViewTextDidBegin), name: NSNotification.Name.UITextViewTextDidBeginEditing, object: self) defaultCenter.addObserver(self, selector: #selector(handleTextViewTextDidBegin), name: NSNotification.Name.UITextViewTextDidBeginEditing, object: self)
defaultCenter.addObserver(self, selector: #selector(handleTextViewTextDidChange), name: NSNotification.Name.UITextViewTextDidChange, object: self) defaultCenter.addObserver(self, selector: #selector(handleTextViewTextDidChange), name: NSNotification.Name.UITextViewTextDidChange, object: self)
...@@ -301,7 +303,7 @@ public class TextView: UITextView { ...@@ -301,7 +303,7 @@ public class TextView: UITextView {
} }
/// Removes the Notification handlers. /// Removes the Notification handlers.
private func removeNotificationHandlers() { fileprivate func removeNotificationHandlers() {
let defaultCenter = NotificationCenter.default let defaultCenter = NotificationCenter.default
defaultCenter.removeObserver(self, name: NSNotification.Name.UITextViewTextDidBeginEditing, object: self) defaultCenter.removeObserver(self, name: NSNotification.Name.UITextViewTextDidBeginEditing, object: self)
defaultCenter.removeObserver(self, name: NSNotification.Name.UITextViewTextDidChange, object: self) defaultCenter.removeObserver(self, name: NSNotification.Name.UITextViewTextDidChange, object: self)
......
...@@ -83,16 +83,6 @@ open class Toolbar: Bar { ...@@ -83,16 +83,6 @@ open class Toolbar: Bar {
super.init(frame: frame) super.init(frame: frame)
} }
/**
A convenience initializer with parameter settings.
- Parameter leftViews: An Array of UIViews that go on the left side.
- Parameter rightViews: An Array of UIViews that go on the right side.
- Parameter centerViews: An Array of UIViews that go in the center.
*/
public override init(leftViews: [UIView]? = nil, rightViews: [UIView]? = nil, centerViews: [UIView]? = nil) {
super.init(leftViews: leftViews, rightViews: rightViews, centerViews: centerViews)
}
open override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { open override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard "titleLabel.textAlignment" == keyPath else { guard "titleLabel.textAlignment" == keyPath else {
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
......
...@@ -37,7 +37,7 @@ open class View: UIView { ...@@ -37,7 +37,7 @@ open class View: UIView {
allows the dropshadow effect on the backing layer, while clipping allows the dropshadow effect on the backing layer, while clipping
the image to a desired shape within the visualLayer. the image to a desired shape within the visualLayer.
*/ */
open private(set) lazy var visualLayer = CAShapeLayer() open fileprivate(set) lazy var visualLayer = CAShapeLayer()
/** /**
A property that manages an image for the visualLayer's contents A property that manages an image for the visualLayer's contents
...@@ -46,8 +46,15 @@ open class View: UIView { ...@@ -46,8 +46,15 @@ open class View: UIView {
*/ */
@IBInspectable @IBInspectable
open var image: UIImage? { open var image: UIImage? {
didSet { get {
visualLayer.contents = image?.cgImage guard let v = visualLayer.contents else {
return nil
}
return UIImage(cgImage: v as! CGImage)
}
set(value) {
visualLayer.contents = value?.cgImage
} }
} }
...@@ -98,7 +105,7 @@ open class View: UIView { ...@@ -98,7 +105,7 @@ open class View: UIView {
/// A Preset for the contentsGravity property. /// A Preset for the contentsGravity property.
@IBInspectable @IBInspectable
open var contentsGravityPreset: Gravity { open var contentsGravityPreset = Gravity.resize {
didSet { didSet {
contentsGravity = GravityToValue(gravity: contentsGravityPreset) contentsGravity = GravityToValue(gravity: contentsGravityPreset)
} }
...@@ -128,7 +135,6 @@ open class View: UIView { ...@@ -128,7 +135,6 @@ open class View: UIView {
- Parameter aDecoder: A NSCoder instance. - Parameter aDecoder: A NSCoder instance.
*/ */
public required init?(coder aDecoder: NSCoder) { public required init?(coder aDecoder: NSCoder) {
contentsGravityPreset = .resizeAspectFill
super.init(coder: aDecoder) super.init(coder: aDecoder)
prepare() prepare()
} }
...@@ -140,22 +146,18 @@ open class View: UIView { ...@@ -140,22 +146,18 @@ open class View: UIView {
- Parameter frame: A CGRect instance. - Parameter frame: A CGRect instance.
*/ */
public override init(frame: CGRect) { public override init(frame: CGRect) {
contentsGravityPreset = .resizeAspectFill
super.init(frame: frame) super.init(frame: frame)
prepare() prepare()
} }
/// A convenience initializer. /// Convenience initializer.
public convenience init() { public convenience init() {
self.init(frame: .zero) self.init(frame: .zero)
prepare()
} }
open override func layoutSublayers(of layer: CALayer) { open override func layoutSublayers(of layer: CALayer) {
super.layoutSublayers(of: layer) super.layoutSublayers(of: layer)
guard self.layer == layer else {
return
}
layoutShape() layoutShape()
layoutVisualLayer() layoutVisualLayer()
} }
...@@ -177,16 +179,20 @@ open class View: UIView { ...@@ -177,16 +179,20 @@ open class View: UIView {
backgroundColor = .white backgroundColor = .white
prepareVisualLayer() prepareVisualLayer()
} }
}
extension View {
/// Prepares the visualLayer property. /// Prepares the visualLayer property.
internal func prepareVisualLayer() { fileprivate func prepareVisualLayer() {
visualLayer.zPosition = 0 visualLayer.zPosition = 0
visualLayer.masksToBounds = true visualLayer.masksToBounds = true
layer.addSublayer(visualLayer) layer.addSublayer(visualLayer)
} }
}
extension View {
/// Manages the layout for the visualLayer property. /// Manages the layout for the visualLayer property.
internal func layoutVisualLayer() { fileprivate func layoutVisualLayer() {
visualLayer.frame = bounds visualLayer.frame = bounds
visualLayer.cornerRadius = cornerRadius visualLayer.cornerRadius = cornerRadius
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment