initial commits
							parent
							
								
									1fb978dd7e
								
							
						
					
					
						commit
						c9b67ed93d
					
				| 
						 | 
				
			
			@ -0,0 +1,44 @@
 | 
			
		|||
package toplabel
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"sourcecode.social/reiver/go-rfc2396/alpha"
 | 
			
		||||
	"sourcecode.social/reiver/go-rfc2396/alphanum"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Bytes(p []byte) (result []byte, rest []byte, ok bool) {
 | 
			
		||||
 | 
			
		||||
	length := len(p)
 | 
			
		||||
 | 
			
		||||
	if length < 1 {
 | 
			
		||||
		return nil, p, false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		p0 := p[0]
 | 
			
		||||
 | 
			
		||||
		if !alpha.ByteIs(p0) {
 | 
			
		||||
			return nil, p, false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		for i,b := range p {
 | 
			
		||||
			if !alphanum.ByteIs(b) && '-' != b {
 | 
			
		||||
 | 
			
		||||
				if !alphanum.ByteIs(p[i-1]) {
 | 
			
		||||
					return p[:i-1], p[i-1:], true
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				return p[:i], p[i:], true
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		if !alphanum.ByteIs(p[length-1]) {
 | 
			
		||||
			return p[:length-1], p[length-1:], true
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		return p, nil, true
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,463 @@
 | 
			
		|||
package toplabel_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"bytes"
 | 
			
		||||
 | 
			
		||||
	"sourcecode.social/reiver/go-rfc2396/toplabel"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestBytes(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	tests := []struct{
 | 
			
		||||
		Value []byte
 | 
			
		||||
		ExpectedResult []byte
 | 
			
		||||
		ExpectedRest []byte
 | 
			
		||||
		ExpectedOK bool
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			Value: nil,
 | 
			
		||||
			ExpectedResult: nil,
 | 
			
		||||
			ExpectedRest: nil,
 | 
			
		||||
			ExpectedOK: false,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value: []byte(nil),
 | 
			
		||||
			ExpectedResult: nil,
 | 
			
		||||
			ExpectedRest: nil,
 | 
			
		||||
			ExpectedOK: false,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			Value: []byte{},
 | 
			
		||||
			ExpectedResult: nil,
 | 
			
		||||
			ExpectedRest: nil,
 | 
			
		||||
			ExpectedOK: false,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value: []byte(""),
 | 
			
		||||
			ExpectedResult: nil,
 | 
			
		||||
			ExpectedRest: nil,
 | 
			
		||||
			ExpectedOK: false,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("com"),
 | 
			
		||||
			ExpectedResult: []byte("com"),
 | 
			
		||||
			ExpectedRest: nil,
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("com/"),
 | 
			
		||||
			ExpectedResult: []byte("com"),
 | 
			
		||||
			ExpectedRest:      []byte("/"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("com/once/twice/thrice/fource.php"),
 | 
			
		||||
			ExpectedResult: []byte("com"),
 | 
			
		||||
			ExpectedRest:      []byte("/once/twice/thrice/fource.php"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("com."),
 | 
			
		||||
			ExpectedResult: []byte("com"),
 | 
			
		||||
			ExpectedRest:      []byte("."),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("com./"),
 | 
			
		||||
			ExpectedResult: []byte("com"),
 | 
			
		||||
			ExpectedRest:      []byte("./"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("co"),
 | 
			
		||||
			ExpectedResult: []byte("co"),
 | 
			
		||||
			ExpectedRest: nil,
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("co/"),
 | 
			
		||||
			ExpectedResult: []byte("co"),
 | 
			
		||||
			ExpectedRest:     []byte("/"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("co/once/twice/thrice/fource.php"),
 | 
			
		||||
			ExpectedResult: []byte("co"),
 | 
			
		||||
			ExpectedRest:     []byte("/once/twice/thrice/fource.php"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("co."),
 | 
			
		||||
			ExpectedResult: []byte("co"),
 | 
			
		||||
			ExpectedRest:     []byte("."),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("co./"),
 | 
			
		||||
			ExpectedResult: []byte("co"),
 | 
			
		||||
			ExpectedRest:     []byte("./"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c"),
 | 
			
		||||
			ExpectedResult: []byte("c"),
 | 
			
		||||
			ExpectedRest: nil,
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c/"),
 | 
			
		||||
			ExpectedResult: []byte("c"),
 | 
			
		||||
			ExpectedRest:    []byte("/"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c/once/twice/thrice/fource.php"),
 | 
			
		||||
			ExpectedResult: []byte("c"),
 | 
			
		||||
			ExpectedRest:    []byte("/once/twice/thrice/fource.php"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c."),
 | 
			
		||||
			ExpectedResult: []byte("c"),
 | 
			
		||||
			ExpectedRest:    []byte("."),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c./"),
 | 
			
		||||
			ExpectedResult: []byte("c"),
 | 
			
		||||
			ExpectedRest:    []byte("./"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c-"),
 | 
			
		||||
			ExpectedResult: []byte("c"),
 | 
			
		||||
			ExpectedRest:    []byte("-"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c-/"),
 | 
			
		||||
			ExpectedResult: []byte("c"),
 | 
			
		||||
			ExpectedRest:    []byte("-/"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c-/once/twice/thrice/fource.php"),
 | 
			
		||||
			ExpectedResult: []byte("c"),
 | 
			
		||||
			ExpectedRest:    []byte("-/once/twice/thrice/fource.php"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c-."),
 | 
			
		||||
			ExpectedResult: []byte("c"),
 | 
			
		||||
			ExpectedRest:    []byte("-."),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c-./"),
 | 
			
		||||
			ExpectedResult: []byte("c"),
 | 
			
		||||
			ExpectedRest:    []byte("-./"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c1"),
 | 
			
		||||
			ExpectedResult: []byte("c1"),
 | 
			
		||||
			ExpectedRest: nil,
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c1/"),
 | 
			
		||||
			ExpectedResult: []byte("c1"),
 | 
			
		||||
			ExpectedRest:     []byte("/"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c1/once/twice/thrice/fource.php"),
 | 
			
		||||
			ExpectedResult: []byte("c1"),
 | 
			
		||||
			ExpectedRest:     []byte("/once/twice/thrice/fource.php"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c1."),
 | 
			
		||||
			ExpectedResult: []byte("c1"),
 | 
			
		||||
			ExpectedRest:     []byte("."),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c1./"),
 | 
			
		||||
			ExpectedResult: []byte("c1"),
 | 
			
		||||
			ExpectedRest:     []byte("./"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c-1"),
 | 
			
		||||
			ExpectedResult: []byte("c-1"),
 | 
			
		||||
			ExpectedRest: nil,
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c-1/"),
 | 
			
		||||
			ExpectedResult: []byte("c-1"),
 | 
			
		||||
			ExpectedRest:      []byte("/"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c-1/once/twice/thrice/fource.php"),
 | 
			
		||||
			ExpectedResult: []byte("c-1"),
 | 
			
		||||
			ExpectedRest:      []byte("/once/twice/thrice/fource.php"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c-1."),
 | 
			
		||||
			ExpectedResult: []byte("c-1"),
 | 
			
		||||
			ExpectedRest:      []byte("."),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c-1./"),
 | 
			
		||||
			ExpectedResult: []byte("c-1"),
 | 
			
		||||
			ExpectedRest:      []byte("./"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c1-"),
 | 
			
		||||
			ExpectedResult: []byte("c1"),
 | 
			
		||||
			ExpectedRest:     []byte("-"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c1-/"),
 | 
			
		||||
			ExpectedResult: []byte("c1"),
 | 
			
		||||
			ExpectedRest:     []byte("-/"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c1-/once/twice/thrice/fource.php"),
 | 
			
		||||
			ExpectedResult: []byte("c1"),
 | 
			
		||||
			ExpectedRest:     []byte("-/once/twice/thrice/fource.php"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c1-."),
 | 
			
		||||
			ExpectedResult: []byte("c1"),
 | 
			
		||||
			ExpectedRest:     []byte("-."),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Value:          []byte("c1-./"),
 | 
			
		||||
			ExpectedResult: []byte("c1"),
 | 
			
		||||
			ExpectedRest:     []byte("-./"),
 | 
			
		||||
			ExpectedOK: true,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for b0:=byte('a'); b0 <= 'z'; b0++ {
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			test := struct{
 | 
			
		||||
				Value []byte
 | 
			
		||||
				ExpectedResult []byte
 | 
			
		||||
				ExpectedRest []byte
 | 
			
		||||
				ExpectedOK bool
 | 
			
		||||
			}{
 | 
			
		||||
				Value:          []byte{b0},
 | 
			
		||||
				ExpectedResult: []byte{b0},
 | 
			
		||||
				ExpectedRest: nil,
 | 
			
		||||
				ExpectedOK: true,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			tests = append(tests, test)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for b1:=byte('0'); b1 <= '9'; b1++ {
 | 
			
		||||
 | 
			
		||||
			test := struct{
 | 
			
		||||
				Value []byte
 | 
			
		||||
				ExpectedResult []byte
 | 
			
		||||
				ExpectedRest []byte
 | 
			
		||||
				ExpectedOK bool
 | 
			
		||||
			}{
 | 
			
		||||
				Value:          []byte{b0,b1},
 | 
			
		||||
				ExpectedResult: []byte{b0,b1},
 | 
			
		||||
				ExpectedRest: nil,
 | 
			
		||||
				ExpectedOK: true,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			tests = append(tests, test)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for b1:=byte('A'); b1 <= 'Z'; b1++ {
 | 
			
		||||
 | 
			
		||||
			test := struct{
 | 
			
		||||
				Value []byte
 | 
			
		||||
				ExpectedResult []byte
 | 
			
		||||
				ExpectedRest []byte
 | 
			
		||||
				ExpectedOK bool
 | 
			
		||||
			}{
 | 
			
		||||
				Value:          []byte{b0,b1},
 | 
			
		||||
				ExpectedResult: []byte{b0,b1},
 | 
			
		||||
				ExpectedRest: nil,
 | 
			
		||||
				ExpectedOK: true,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			tests = append(tests, test)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for b1:=byte('a'); b1 <= 'z'; b1++ {
 | 
			
		||||
 | 
			
		||||
			test := struct{
 | 
			
		||||
				Value []byte
 | 
			
		||||
				ExpectedResult []byte
 | 
			
		||||
				ExpectedRest []byte
 | 
			
		||||
				ExpectedOK bool
 | 
			
		||||
			}{
 | 
			
		||||
				Value:          []byte{b0,b1},
 | 
			
		||||
				ExpectedResult: []byte{b0,b1},
 | 
			
		||||
				ExpectedRest: nil,
 | 
			
		||||
				ExpectedOK: true,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			tests = append(tests, test)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for b0:=byte('A'); b0 <= 'Z'; b0++ {
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			test := struct{
 | 
			
		||||
				Value []byte
 | 
			
		||||
				ExpectedResult []byte
 | 
			
		||||
				ExpectedRest []byte
 | 
			
		||||
				ExpectedOK bool
 | 
			
		||||
			}{
 | 
			
		||||
				Value:          []byte{b0},
 | 
			
		||||
				ExpectedResult: []byte{b0},
 | 
			
		||||
				ExpectedRest: nil,
 | 
			
		||||
				ExpectedOK: true,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			tests = append(tests, test)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for b1:=byte('0'); b1 <= '9'; b1++ {
 | 
			
		||||
 | 
			
		||||
			test := struct{
 | 
			
		||||
				Value []byte
 | 
			
		||||
				ExpectedResult []byte
 | 
			
		||||
				ExpectedRest []byte
 | 
			
		||||
				ExpectedOK bool
 | 
			
		||||
			}{
 | 
			
		||||
				Value:          []byte{b0,b1},
 | 
			
		||||
				ExpectedResult: []byte{b0,b1},
 | 
			
		||||
				ExpectedRest: nil,
 | 
			
		||||
				ExpectedOK: true,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			tests = append(tests, test)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for b1:=byte('A'); b1 <= 'Z'; b1++ {
 | 
			
		||||
 | 
			
		||||
			test := struct{
 | 
			
		||||
				Value []byte
 | 
			
		||||
				ExpectedResult []byte
 | 
			
		||||
				ExpectedRest []byte
 | 
			
		||||
				ExpectedOK bool
 | 
			
		||||
			}{
 | 
			
		||||
				Value:          []byte{b0,b1},
 | 
			
		||||
				ExpectedResult: []byte{b0,b1},
 | 
			
		||||
				ExpectedRest: nil,
 | 
			
		||||
				ExpectedOK: true,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			tests = append(tests, test)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for b1:=byte('a'); b1 <= 'z'; b1++ {
 | 
			
		||||
 | 
			
		||||
			test := struct{
 | 
			
		||||
				Value []byte
 | 
			
		||||
				ExpectedResult []byte
 | 
			
		||||
				ExpectedRest []byte
 | 
			
		||||
				ExpectedOK bool
 | 
			
		||||
			}{
 | 
			
		||||
				Value:          []byte{b0,b1},
 | 
			
		||||
				ExpectedResult: []byte{b0,b1},
 | 
			
		||||
				ExpectedRest: nil,
 | 
			
		||||
				ExpectedOK: true,
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			tests = append(tests, test)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for testNumber, test := range tests {
 | 
			
		||||
 | 
			
		||||
		actualResult, actualRest, actualOK := toplabel.Bytes(test.Value)
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			expected := test.ExpectedOK
 | 
			
		||||
			actual   := actualOK
 | 
			
		||||
 | 
			
		||||
			if expected != actual {
 | 
			
		||||
				t.Errorf("For test #%d, the actual ok-result is not what was expected.", testNumber)
 | 
			
		||||
				t.Logf("EXPECTED: %t", expected)
 | 
			
		||||
				t.Logf("ACTUAL:   %t", actual)
 | 
			
		||||
				t.Logf("VALUE: %q", test.Value)
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			expected := test.ExpectedResult
 | 
			
		||||
			actual   := actualResult
 | 
			
		||||
 | 
			
		||||
			if !bytes.Equal(expected, actual) {
 | 
			
		||||
				t.Errorf("For test #%d, the actual result is not what was expected.", testNumber)
 | 
			
		||||
				t.Logf("EXPECTED: %q (%#v)", expected, expected)
 | 
			
		||||
				t.Logf("ACTUAL:   %q (%#v)", actual, actual)
 | 
			
		||||
				t.Logf("VALUE: %q", test.Value)
 | 
			
		||||
				t.Logf("ACTUAL-REST: %q (%#v)", actualRest, actualRest)
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			expected := test.ExpectedRest
 | 
			
		||||
			actual   := actualRest
 | 
			
		||||
 | 
			
		||||
			if !bytes.Equal(expected, actual) {
 | 
			
		||||
				t.Errorf("For test #%d, the actual rest is not what was expected.", testNumber)
 | 
			
		||||
				t.Logf("EXPECTED: %q (%#v)", expected, expected)
 | 
			
		||||
				t.Logf("ACTUAL:   %q (%#v)", actual, actual)
 | 
			
		||||
				t.Logf("VALUE: %q", test.Value)
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue